日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

西瓜决策树-sklearn实现

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 西瓜决策树-sklearn实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • sklearn實現ID3、CART算法實現
    • 一、引包
    • 二、讀取數據
    • 三、數據編碼
    • 四、ID3擬合
      • ID3算法
      • DecisionTreeClassifier參數說明
      • sklearn擬合代碼
    • 五、CART擬合
      • CART算法
      • 基尼指數:
    • 六、參考

sklearn實現ID3、CART算法實現

一、引包

import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.tree import DecisionTreeClassifier

二、讀取數據

data = pd.read_csv('./西瓜數據集.csv') data 色澤根蒂敲擊紋理臍部觸感好瓜012345678910111213141516
青綠蜷縮濁響清晰凹陷硬滑
烏黑蜷縮沉悶清晰凹陷硬滑
烏黑蜷縮濁響清晰凹陷硬滑
青綠蜷縮沉悶清晰凹陷硬滑
淺白蜷縮濁響清晰凹陷硬滑
青綠稍蜷濁響清晰稍凹軟粘
烏黑稍蜷濁響稍糊稍凹軟粘
烏黑稍蜷濁響清晰稍凹硬滑
烏黑稍蜷沉悶稍糊稍凹硬滑
青綠硬挺清脆清晰平坦軟粘
淺白硬挺清脆模糊平坦硬滑
淺白蜷縮濁響模糊平坦軟粘
青綠稍蜷濁響稍糊凹陷硬滑
淺白稍蜷沉悶稍糊凹陷硬滑
烏黑稍蜷濁響清晰稍凹軟粘
淺白蜷縮濁響模糊平坦硬滑
青綠蜷縮沉悶稍糊稍凹硬滑

三、數據編碼

#創建LabelEncoder()對象,用于序列化 label = LabelEncoder() #為每一列序列化 for col in data[data.columns[:-1]]:data[col] = label.fit_transform(data[col]) data 色澤根蒂敲擊紋理臍部觸感好瓜012345678910111213141516
221100
020100
021100
220100
121100
211121
011221
011120
010220
202111
102010
121011
211200
110200
011121
121010
220220

四、ID3擬合

ID3算法

ID3算法的基本流程為:如果某一個特征能比其他特征更好的將訓練數據集進行區分,那么將這個特征放在初始結點,依此類推,初始特征確定之后,對于初始特征每個可能的取值建立一個子結點,選擇每個子結點所對應的特征,若某個子結點包含的所有樣本屬于同一類或所有特征對其包含的訓練數據的區分能力均小于給定閾值,則該子結點為一個葉結點,其類別與該葉結點的訓練數據類別最多的一致。重復上述過程直到特征用完或者所有特征的區分能力均小于給定閾值。如何衡量某個特征對訓練數據集的區分能力呢,ID3算法通過信息增益來解決這個問題

DecisionTreeClassifier參數說明

  • riterion:特征選擇標準,可選參數,默認是gini,可以設置為entropy。gini是基尼不純度,是將來自集合的某種結果隨機應用于某一數據項的預期誤差率,是一種基于統計的思想。entropy是香農熵,也就是上篇文章講過的內容,是一種基于信息論的思想。Sklearn把gini設為默認參數,應該也是做了相應的斟酌的,精度也許更高些?ID3算法使用的是entropy,CART算法使用的則是gini。

  • splitter:特征劃分點選擇標準,可選參數,默認是best,可以設置為random。每個結點的選擇策略。best參數是根據算法選擇最佳的切分特征,例如gini、entropy。random隨機的在部分劃分點中找局部最優的劃分點。默認的”best”適合樣本量不大的時候,而如果樣本數據量非常大,此時決策樹構建推薦”random”。

  • max_features:劃分時考慮的最大特征數,可選參數,默認是None。尋找最佳切分時考慮的最大特征數(n_features為總共的特征數),有如下6種情況:

    • 如果max_features是整型的數,則考慮max_features個特征;

    • 如果max_features是浮點型的數,則考慮int(max_features * n_features)個特征;

    • 如果max_features設為auto,那么max_features = sqrt(n_features);

    • 如果max_features設為sqrt,那么max_featrues = sqrt(n_features),跟auto一樣;

    • 如果max_features設為log2,那么max_features = log2(n_features);

    • 如果max_features設為None,那么max_features = n_features,也就是所有特征都用。

一般來說,如果樣本特征數不多,比如小于50,我們用默認的”None”就可以了,如果特征數非常多,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特征數,以控制決策樹的生成時間。

  • max_depth:決策樹最大深,可選參數,默認是None。這個參數是這是樹的層數的。層數的概念就是,比如在貸款的例子中,決策樹的層數是2層。如果這個參數設置為None,那么決策樹在建立子樹的時候不會限制子樹的深度。一般來說,數據少或者特征少的時候可以不管這個值。或者如果設置了min_samples_slipt參數,那么直到少于min_smaples_split個樣本為止。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決于數據的分布。常用的可以取值10-100之間。

  • min_samples_split:內部節點再劃分所需最小樣本數,可選參數,默認是2。這個值限制了子樹繼續劃分的條件。如果min_samples_split為整數,那么在切分內部結點的時候,min_samples_split作為最小的樣本數,也就是說,如果樣本已經少于min_samples_split個樣本,則停止繼續切分。如果min_samples_split為浮點數,那么min_samples_split就是一個百分比,ceil(min_samples_split * n_samples),數是向上取整的。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。

  • min_weight_fraction_leaf:葉子節點最小的樣本權重和,可選參數,默認是0。這個值限制了葉子節點所有樣本權重和的最小值,如果小于這個值,則會和兄弟節點一起被剪枝。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。

  • max_leaf_nodes:最大葉子節點數,可選參數,默認是None。通過限制最大葉子節點數,可以防止過擬合。如果加了限制,算法會建立在最大葉子節點數內最優的決策樹。如果特征不多,可以不考慮這個值,但是如果特征分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。

  • class_weight:類別權重,可選參數,默認是None,也可以字典、字典列表、balanced。指定樣本各類別的的權重,主要是為了防止訓練集某些類別的樣本過多,導致訓練的決策樹過于偏向這些類別。類別的權重可以通過{class_label:weight}這樣的格式給出,這里可以自己指定各個樣本的權重,或者用balanced,如果使用balanced,則算法會自己計算權重,樣本量少的類別所對應的樣本權重會高。當然,如果你的樣本類別分布沒有明顯的偏倚,則可以不管這個參數,選擇默認的None。

  • random_state:可選參數,默認是None。隨機數種子。如果是證書,那么random_state會作為隨機數生成器的隨機數種子。隨機數種子,如果沒有設置隨機數,隨機出來的數與當前系統時間有關,每個時刻都是不同的。如果設置了隨機數種子,那么相同隨機數種子,不同時刻產生的隨機數也是相同的。如果是RandomState instance,那么random_state是隨機數生成器。如果為None,則隨機數生成器使用np.random。

  • min_impurity_split:節點劃分最小不純度,可選參數,默認是1e-7。這是個閾值,這個值限制了決策樹的增長,如果某節點的不純度(基尼系數,信息增益,均方差,絕對差)小于這個閾值,則該節點不再生成子節點。即為葉子節點 。

  • presort:數據是否預排序,可選參數,默認為False,這個值是布爾值,默認是False不排序。一般來說,如果樣本量少或者限制了一個深度很小的決策樹,設置為true可以讓劃分點選擇更加快,決策樹建立的更加快。如果樣本量太大的話,反而沒有什么好處。問題是樣本量少的時候,我速度本來就不慢。所以這個值一般懶得理它就可以了。

sklearn擬合代碼

# 采用ID3擬合 dtc = DecisionTreeClassifier(criterion='entropy') # 進行擬合 dtc.fit(data.iloc[:,:-1].values.tolist(),data.iloc[:,-1].values) # 標簽對應編碼 result = dtc.predict([[0,0,0,0,0,0]]) #擬合結果 result array(['否'], dtype=object)

五、CART擬合

CART算法

CART(Classification And Regression Tree)算法既可以用于創建分類樹,也可以用于創建回歸樹。CART算法的重要特點包含以下三個方面:

二分(Binary Split):在每次判斷過程中,都是對樣本數據進行二分。CART算法是一種二分遞歸分割技術,把當前樣本劃分為兩個子樣本,使得生成的每個非葉子結點都有兩個分支,因此CART算法生成的決策樹是結構簡潔的二叉樹。由于CART算法構成的是一個二叉樹,它在每一步的決策時只能是“是”或者“否”,即使一個feature有多個取值,也是把數據分為兩部分
單變量分割(Split Based on One Variable):每次最優劃分都是針對單個變量。
剪枝策略:CART算法的關鍵點,也是整個Tree-Based算法的關鍵步驟。剪枝過程特別重要,所以在最優決策樹生成過程中占有重要地位。有研究表明,剪枝過程的重要性要比樹生成過程更為重要,對于不同的劃分標準生成的最大樹(Maximum Tree),在剪枝之后都能夠保留最重要的屬性劃分,差別不大。反而是剪枝方法對于最優樹的生成更為關鍵。

基尼指數:

CART的分支標準建立在GINI指數這個概念上,GINI指數主要是度量數據劃分的不純度,是介于0~1之間的數。GINI值越小,表明樣本集合的純凈度越高;GINI值越大表明樣本集合的類別越雜亂。直觀來說,GINI指數反映了從數據集中隨機抽出兩個樣本,其類別不一致的概率。衡量出數據集某個特征所有取值的Gini指數后,就可以得到該特征的Gini Split info,也就是GiniGain。不考慮剪枝情況下,分類決策樹遞歸創建過程中就是每次選擇GiniGain最小的節點做分叉點,直至子數據集都屬于同一類或者所有特征用光了。的計算過程如下:

# 采用CART擬合 dtc = DecisionTreeClassifier() # 進行擬合 dtc.fit(data.iloc[:,:-1].values.tolist(),data.iloc[:,-1].values) # 標簽對應編碼 result = dtc.predict([[0,0,0,1,0,0]]) #擬合結果 result array(['是'], dtype=object)

六、參考

[機器學習-Sklearn]決策樹學習與總結

總結

以上是生活随笔為你收集整理的西瓜决策树-sklearn实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。