目录
- 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
5vector_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
126import 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决策树优点
- 决策树易于理解和实现,人们在在学习过程中不需要使用者了解很多的背景知识,这同时是它的能够直接体现数据的特点,只要通过解释后都有能力去理解决策树所表达的意义。
- 对于决策树,数据的准备往往是简单或者是不必要的,而且能够同时处理数据型和常规型属性,在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
- 易于通过静态测试来对模型进行评测,可以测定模型可信度;如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。
6.2决策树缺点
- 对连续性的字段比较难预测。
- 对有时间顺序的数据,需要很多预处理的工作。
- 当类别太多时,错误可能就会增加的比较快。
- 一般的算法分类的时候,只是根据一个字段来分类。
最后
以上就是默默盼望最近收集整理的关于机器学习 之 决策树(Decision Tree)文本算法的精确率0、推荐1、背景2、效果图3、本次实验整体流程4、这里用词向量,而不是TF-IDF预处理后的向量5、源代码6、知识点普及的全部内容,更多相关机器学习内容请搜索靠谱客的其他文章。
发表评论 取消回复