決策樹是以樹狀結構表示資料分類的結果
非葉子結點代表測試的條件。
分支代表測試的結果
´1.資訊熵(informationentropy):是度量樣本集合純度最常用的一種指標。
2.基尼係數(gini):是度量樣本集合不確定性指標。(基尼指數與熵可近似看做是統一概念,都是越大,確定性越差)
基尼指數和資訊熵的影象:(當熵和基尼指數為0.5時,即確定某件事的概率為50%,是最不能肯定的事件。如:小明後天再路上撿錢的概率為50%,很不確定。如果概率為30%,代表很可能撿不到錢;如果概率為60%,則代表更可能撿到錢。)
乙個小栗子:
1.系統資訊熵:(是,否為好瓜的兩個屬性)
2.每個特徵的資訊熵:(以色澤為例)(先計算出3 個屬性的資訊熵,依次為:青綠,烏黑,淺白)
然後,結合3 個屬性,計算出特徵為色澤的資訊熵。
3.資訊增益:
資訊增益大,代表著熵小,所以確定性較高。
得出決策結果
但是,當我們使用id編號作為乙個特徵量的時候
´得到資訊熵:
´資訊增益為:
所以需要使用編號作為根節點嗎?顯然不可能。
(所以說:id3決策樹傾向於選擇屬性較多的特徵,當這個特徵不一定是最優的屬性特徵。同時,id3決策樹只能處理離散的屬性,對於連續的屬性,需要在 分類前對其進行離散化。)
因此,引入增益率:
求得iv(編號):
´=1/(17)*17*log2(1/(17))=4.08
´如果乙個特徵的取值越多,其iv(a)分母也越大。
決策樹常見演算法
id3演算法
c4.5演算法
cart演算法
結點選擇準則
資訊增益
資訊增益率
基尼係數
#使用id3決策樹**銷量的高低,基於資訊熵
import pandas as pd
filename = r'd:\datasets\sales_data.xls'
data = pd.read_excel(filename, index_col= u'序號') #將序號作為索引
data[data == u'好'] = 1 #使用1 表示『好』,是,高,3個屬性
data[data == u'是'] = 1
data[data == u'高'] = 1
data[data != 1] = -1
print(data.head())
# 序號 天氣 是否週末 是否有** 銷量
# 1 -1 1 1 1
# 2 -1 1 1 1
# 3 -1 1 1 1
# 4 -1 -1 1 1
# 5 -1 1 1 1
x = data.iloc[:,:3].as_matrix().astype(int) #將前3列作為輸入
y = data.iloc[:,3].as_matrix().astype(int)#最後列作為標籤
#建立決策樹
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(r'd:\datasets\tree.dot','w') as f:
f = export_graphviz(dtc, feature_names=x.columns, out_file=f)
安裝graphviz,顯示決策樹影象,可參考一篇部落格
進入windows命令列介面,cd 切換到tree.dot
所在的路徑,執行
可獲取影象:
決策樹的引數:
(criterion='gini', splitter='best', max_depth=none, min_samples_split=2,
min_samples_leaf=1,min_weight_fraction_leaf=0.0, max_features=none,
random_state=none, max_leaf_nodes=none, min_impurity_decrease=0.0,
min_impurity_split=none, class_weight=none, presort=false)
criterion
:特徵選擇的標準,有資訊增益和基尼係數兩種,使用資訊增益的是id3和c4.5演算法(使用資訊增益比),使用基尼係數的cart演算法,預設是gini係數。
splitter
:特徵切分點選擇標準,決策樹是遞迴地選擇最優切分點,spliter是用來指明在哪個集合上來遞迴,有「best」和「random」兩種引數可以選擇,best表示在所有特徵上遞迴,適用於資料集較小的時候,random表示隨機選擇一部分特徵進行遞迴,適用於資料集較大的時候。
max_depth
:決策樹最大深度,決策樹模型先對所有資料集進行切分,再在子資料集上繼續迴圈這個切分過程,max_depth可以理解成用來限制這個迴圈次數。
min_samples_split
:子資料集再切分需要的最小樣本量,預設是2,如果子資料樣本量小於2時,則不再進行下一步切分。如果資料量較小,使用預設值就可,如果資料量較大,為降低計算量,應該把這個值增大,即限制子資料集的切分次數。
min_samples_leaf
:葉節點(子資料集)最小樣本數,如果子資料集中的樣本數小於這個值,那麼該葉節點和其兄弟節點都會被剪枝(去掉),該值預設為1。
min_weight_fraction_leaf
:在葉節點處的所有輸入樣本權重總和的最小加權分數,如果不輸入則表示所有的葉節點的權重是一致的。
max_features
:特徵切分時考慮的最大特徵數量,預設是對所有特徵進行切分,也可以傳入int型別的值,表示具體的特徵個數;也可以是浮點數,則表示特徵個數的百分比;還可以是sqrt,表示總特徵數的平方根;也可以是log2,表示總特徵數的log個特徵。
random_state
:隨機種子的設定,與lr中引數一致。
max_leaf_nodes
:最大葉節點個數,即資料集切分成子資料集的最大個數。
min_impurity_decrease
:切分點不純度最小減少程度,如果某個結點的不純度減少小於這個值,那麼該切分點就會被移除。
min_impurity_split
:切分點最小不純度,用來限制資料集的繼續切分(決策樹的生成),如果某個節點的不純度(可以理解為分類錯誤率)小於這個閾值,那麼該點的資料將不再進行切分。
class_weight
:權重設定,主要是用於處理不平衡樣本,與lr模型中的引數一致,可以自定義類別權重,也可以直接使用balanced引數值進行不平衡樣本處理。
presort
:是否進行預排序,預設是false,所謂預排序就是提前對特徵進行排序,我們知道,決策樹分割資料集的依據是,優先按照資訊增益/基尼係數大的特徵來進行分割的,涉及的大小就需要比較,如果不進行預排序,則會在每次分割的時候需要重新把所有特徵進行計算比較一次,如果進行了預排序以後,則每次分割的時候,只需要拿排名靠前的特徵就可以了。
函式方法:
decision_path(x)
:返回x的決策路徑
fit(x, y)
:在資料集(x,y)上使用決策樹模型
get_params([deep])
:獲取模型的引數
predict(x)
:**資料值x的標籤
predict_log_proba(x)
:返回每個類別的概率值的對數
predict_proba(x)
:返回每個類別的概率值(有幾類就返回幾列值)
score(x,y)
:返回給定測試集和對應標籤的平均準確率
資料探勘 決策樹
分類是資料探勘的乙個非常重要的主題,現實中的很多問題都和分類密切相關。我們日常正是因為有了分類技巧,才能對不同的事物 場景採取不同的應對方式。資料分類可以看做是乙個兩步的過程。第一步是學習過程,我們根據所需要分析的問題和資料建立乙個分類器classifier。用我們選擇好的訓練元組對分類器進行訓練,...
資料探勘之決策樹
熟悉掌握決策樹的原理,熟練掌握決策樹的生成方法與過程 anaconda sklearn pydotplus 決策樹是乙個非引數的監督式學習方法,主要用於分類和回歸。演算法的目標是通過推斷資料特徵,學習決策規則從而建立乙個 目標變數的模型。from sklearn import tree x 0 0 ...
資料探勘之決策樹
決策樹是乙個非引數的監督式學習方法,主要用於分類和回歸。演算法的目標是通過推斷資料特徵,學習決策規則從而建立乙個 目標變數的模型。利用anaconda sklearn生成決策樹並利用決策樹進行 利用pydotplus來顯示 from sklearn import tree x 0 0 1,1 y 0...