上一篇講了ID3決策樹原理,現在開始拿一個例子進行實戰
一、python機器學習庫
scikit-learn。sklearn是一個Python第三方提供的非常強力的機器學習庫,它包含了從數據預處理到訓練模型的各個方面。在實戰使用scikit-learn中可以極大的節省我們編寫代碼的時間以及減少我們的代碼量,使我們有更多的精力去分析數據分布,調整模型和修改超參。sklearn基本包含了所有機器學習的方式,如
- Classification 分類,如SVM
- Regression 回歸 ,如LR
- Clustering 非監督分類,如聚類
- Dimensionality reduction 數據降維,如PCA
- Model Selection 模型選擇
- Preprocessing 數據預處理
sklearn包含了所有的機器學習算法,例如本文將用到sklearn中的ID3算法。
在python環境中可以通過 from sklearn.XXXX import XXXX的形式導入sklearn包,例如,本例要使用sklean中決策樹將以from sklearn import tree的形式在python環境中導入決策樹算法。
二、實戰演練
1、項目說明
本例數據將用上一篇文章電腦銷售數據,運用ID3決策樹的算法對數據進行分類,即用python編程,得到最終的決策樹,數據如下,我將數據放入excel表格里面,是為了方面python讀取數據。

2、數據預處理
這里要說明,sklearn提供的tree類,只接受數值型的數據,不接受文本數據,所以需要對數據進行預處理,在本例中需要對數據轉化成虛擬變量(dummy variable)。
(1)虛擬變量(dummy variable)
虛擬變量又稱虛設變量、名義變量或啞變量,用以反映質的屬性的一個人工變量,是量化了的質變量,通常取值為0或1,一般地,在虛擬變量的設置中:基礎類型、肯定類型取值為1;比較類型,否定類型取值為0。這些概念往往讓人看不懂,其實說白了就是將數據都變成1或者0,但具體怎么轉化?拿本例的age屬性來說,age有三個取值{youth,senior,middle_aged}現在將age的取值轉化為dummy variable,將youth轉化為[1,0,0] ,即1代表youth,后面兩個0代表senior和middle_aged,同理,將senior轉化為[0,1,0],將middle_aged轉化為[0,0,1]。再拿student屬性來說,student有兩個屬性{yes,no},現在將student的取值轉化為dummy variable,將yes轉化為[1,0],將no轉化為[0,1]。按照同樣的原理將整個表的數據都轉化成dummy variable。
在sklearn中有個DictVectorizer類可以直接將數據轉化為dummy variable,但DictVectorizer需要接受字典的形式,所以本次數據預處理的步驟有:
1、將數據轉為字典形式,如表中編號1數據,轉化為字典形式為:[{'age':'youth'},{'income':'high'},{'student':'no'},{'credit_rating':'fair'},{'buys'_computer:'no'}],同理其他數據也要轉化呈這種形式,最后將這些字典放在一個列表當中。
2、將上一步所得的列表傳入DictVectorizer中,將數據轉化為dummy variable。
(2)代碼實現預處理過程
1 import pandas as pd 2 3 data=pd.read_excel('./data/決策樹1.xls') 4 data=pd.DataFrame(data) 5 6 valuedata=data.values#表里面的數據 7 header=list(data.columns)[1:6]#表頭 8 9 featureList=[]#這個列表用於存放處理后得到的字典 10 labelList=data['Class_buys_computer']#存放表中Class_buys_computer屬性的數據 11 for value in valuedata: 12 featureDict={} 13 for i in range(4): 14 featureDict[header[i]]=value[i+1] 15 featureList.append(featureDict) 16
以上的代碼是將數據變成字典的過程,輸出的featureList為:

將得到的featureList傳送給sklearn中的DictVectorizer的對象,最后將數據轉化為dummy variable。
1 from sklearn.feature_extraction import DictVectorizer 2 from sklearn import preprocessing 3 4 vec=DictVectorizer() 5 dummyX=vec.fit_transform(featureList).toarray() 6 lb=preprocessing.LabelBinarizer() 7 dummyY=lb.fit_transform(labelList)
preprocessing是sklearn中的預處理模塊,而preprocessing.LabelBinarizer()是專門將標簽變量進行二值化,比如本例,將Class_buys_computer中的取值yes和no轉化為1和0
打印dummyX和dummyY的結果為:


3、建立決策樹
from sklearn import tree from sklearn.externals.six import StringIO clf=tree.DecisionTreeClassifier(criterion='entropy') clf=clf.fit(dummyX,dummyY)
在python環境中通過from sklearn import tree導入決策樹模塊,調用tree.DecisionTreefier()建立決策樹模型,在參數中criterion是選擇決策樹中的類型,
entropy代表信息熵,所以選擇ID3模型。再調用fit()函數對預處理得到的dummyX,和dummyY進行訓練。將得到的clf打印出來結果為:

可以看到,我們建立ID3決策樹的具體參數配置,具體參數的意義,可以自行查閱。現在需要對最后的模型進行可視化,決策樹的可視化需要另外安裝Graphviz環境,他的下載地址為
http://www.graphviz.org/,下載安裝完后,需要加入環境變量,具體下載安裝過程網上有很多。這里不再贅述。
with open("allElectronicsInformationGainOri.dot",'w') as f: f=tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file=f)
它會在本目錄下生成一個叫,allElecrionInformationGainOri.dot文件,里面的內容為:

這種dot文件都是文字敘述,看起來有點亂,但Graphviz可以將dot文件轉化為pdf格式,內容為最后的決策樹形狀
但需要執行一個命令,就是先打開windows的命令窗口, 轉化dot文件至pdf可視化決策樹語句:dot -Tpdf iris.dot -o outpu.pdf,再本目錄里面會得到一個pdf文件
里面是最終的決策樹:

這個決策樹跟我們手工算出得出的形狀不太一樣,這是sklearn將決策樹進行了優化,優化的手段有“剪枝”等處理,這將會在后續文章,進行講解。
至此整個應用到此完畢,請讀者手動去實踐一下吧。
下一篇文章: 決策樹原理(二)
