西瓜决策树-sklearn实现
文章目錄
- sklearn實現(xiàn)ID3、CART算法實現(xiàn)
- 一、引包
- 二、讀取數(shù)據(jù)
- 三、數(shù)據(jù)編碼
- 四、ID3擬合
- ID3算法
- DecisionTreeClassifier參數(shù)說明
- sklearn擬合代碼
- 五、CART擬合
- CART算法
- 基尼指數(shù):
- 六、參考
sklearn實現(xiàn)ID3、CART算法實現(xiàn)
一、引包
import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.tree import DecisionTreeClassifier二、讀取數(shù)據(jù)
data = pd.read_csv('./西瓜數(shù)據(jù)集.csv') data| 青綠 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
| 烏黑 | 蜷縮 | 沉悶 | 清晰 | 凹陷 | 硬滑 | 是 |
| 烏黑 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
| 青綠 | 蜷縮 | 沉悶 | 清晰 | 凹陷 | 硬滑 | 是 |
| 淺白 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
| 青綠 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 軟粘 | 是 |
| 烏黑 | 稍蜷 | 濁響 | 稍糊 | 稍凹 | 軟粘 | 是 |
| 烏黑 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 硬滑 | 是 |
| 烏黑 | 稍蜷 | 沉悶 | 稍糊 | 稍凹 | 硬滑 | 否 |
| 青綠 | 硬挺 | 清脆 | 清晰 | 平坦 | 軟粘 | 否 |
| 淺白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
| 淺白 | 蜷縮 | 濁響 | 模糊 | 平坦 | 軟粘 | 否 |
| 青綠 | 稍蜷 | 濁響 | 稍糊 | 凹陷 | 硬滑 | 否 |
| 淺白 | 稍蜷 | 沉悶 | 稍糊 | 凹陷 | 硬滑 | 否 |
| 烏黑 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 軟粘 | 否 |
| 淺白 | 蜷縮 | 濁響 | 模糊 | 平坦 | 硬滑 | 否 |
| 青綠 | 蜷縮 | 沉悶 | 稍糊 | 稍凹 | 硬滑 | 否 |
三、數(shù)據(jù)編碼
#創(chuàng)建LabelEncoder()對象,用于序列化 label = LabelEncoder() #為每一列序列化 for col in data[data.columns[:-1]]:data[col] = label.fit_transform(data[col]) data| 2 | 2 | 1 | 1 | 0 | 0 | 是 |
| 0 | 2 | 0 | 1 | 0 | 0 | 是 |
| 0 | 2 | 1 | 1 | 0 | 0 | 是 |
| 2 | 2 | 0 | 1 | 0 | 0 | 是 |
| 1 | 2 | 1 | 1 | 0 | 0 | 是 |
| 2 | 1 | 1 | 1 | 2 | 1 | 是 |
| 0 | 1 | 1 | 2 | 2 | 1 | 是 |
| 0 | 1 | 1 | 1 | 2 | 0 | 是 |
| 0 | 1 | 0 | 2 | 2 | 0 | 否 |
| 2 | 0 | 2 | 1 | 1 | 1 | 否 |
| 1 | 0 | 2 | 0 | 1 | 0 | 否 |
| 1 | 2 | 1 | 0 | 1 | 1 | 否 |
| 2 | 1 | 1 | 2 | 0 | 0 | 否 |
| 1 | 1 | 0 | 2 | 0 | 0 | 否 |
| 0 | 1 | 1 | 1 | 2 | 1 | 否 |
| 1 | 2 | 1 | 0 | 1 | 0 | 否 |
| 2 | 2 | 0 | 2 | 2 | 0 | 否 |
四、ID3擬合
ID3算法
ID3算法的基本流程為:如果某一個特征能比其他特征更好的將訓(xùn)練數(shù)據(jù)集進行區(qū)分,那么將這個特征放在初始結(jié)點,依此類推,初始特征確定之后,對于初始特征每個可能的取值建立一個子結(jié)點,選擇每個子結(jié)點所對應(yīng)的特征,若某個子結(jié)點包含的所有樣本屬于同一類或所有特征對其包含的訓(xùn)練數(shù)據(jù)的區(qū)分能力均小于給定閾值,則該子結(jié)點為一個葉結(jié)點,其類別與該葉結(jié)點的訓(xùn)練數(shù)據(jù)類別最多的一致。重復(fù)上述過程直到特征用完或者所有特征的區(qū)分能力均小于給定閾值。如何衡量某個特征對訓(xùn)練數(shù)據(jù)集的區(qū)分能力呢,ID3算法通過信息增益來解決這個問題
DecisionTreeClassifier參數(shù)說明
-
riterion:特征選擇標(biāo)準(zhǔn),可選參數(shù),默認是gini,可以設(shè)置為entropy。gini是基尼不純度,是將來自集合的某種結(jié)果隨機應(yīng)用于某一數(shù)據(jù)項的預(yù)期誤差率,是一種基于統(tǒng)計的思想。entropy是香農(nóng)熵,也就是上篇文章講過的內(nèi)容,是一種基于信息論的思想。Sklearn把gini設(shè)為默認參數(shù),應(yīng)該也是做了相應(yīng)的斟酌的,精度也許更高些?ID3算法使用的是entropy,CART算法使用的則是gini。
-
splitter:特征劃分點選擇標(biāo)準(zhǔn),可選參數(shù),默認是best,可以設(shè)置為random。每個結(jié)點的選擇策略。best參數(shù)是根據(jù)算法選擇最佳的切分特征,例如gini、entropy。random隨機的在部分劃分點中找局部最優(yōu)的劃分點。默認的”best”適合樣本量不大的時候,而如果樣本數(shù)據(jù)量非常大,此時決策樹構(gòu)建推薦”random”。
-
max_features:劃分時考慮的最大特征數(shù),可選參數(shù),默認是None。尋找最佳切分時考慮的最大特征數(shù)(n_features為總共的特征數(shù)),有如下6種情況:
-
如果max_features是整型的數(shù),則考慮max_features個特征;
-
如果max_features是浮點型的數(shù),則考慮int(max_features * n_features)個特征;
-
如果max_features設(shè)為auto,那么max_features = sqrt(n_features);
-
如果max_features設(shè)為sqrt,那么max_featrues = sqrt(n_features),跟auto一樣;
-
如果max_features設(shè)為log2,那么max_features = log2(n_features);
-
如果max_features設(shè)為None,那么max_features = n_features,也就是所有特征都用。
-
一般來說,如果樣本特征數(shù)不多,比如小于50,我們用默認的”None”就可以了,如果特征數(shù)非常多,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特征數(shù),以控制決策樹的生成時間。
-
max_depth:決策樹最大深,可選參數(shù),默認是None。這個參數(shù)是這是樹的層數(shù)的。層數(shù)的概念就是,比如在貸款的例子中,決策樹的層數(shù)是2層。如果這個參數(shù)設(shè)置為None,那么決策樹在建立子樹的時候不會限制子樹的深度。一般來說,數(shù)據(jù)少或者特征少的時候可以不管這個值。或者如果設(shè)置了min_samples_slipt參數(shù),那么直到少于min_smaples_split個樣本為止。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決于數(shù)據(jù)的分布。常用的可以取值10-100之間。
-
min_samples_split:內(nèi)部節(jié)點再劃分所需最小樣本數(shù),可選參數(shù),默認是2。這個值限制了子樹繼續(xù)劃分的條件。如果min_samples_split為整數(shù),那么在切分內(nèi)部結(jié)點的時候,min_samples_split作為最小的樣本數(shù),也就是說,如果樣本已經(jīng)少于min_samples_split個樣本,則停止繼續(xù)切分。如果min_samples_split為浮點數(shù),那么min_samples_split就是一個百分比,ceil(min_samples_split * n_samples),數(shù)是向上取整的。如果樣本量不大,不需要管這個值。如果樣本量數(shù)量級非常大,則推薦增大這個值。
-
min_weight_fraction_leaf:葉子節(jié)點最小的樣本權(quán)重和,可選參數(shù),默認是0。這個值限制了葉子節(jié)點所有樣本權(quán)重和的最小值,如果小于這個值,則會和兄弟節(jié)點一起被剪枝。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類別偏差很大,就會引入樣本權(quán)重,這時我們就要注意這個值了。
-
max_leaf_nodes:最大葉子節(jié)點數(shù),可選參數(shù),默認是None。通過限制最大葉子節(jié)點數(shù),可以防止過擬合。如果加了限制,算法會建立在最大葉子節(jié)點數(shù)內(nèi)最優(yōu)的決策樹。如果特征不多,可以不考慮這個值,但是如果特征分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。
-
class_weight:類別權(quán)重,可選參數(shù),默認是None,也可以字典、字典列表、balanced。指定樣本各類別的的權(quán)重,主要是為了防止訓(xùn)練集某些類別的樣本過多,導(dǎo)致訓(xùn)練的決策樹過于偏向這些類別。類別的權(quán)重可以通過{class_label:weight}這樣的格式給出,這里可以自己指定各個樣本的權(quán)重,或者用balanced,如果使用balanced,則算法會自己計算權(quán)重,樣本量少的類別所對應(yīng)的樣本權(quán)重會高。當(dāng)然,如果你的樣本類別分布沒有明顯的偏倚,則可以不管這個參數(shù),選擇默認的None。
-
random_state:可選參數(shù),默認是None。隨機數(shù)種子。如果是證書,那么random_state會作為隨機數(shù)生成器的隨機數(shù)種子。隨機數(shù)種子,如果沒有設(shè)置隨機數(shù),隨機出來的數(shù)與當(dāng)前系統(tǒng)時間有關(guān),每個時刻都是不同的。如果設(shè)置了隨機數(shù)種子,那么相同隨機數(shù)種子,不同時刻產(chǎn)生的隨機數(shù)也是相同的。如果是RandomState instance,那么random_state是隨機數(shù)生成器。如果為None,則隨機數(shù)生成器使用np.random。
-
min_impurity_split:節(jié)點劃分最小不純度,可選參數(shù),默認是1e-7。這是個閾值,這個值限制了決策樹的增長,如果某節(jié)點的不純度(基尼系數(shù),信息增益,均方差,絕對差)小于這個閾值,則該節(jié)點不再生成子節(jié)點。即為葉子節(jié)點 。
-
presort:數(shù)據(jù)是否預(yù)排序,可選參數(shù),默認為False,這個值是布爾值,默認是False不排序。一般來說,如果樣本量少或者限制了一個深度很小的決策樹,設(shè)置為true可以讓劃分點選擇更加快,決策樹建立的更加快。如果樣本量太大的話,反而沒有什么好處。問題是樣本量少的時候,我速度本來就不慢。所以這個值一般懶得理它就可以了。
sklearn擬合代碼
# 采用ID3擬合 dtc = DecisionTreeClassifier(criterion='entropy') # 進行擬合 dtc.fit(data.iloc[:,:-1].values.tolist(),data.iloc[:,-1].values) # 標(biāo)簽對應(yīng)編碼 result = dtc.predict([[0,0,0,0,0,0]]) #擬合結(jié)果 result array(['否'], dtype=object)五、CART擬合
CART算法
CART(Classification And Regression Tree)算法既可以用于創(chuàng)建分類樹,也可以用于創(chuàng)建回歸樹。CART算法的重要特點包含以下三個方面:
二分(Binary Split):在每次判斷過程中,都是對樣本數(shù)據(jù)進行二分。CART算法是一種二分遞歸分割技術(shù),把當(dāng)前樣本劃分為兩個子樣本,使得生成的每個非葉子結(jié)點都有兩個分支,因此CART算法生成的決策樹是結(jié)構(gòu)簡潔的二叉樹。由于CART算法構(gòu)成的是一個二叉樹,它在每一步的決策時只能是“是”或者“否”,即使一個feature有多個取值,也是把數(shù)據(jù)分為兩部分
單變量分割(Split Based on One Variable):每次最優(yōu)劃分都是針對單個變量。
剪枝策略:CART算法的關(guān)鍵點,也是整個Tree-Based算法的關(guān)鍵步驟。剪枝過程特別重要,所以在最優(yōu)決策樹生成過程中占有重要地位。有研究表明,剪枝過程的重要性要比樹生成過程更為重要,對于不同的劃分標(biāo)準(zhǔn)生成的最大樹(Maximum Tree),在剪枝之后都能夠保留最重要的屬性劃分,差別不大。反而是剪枝方法對于最優(yōu)樹的生成更為關(guān)鍵。
基尼指數(shù):
CART的分支標(biāo)準(zhǔn)建立在GINI指數(shù)這個概念上,GINI指數(shù)主要是度量數(shù)據(jù)劃分的不純度,是介于0~1之間的數(shù)。GINI值越小,表明樣本集合的純凈度越高;GINI值越大表明樣本集合的類別越雜亂。直觀來說,GINI指數(shù)反映了從數(shù)據(jù)集中隨機抽出兩個樣本,其類別不一致的概率。衡量出數(shù)據(jù)集某個特征所有取值的Gini指數(shù)后,就可以得到該特征的Gini Split info,也就是GiniGain。不考慮剪枝情況下,分類決策樹遞歸創(chuàng)建過程中就是每次選擇GiniGain最小的節(jié)點做分叉點,直至子數(shù)據(jù)集都屬于同一類或者所有特征用光了。的計算過程如下:
# 采用CART擬合 dtc = DecisionTreeClassifier() # 進行擬合 dtc.fit(data.iloc[:,:-1].values.tolist(),data.iloc[:,-1].values) # 標(biāo)簽對應(yīng)編碼 result = dtc.predict([[0,0,0,1,0,0]]) #擬合結(jié)果 result array(['是'], dtype=object)六、參考
[機器學(xué)習(xí)-Sklearn]決策樹學(xué)習(xí)與總結(jié)
總結(jié)
以上是生活随笔為你收集整理的西瓜决策树-sklearn实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Atom编辑神器
- 下一篇: 一行代码实现Android App指引