決策樹應用(一)


        上一篇講了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將決策樹進行了優化,優化的手段有“剪枝”等處理,這將會在后續文章,進行講解。
至此整個應用到此完畢,請讀者手動去實踐一下吧。

下一篇文章: 決策樹原理(二)
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM