机器学习第一个算法决策树(DecisionTree)

来源:互联网 发布:银河历险记3mac破解版 编辑:程序博客网 时间:2024/05/20 07:34

开始认真学习机器学习相关的内容,看到了一个非常好的教学视频(麦子学院,彭亮老师讲的课),基本上是一节一节视频跟着来学习的。

这里写图片描述

机器学习主要目标是根据已有的属性,得到未知的结论,或者说预测,而能预测的前提是已经积累了很多的经验,等等类似的说法。从基本的监督学习,非监督学习,半监督学习,训练集,测试集等概念讲起,视频非常棒。

第一个介绍的算法是DecisionTree:

这里写图片描述

通过将数据模型转化为一个一个节点,满足条件即往下走的思路,走到最后就需要做出决策,这样一种算法称之为决策树。
简单的有比如,考虑西瓜甜不甜,我们可以将目标设置为甜还是不甜,即是0还是1。一般我们可以根据瓜蒂,声音,颜色等外在属性对西瓜进行预测。
假设瓜蒂有生、熟之分,声音有清脆、浑浊之分,颜色有深绿,浅绿,泛白之分。每一种属性我们都可以用0,1,来表示,主要是因为做数据处理之前需要将描述语言进行这样的数据处理。

瓜蒂生:0
瓜蒂熟:1
清脆:1
浑浊:0
深绿:1
浅绿:0
泛白:0
这样一组[0,1,10,1,0,0]的数据就可以表示瓜蒂熟,声音清脆,颜色深绿的西瓜,如果西瓜甜,则相当于结果是1。绍完基本思路之后,我们就开始用python做初步的demo。

先看 代码:

from sklearn.feature_extraction import DictVectorizer  #字典转换import csv                                             #读取csv数据from sklearn import preprocessing                     #sklearn的一些类from sklearn import tree                                 from sklearn.externals.six import StringIO               #读取csv文件,2.x和3.x在next()方法上有差别,2.x的时候open用('rb')reader.nest()#我用的是3.6,所以有一些改变,除了一问题在csv的读取上。try:    filename = r'data3.csv'            allElectronicsData = open(filename,'rt')    reader = csv.reader(allElectronicsData)    headers = next(reader)              #第一行的数据    #for index, column_header in enumerate(headers):        #print(index, column_header)    #print(headers)  #第一行   except:    print("失败")#处理数据featureList = []       #python 列表,强大的数组labelList = []for row in reader:     #reader 内容里有14行    #len(row) = 6    labelList.append(row[len(row)-1]) #标签的最后一列row[0]~row[5]    rowDict = {}  #创建字典    for i in range(1,len(row)-1):     #从1到4        rowDict[headers[i]] = row[i]  #字典的头和内容配对    featureList.append(rowDict)    #print(featureList)#########以上是把数据从csv里读出来生成一一对应的字典##################以下就是将字典转成我们所需要的数据结构###############vec = DictVectorizer()dummyX = vec.fit_transform(featureList).toarray()print("dummyX:"+str(dummyX))print(vec.get_feature_names())#名字的对应关系#'age=middle_aged', 'age=senior', 'age=young', #'credit_rating=excellent', 'credit_rating=fair',#'income=high','income=low', 'income=medium',#'student=no', 'student=yes'#单独转结论的数据结构lb = preprocessing.LabelBinarizer()dummyY = lb.fit_transform(labelList)#print("dummyY:"+str(dummY))######################################entropy =>ID3#树形分类用很多种方法,我们用的是熵来判断,在代码里就是参数的不同clf = tree.DecisionTreeClassifier(criterion = 'entropy')  clf = clf.fit(dummyX,dummyY)#print('clf:'+str(clf))#将决策树描述在了.dot上with open("resultTree.dot",'w')as f:    f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(),out_file = f)# 验证决策oneRowX = dummyX[0,:]print("oneRowX: "+str(oneRowX))#用新的数据来测试newRowX = oneRowXnewRowX[0] = 0   newRowX[1] = 1     #老年人  age=senior   newRowX[2] = 0newRowX[3] = 1     #信用好 credit_rating=excellent newRowX[4] = 0newRowX[5] = 0newRowX[6] = 0newRowX[7] = 1  #收入中等newRowX[8] = 1  #不是学生newRowX[9] = 0print("newRowX"+str(newRowX))newRowX = newRowX.reshape(1, -1)  #it contains a single sample.predictedY = clf.predict(newRowX)print("predictedY: "+ str(predictedY))

csv里的数据如图:

这里写图片描述

以上便是csv的数据,我先是在excel里打的,在把后缀改成csv,在读取的时候一直有问题,怎么都不行,后来我用txt写了一遍再改后缀,就可以了。

生成.dot文件之后,打开一开和想象的树状图差别很大,视频里介绍了怎么用graphviz来将dot转成pdf的树状图的方法,先在官网上下载,点击msi
这里写图片描述
之后双击安装即可,需要记住安装路径,将下图所示的.bin路径添加到环境变量path里。
这里写图片描述
好了之后即可在cmd里验证:输入dot -version即可
这里写图片描述
之后就是一个转换的代码输入:

dot -Tpdf src.dot -o des.pdf

src.dot表示的是带路径的.dot文件
des.pdf表示的是生成的.pdf文件,最好也带个路径

如我的,在cmd里直接输入:

dot -Tpdf D:\MLearning\Decisiontree\resultTree.dot -o D:\MLearning\Decisiontree\test.pdf 

csv数据下载连接:
csv数据