机器学习—决策树算法的python实现
想要实现的效果
对于这个不好玩的决策树,我想要得到的就是通过决策树训练我的数据然后生成这棵决策树,再进行测试,把辣鸡数据输入得出最后的预测结果
先来看下结果
1.得到的辣鸡决策树
哇,调用graph模块竟然可直接生成如下的PDF图片诶
2.那随手在来张测试结果的截图吧
程序原理
这个什么鬼原理就是先将训练集的数据按age、spectacle-prescrip、astigmatism、tear-prod-rate、contact-lenses的分类提取特征数据,再转化为如下的numpy矩阵。其中age有三中数据故前三位数代表age,以此类推。接着两位数为astigmatism,再两位为spectacle-prescrip,再为ear-prod-rate,右边那3个就是代表contact-lenses。
这个总共有19行的数据蛮,就是代表有19组的数据(数据后面有的)
通过得到的上图就可以推断出各个数据所对应的代码,下图中把age下的三个数据代码写出来了,其他的蛮,emmmmm就留给你们了(假装不是因为我懒哈哈哈哈哈哈)
得到楼上辣个矩阵后直接调用python的决策树库函数构建决策树再生成一个决策树PDF就好了,哈哈
数据
以下这些乱七八糟的数据是隐形眼镜数据,属性特征为:
age:{young,pre-presbyopic,presbyopic};
年龄 {年轻的,老花眼前期,老花眼}
astigmatism:{no,yes}
散光 {否,是}
spectacle-prescrip:{myope,hypermetrope};
眼睛处方 {近视者,远视者}
tear-prod-rate {reduced, normal}
眼泪分泌率 {减少,正常}
contact-lenses {soft, hard, none}
隐形眼镜 {软性,硬性,不适合佩戴}
(我们最后就是要通过前面几个属性来预测这个孩子适合什么样的眼镜)
1.那就先给你看下训练集数据吧
number,age,spectacle-prescrip,astigmatism,tear-prod-rate,contact-lenses
1,young,myope,no,reduced,none
2,young,myope,no,normal,soft
3,young,myope,yes,reduced,none
4,young,myope,yes,normal,hard
5,young,hypermetrope,no,reduced,none
6,young,hypermetrope,no,normal,soft
7,young,hypermetrope,yes,reduced,none
8,young,hypermetrope,yes,normal,hard
9,pre-presbyopic,myope,no,reduced,none
10,pre-presbyopic,myope,no,normal,soft
11,pre-presbyopic,myope,yes,reduced,none
12,pre-presbyopic,myope,yes,normal,hard
13,pre-presbyopic,hypermetrope,no,reduced,none
14,pre-presbyopic,hypermetrope,no,normal,soft
15,pre-presbyopic,hypermetrope,yes,reduced,none
16,pre-presbyopic,hypermetrope,yes,normal,none
17,presbyopic,myope,no,reduced,none
18,presbyopic,myope,no,normal,none
19,presbyopic,myope,yes,reduced,none
2.在来个测试数据
young,hypermetrope,yes,normal,hard
pre-presbyopic,hypermetrope,yes,reduced,none
pre-presbyopic,hypermetrope,yes,normal,none
presbyopic,hypermetrope,yes,reduced,none
presbyopic,hypermetrope,yes,normal,none
完整代码(附有具体解析)
# pyinstaller -F agfd.py
import os
import csv
import sys
import pydotplus
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing
from sklearn import tree
#导入挖掘数据
film_data = open('film.csv','r')
reader = csv.reader(film_data)
headers = next(reader)
#展示数据内容
file = open('film.txt', 'r')
for line in file:
print(line,end="")
file.close()
#定义特征值数组,结果数组
feature_list = []
result_list = []
#按行循环
for row in reader:
#取结果 将每行最后一个添加到数组中
result_list.append(row[-1])
#取特征值 即除去序号和结果的中间部分其余留下,压缩两个数组为字典,添加到特征数组中
feature_list.append(dict(zip(headers[1:-1],row[1:-1])))
# print(result_list)
# print(feature_list)
#转化数据类型为numpy array
vec = DictVectorizer()
#进行标准化处理数据
featue1 = vec.fit_transform(feature_list)
result1 = preprocessing.LabelBinarizer().fit_transform(result_list)
# print(dummyX)
# print(dummyY)
#调用决策树,传入信息熵类型
clf = tree.DecisionTreeClassifier(criterion='entropy',random_state=0)
#用fit方法传入训练集及结果集
clf = clf.fit(featue1,result1)
os.environ["PATH"] += os.pathsep + 'D:/Graphviz/bin/'
#展示决策树
dot_data = tree.export_graphviz(clf,
feature_names=vec.get_feature_names(),
filled=True, rounded=True,
special_characters=True,
out_file=None)
from IPython.display import display, Image
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("film.pdf")
#测试数据,展示分类结果
age = input("age: ")
dct = {'young': '0,0,1', 'pre-presbyopic': '1,0,0', 'presbyopic': '0,1,0'}
age1 = dct[age]
# print(age1)
ast = input("astigmatism: ")
dct = {'no': '1,0', 'yes': '0,1'}
ast1 = dct[ast]
# print(ast1)
spe = input("spectacle-prescrip: ")
dct = {'myope': '0,1', 'hypermetrope': '1,0'}
spe1 = dct[spe]
# print(spe1)
tear = input("tear-prod-rate: ")
dct = {'reduce': '0,1', 'normal': '1,0'}
tear1 = dct[tear]
# print(tear1)
print("A=([[%s,%s,%s,%s]])" % (age1, ast1, spe1, tear1))
input("请将A值填入程序中的对应位置,填完后请输入'1'确认:")
A=([[0,0,1,0,1,1,0,1,0]])
predict_result = clf.predict(A)
if sum((predict_result==[[0,0,1.]])[0])==3:
predict_result = 'soft'
print('预测结果:' + predict_result)
if sum((predict_result==[[0,1,0.]])[0])==3:
predict_result = 'none'
print('预测结果:' + predict_result)
if sum((predict_result==[[1,0,0.]])[0])==3:
predict_result = 'hard'
print('预测结果:' + predict_result)
sys.exit()