資料探勘 決策樹

2022-07-19 10:24:13 字數 4160 閱讀 4462

決策樹是以樹狀結構表示資料分類的結果

非葉子結點代表測試的條件。

分支代表測試的結果

´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...