利用決策樹 ID3 演算法進行預測
決策樹:
決策樹方法在分類、預測、規則提取等領域被廣泛應用
決策樹是樹狀結構,它的每一個節點對應著一個分類,非葉節點對應著在某個屬性上的劃分,根據樣本在該屬性上的不同取值將其劃分城若干個子集。
構造決策樹的核心問題是在每一步如何選擇適當的屬性對樣本做拆分。
對一個分類問題,從一直分類標價的訓練樣本中學習並構造出決策樹是一個自上而下,分而治之的過程。
ID3演算法:
基於資訊熵來選擇最佳測試屬性。在每個非葉節點選擇資訊增益最大的屬性作為測試屬性,使分類後資料集的熵最小,從而得到較小的決策樹(樹的平均深度較小,從而提高分類效率)。
資訊熵越小,資訊增益越大,不確定性越小
Note:該演算法只能處理離散屬性,對於連續性的屬性,在分類前需要對其進行離散化
- ID3演算法實現步驟:
- 對當前樣本集合計算所有屬性的資訊增益;
- 選擇資訊增益最大的屬性作為測試屬性,把測試屬性取值相同的樣本劃為同一個子樣本集;
- 若子樣本集的類倍數行只包含單個屬性,則分支為椰子節點,判斷其屬性值並標上相應的符號,然後返回呼叫處; 否則對子樣本集遞迴呼叫本演算法。
例項:
import pandas as pd filename='../file/salesdata.xls' data=pd.read_excel(filename,index_col=u'序號') #將類別轉換為資料:用1來表示‘好、是、高’,-1表示‘壞、否、低’ data[data==u'好']=1 data[data==u'是']=1 data[data==u'高']=1 data[data!=1]=-1 x=data.iloc[:,:3].as_matrix().astype(int) #選取[0,3)列的所有資料 y=data.iloc[:,3].as_matrix().astype(int) #選取弟3列的所有資料 from sklearn.tree import DecisionTreeClassifier as DTC dtc=DTC(criterion='entropy') #基於資訊熵建立決策樹模型 dtc.fit(x,y) #訓練模型 from sklearn.tree import export_graphviz from sklearn.externals.six import StringIO x=pd.DataFrame(x)
with open("tree.dot",'w') as f:
f=export_graphviz(dtc,feature_names=x_columns,out_file=f) #匯出一個dot檔案,需要安裝 Graphviz 將它轉換為 pdf 或 png 格式
後續操作:
為將以上例項的輸出結果轉換為視覺化格式,需要安裝 Graphviz。安裝完成後,在 dot.exe 目錄下開啟 Windows 命令列視窗,執行以下語句:
dot -Tpdf tree.dot -o tree.pdf
Scikit_Learn API :
Methods:
sklearn.tree.DecisionTreeClassifier #決策樹分類器
Parameters:
criterion: The function to measure the quality of a split. Supported criteria are “gini” for the Gini impurity and “entropy” for the information gain
標準:用於衡量分類質量。預設值為 ‘gini’ 。基尼不純度方法時的使用值 ‘gini’ (基尼); 資訊增益方法時的使用值 ‘entropy’ (熵)
Methods:
fit (X, y[, sample_weight, check_input, …]) | Build a decision tree classifier from the training set (X, y). |
Build a decision tree classifier from the training set (X, y). 使用訓練樣本訓練決策樹分類器模型
Parameters:
x:array-like or sparse matrix, Training input samples; y: array-like, Target values as int or string.
sample_weight:樣本權重,預設權重相等
Returns:
self: object 返回物件
Methods:
sklearn.tree.export_graphviz #生成決策樹的 Graphviz 表示
輸出一個 DOT 格式的決策樹
Parameters:
decision tree: 決策樹分類器,決策樹輸出到 Graphviz
out_file: file object or string, 輸出檔案的型別或物件。預設值:“tree.dot”
max_depth: 可選項,int。預設值:default=None。輸出的最大深度,如果值是None, 則全部輸出。
feature_names: 可選項,list of strings 字串列表。 預設值:default=None。Names of each of the features.節點名稱
Returns:dot_data: string. String representation of the input tree in GraphViz dot format. Only returned if out_file
is None.
參考連結:
http://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html#sklearn.tree.export_graphviz點選開啟連結
http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier
Note: 本文部分理論和示例總結自《Python 資料分析與挖掘實戰》。