我是靠谱客的博主 默默盼望,这篇文章主要介绍机器学习 之 决策树(Decision Tree)文本算法的精确率0、推荐1、背景2、效果图3、本次实验整体流程4、这里用词向量,而不是TF-IDF预处理后的向量5、源代码6、知识点普及,现在分享给大家,希望可以做个参考。

目录

  • 0、推荐
  • 1、背景
  • 2、效果图
  • 3、本次实验整体流程
  • 4、这里用词向量,而不是TF-IDF预处理后的向量
  • 5、源代码
  • 6、知识点普及
    • 6.1决策树优点
    • 6.2决策树缺点

0、推荐

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

1、背景

最近的项目中,用到了很多机器学习的算法,每个机器学习的算法在不同的样本下的精准率是不同的。为了验证每个算法在每种不同样本数量的能力,就做了一下实验,本文讲的是决策树在文本算法中的精准率。

相关其它机器学习算法的精准率:
逻辑回归:机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率
支持向量机:机器学习 之 支持向量机(SupportVectorMachine)文本算法的精确率
K近邻:机器学习 之 K近邻(K-NearestNeighbor)文本算法的精确率
朴素贝叶斯:机器学习 之 朴素贝叶斯(Naive Bayesian Model)文本算法的精确率
随机森林:机器学习 之 随机森林(Random Forest)文本算法的精确率

机器学习各个算法对比:人工智能 之 机器学习常用算法总结 及 各个常用分类算法精确率对比

2、效果图

先看一下没有任何调参的情况下的效果吧!
在这里插入图片描述
通过以上数据可以看出决策树在样本数量较低的情况下还不错,在样本数量在5000的时候效果还可以,但是到达20000的时候,准确率已经在70%左右了。

3、本次实验整体流程

1、先把整体样本读到内存中

2、把整体样本按照8:2的比例,分为80%的训练集,20%的测试集

3、然后“训练集”的样本 先分词,再转换为词向量

4、接着把训练集的样本和标签统一的传入 “决策树”的算法中,得到拟合后的模型

5、把“测试集”的样本 先分词,再得到词向量

6、把测试集得出的词向量丢到拟合后的模型中,看得出的结果

7、把结果转换为准确率的形式,最后做成表格形式以便观看

这里应该多跑几遍不同样本,然后把结果取平均值,每次的结果还是稍有不同的。

4、这里用词向量,而不是TF-IDF预处理后的向量

这里我们直接取得词向量,而不是经过TF-IDF处理过的词向量。如果处理过,效果会不如现在的好。

TF-IDF(词频-逆文本频率),前面的TF也就是常说到的词频,我们之前做的向量化也就是做了文本中各个词的出现频率统计,并作为文本特征,这个很好理解。关键是后面的这个IDF,即“逆文本频率”如何理解。有些句子中的词,比如说“的”,几乎所有句子都会出现,词频虽然高,但是重要性却应该比 主语、宾语等低。IDF就是来帮助我们来反应这个词的重要性的,进而修正仅仅用词频表示的词特征值。
概括来讲, IDF反应了一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低

加了TF-IDF处理后的效果:
在这里插入图片描述

经过TF-IDF处理后的效果比不处理效果还差。所以,这里就不经过TF-IDF处理了哈。
以下源码中,如果加TF-IDF处理,只需要在jiabaToVector()函数中增加True这个参数就OK了

复制代码
1
2
3
4
5
vector_train = jiabaToVector(m_text_train, False, True) ... ... vector_test = jiabaToVector(m_text_test, True, True)

5、源代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import jieba import datetime # 向量测试集训练集得分比对 from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics import accuracy_score #决策树 from sklearn import tree m_count = [1000,3000,5000,8000,10000,15000,20000] # all m_list_allText = [] m_list_allL4ID = [] # 内容的训练集、测试集 m_text_test = [] m_text_train = [] m_label_test = [] m_label_train = [] m_map_all = [] # 读取文件里面数据,获取标签和内容 def getFile(filename, count): with open(filename, 'r' ,encoding='utf-8') as fp: global m_list_allL4ID,m_list_allText m_list_allL4ID = [] m_list_allText = [] for i in range(count): text = fp.readline() if ":" in text: L4ID = text.split(":")[-2] Msg = text.split(":")[-1] m_list_allL4ID.append(L4ID) m_list_allText.append(Msg) # 随机分为 测试集 和 训练集 2-8分 def randomTestAndTrain(): # 生成训练集和测试集 global m_text_test, m_text_train, m_label_test, m_label_train m_text_train, m_text_test, m_label_train, m_label_test = train_test_split(m_list_allText, m_list_allL4ID, test_size=0.2, random_state=1) def jiabaToVector(list, isTest, isTFIDF = False): tmp_list = [] for sentence in list: tmp_list.append(" ".join(jieba.cut(sentence.strip()))) # 利用TFIDF生成词向量 transformer = TfidfTransformer() if isTest: if isTFIDF: tfidf = transformer.fit_transform(vectorizer.transform(tmp_list)) else: tfidf = vectorizer.transform(tmp_list) else: if isTFIDF: tfidf = transformer.fit_transform(vectorizer.fit_transform(tmp_list)) else: tfidf = vectorizer.fit_transform(tmp_list) return tfidf # 创建默认参数的决策树 def predict_4(X, Y): clf = tree.DecisionTreeClassifier() clf = clf.fit(X, Y) return clf def test(count): # getFile("./rg_test.train", count) getFile("./rg_train_20190102_20181227114134.train", count) # print("获取全部已知数据的label和text") # 随机分为 测试集 和 训练集 2-8分 randomTestAndTrain() global vectorizer # 全局向量 vectorizer = CountVectorizer() # 生成训练向量 vector_train = jiabaToVector(m_text_train, False) # 数据大小 lenall = len(m_list_allText) # print("总集大小:", lenall) print("总集大小:", lenall) # 训练 startT_Train = datetime.datetime.now() clf = predict_4(vector_train, m_label_train) endT_Train = datetime.datetime.now() print("训练Time:", (endT_Train - startT_Train).microseconds) # 生成测试向量 vector_test = jiabaToVector(m_text_test, True) # 测试 startT = datetime.datetime.now() result = clf.predict(vector_test) endT = datetime.datetime.now() print("测试Time:", (endT - startT).microseconds) # 计算百分比 percent = accuracy_score(result, m_label_test) print("准确率:", round(percent, 3)) map_all = {} map_all["精确率"]=round(percent, 3) map_all["数据量"]=lenall map_all["训练时间/us"]=(endT_Train - startT_Train).microseconds map_all["测试时间/us"]=(endT - startT).microseconds m_map_all.append(map_all) if __name__ =="__main__": print ("-- 开始 --") for testC in m_count: test(testC) print ("-- 结束 --") # 打印表格 print("数据量t准确度t训练时间/ust测试时间/us") for key in m_map_all: print("%dt%ft%dt%d"%(key["数据量"],key["精确率"],key["训练时间/us"],key["测试时间/us"]))

6、知识点普及

6.1决策树优点

  1. 决策树易于理解和实现,人们在在学习过程中不需要使用者了解很多的背景知识,这同时是它的能够直接体现数据的特点,只要通过解释后都有能力去理解决策树所表达的意义。
  2. 对于决策树,数据的准备往往是简单或者是不必要的,而且能够同时处理数据型和常规型属性,在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
  3. 易于通过静态测试来对模型进行评测,可以测定模型可信度;如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。

6.2决策树缺点

  1. 对连续性的字段比较难预测。
  2. 对有时间顺序的数据,需要很多预处理的工作。
  3. 当类别太多时,错误可能就会增加的比较快。
  4. 一般的算法分类的时候,只是根据一个字段来分类。

最后

以上就是默默盼望最近收集整理的关于机器学习 之 决策树(Decision Tree)文本算法的精确率0、推荐1、背景2、效果图3、本次实验整体流程4、这里用词向量,而不是TF-IDF预处理后的向量5、源代码6、知识点普及的全部内容,更多相关机器学习内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部