Python机器学习决策树应用

您所在的位置:网站首页 python决策树例题经典案例 Python机器学习决策树应用

Python机器学习决策树应用

#Python机器学习决策树应用 | 来源: 网络整理| 查看: 265

1、环境搭建

Python在数据挖掘方面有很多的库,如果我们自己去挨个安装可能会耗费比较长的时间,所以这里介绍一个比较好用的工具Anaconda,可以直百度搜索下载安装,里面集成很多已经安装好的需要用到的库,它有2.7和3.6的版本,也有32和64的,我用的是2.7+32的版本,我的建议是32位的,兼容性比较好。

同时,我们还需要安装一个将决策树的dot文件装换为pdf视图的工具,便于后期的查看决策时的样子。我们下载安装Graphviz:http://www.graphviz.org/,然后配置好环境变量,使用命令dot -T pdf [dot文件] -o [输出文件] 就可以将dot文件转换为可视化的pdf文件。

2、Python使用决策树

在Python中,决策树算法是不需要我们来进行编写的,在scikit-learn包中已经包含了这个算法,我们只要负责调用就好。建议大家在学习机器学期之前去看一下numpy, SciPy和matplotlib这几个工具的使用,尤其是numpy是非常重要的科学计算工具。

下面我们看之前我们之前的买电脑的例子。

Python机器学习决策树应用

我在一个data.csv文件中有15个实例数据。当然,数据比较少,我们就做个简答的测试,构造一个决策树来预测某人是否买电脑。

首先我们导入一些我们可能用到的库

12345 #coding:utf8from sklearn.feature_extraction import DictVectorizerimport csvfrom sklearn import preprocessing, metricsfrom sklearn import tree

读取data.csv中的数据

12345678 #读取数据集#将数据存到readeralls = open(r"./data/data.csv")#将数据存到readerreader = csv.reader(alls) #第一行数据,也就是头  headers = reader.next()     print (headers)

到此我们已经拿到数据了,但是,这些数据我们是不能直接使用的,因为计算机是不认识字符的,它只认识数字,所以,我们要把字符串转换成数组,这里怎么装换呢?比如,我们把age分为了三类,youth、middle_aged和senior三类,比如第一条数据是youth,name就装换为1 0 0 。当然还有另外的转换方法。也可以使用1 2 3来分别表示三类数据,下面我们使用sklearn自带的工具装换,它就使用的第一种转换方式,youth = 1 0 0 ,ok,下面看代码

首先我们建立两个列表,来分别存储特征向量和标记。

12345678910 featureList = [] #save feature DictlabelList = []  #save labelfor row in reader:        #将每一行的label标记存到labelList        labelList.append(row[len(row) - 1])        rowDict = {}        for i in range(1, len(row)-1):            rowDict[headers[i]] = row[i]        #将每一行的特征向量存到featureList        featureList.append(rowDict)

转换数据集

1234567891011 #将数据集装换为0和1的格式vec = DictVectorizer()#对特征向量进行转换dummyX = vec.fit_transform(featureList).toarray()print (dummyX)print (vec.get_feature_names()) #对标记进行转换lb = preprocessing.LabelBinarizer()dummyY = lb.fit_transform(labelList)print ("labelList:" + str(dummyX))

ok,到此为止我们的数据已经准好了,下面就可以开始训练数据,然后建立模型了。

建立决策树模型,方法非常简单,直接调用函数即可。

123456789 clf = tree.DecisionTreeClassifier(criterion='entropy')  #entropy 使用信息熵clf = clf.fit(dummyX, dummyY)    #建模print ("clf:\n" + str(clf)) #save clf to dotwith open("./data/all.dot","w") as f:    f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)#查看特征重要程度print clf.feature_importances_

上面的的代码执行之后决策树模型就建立好了,并且已经保存在了all.dot文件上了。我们可以看一下建立之后的决策树,使用之前下载好的工具,使用命令dot -T pdf all.dot -o out.pdf 执行完之后会在目录下面生成out.pdf,我们打开看一下。

Python机器学习决策树应用

模型我们已经建立好了,我们怎么来进行预测呢,我们接着看下面。

123456789 #获取一个实例,进行部分的修改oneRowX = dummyX[0]newRowX = oneRowXnewRowX[0] = 1newRowX[2] = 0#开始预测test_res = clf.predict(newRowX)#打印预测结果print test_res

下面我们看一下模型预测的正确率,因为数据比较少,我们就将全部的训练集放进去预测,然后将结果与正确结果对比,看正确率。

123456 #进行正确率评测predictedY = clf.predict(dummyX)print predictedY#参数:正确的结果,测试结果,显示正确率还是个数score = metrics.accuracy_score(dummyY, predictedY, True)print (score)   #打印测试成绩

到此为止,基本的决策树应用就算完成了,其实在建模那有一些参数是需要调整的,要根据正确率,不断地进行调整,如果特征值比较多的话还有可能牵扯到降维,就比较复杂了,这里就不写了。

下面贴一下完整的代码

3、完整代码

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 #coding:utf8from sklearn.feature_extraction import DictVectorizerimport csvfrom sklearn import preprocessing, metricsfrom sklearn import tree #读取数据集alls = open(r"./data/data.csv")reader = csv.reader(alls)   #将数据存到readerheaders = reader.next()     #第一行数据,也就是头print (headers) featureList = [] #save feature DictlabelList = []  #save label for row in reader:        #将每一行的label标记存到labelList        labelList.append(row[len(row) - 1])        rowDict = {}        for i in range(1, len(row)-1):            rowDict[headers[i]] = row[i]        #将每一行的特征向量存到featureList        featureList.append(rowDict) #将数据集装换为0和1的格式vec = DictVectorizer()#对特征向量进行转换dummyX = vec.fit_transform(featureList).toarray()print (dummyX)print (vec.get_feature_names()) #对标记进行转换lb = preprocessing.LabelBinarizer()dummyY = lb.fit_transform(labelList)print ("labelList:" + str(dummyX)) clf = tree.DecisionTreeClassifier(criterion='entropy')  #entropy 使用信息熵clf = clf.fit(dummyX, dummyY)    #建模print ("clf:\n" + str(clf)) #save clf to dotwith open("./data/all.dot","w") as f:    f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)#查看特征重要程度print clf.feature_importances_'''#保存和加载模型joblib.dump(clf, './data/ss.m')ss = joblib.load('./data/ss.m')print ss''' #获取一个实例,进行部分的修改oneRowX = dummyX[0]newRowX = oneRowXnewRowX[0] = 1newRowX[2] = 0#开始预测test_res = clf.predict(newRowX)#打印预测结果print test_res #进行正确率评测predictedY = clf.predict(dummyX)print predictedY#参数:正确的结果,测试结果,显示正确率还是个数score = metrics.accuracy_score(dummyY, predictedY, True)print (score)   #打印测试成绩######################花的测试集##############################print ("####################################################")from sklearn.datasets import load_iris iris = load_iris()print iris#分割数据0.1的测试数据,0.9的训练数据from sklearn.cross_validation import train_test_splittrain_data, test_data, train_target, test_target = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0) #随机种子print test_target#建模clf2 = tree.DecisionTreeClassifier(criterion='entropy')clf2.fit(train_data,train_target)#模型评测y_pre = clf2.predict(test_data)print ("y_pre:" + str(y_pre))print (metrics.accuracy_score(test_target, y_pre, True))print clf2.feature_importances_'''with open("data/iris.dot", "w") as f:    tree.export_graphviz(clf, out_file=f)'''print clf2print clf2.classes_

上面的代码从61行开始还做了另外的一个测试,使用了sklearn自带的一个数据集进行的预测,就不讲了,基本原理是一样的,大家自己看把。

收 藏


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3