數(shù)據(jù)分析師進階系列十(Sklearn)——決策樹

帶你走進sklearn系列1

資料來源:菜菜B站視頻
文章內(nèi)容:決策樹的基本概念和實戰(zhàn)應用。不會展示公式原理,偏重于實戰(zhàn)應用吭净。
無意中翻到了菊安醬和菜菜的博客,大家可以去看一下:https://www.cnblogs.com/juanjiang/p/11003369.html

概述

決策樹是一種非參數(shù)的有監(jiān)督學習算法肴甸,非參數(shù)是說參數(shù)數(shù)量會隨著訓練樣本增長的算法寂殉。
具體可以去看:https://www.cnblogs.com/wwwjjjnnn/p/9126906.html

核心問題

  • 誰是最佳分枝點
  • 什么時候停止分枝

模塊sklearn.tree

共包含4種樹和3種樹的輸出形式,官方教程:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.tree

  • tree.DecisionTreeClassifier() 分類樹 ****今日重點**
  • tree.DecisionTreeRegressor() 回歸樹
  • tree.ExtraTreeClassifier() 高隨機版本的分類樹
  • tree.ExtraTreeRegressor() 高隨機版本的回歸樹
  • tree.export_graphviz(decision_tree) 輸出DOT格式的圖
  • tree.export_text(decision_tree) 輸出決策樹規(guī)則的文本
  • tree.plot_tree(decision_tree) 畫決策樹

重要參數(shù)--8個

class sklearn.tree.DecisionTreeClassifier(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='deprecated', ccp_alpha=0.0)

1.criterion

用來決定不純度的計算方法:entropy原在、gini友扰。樹中的每一個節(jié)點都有不純度彤叉,葉子節(jié)點的不純度最低。
一般默認使用gini村怪,當決策樹擬合程度不夠時秽浇,再試試信息熵,信息熵對訓練集擬合的比較精細甚负,但往往也容易過擬合柬焕,兩者基本沒太大差別。選擇不純度最低的節(jié)點(就是最純的梭域,最容易直接分類的特征)進行分枝击喂,決策樹在分枝時,其實使用的是信息增益碰辅。

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

wine = load_wine()

利用紅酒數(shù)據(jù)集建一棵樹懂昂,數(shù)據(jù)集中字段包括:wine.data,wine.target,wine.target_names,wine.feature_names,該數(shù)據(jù)集是一個三分類數(shù)據(jù)没宾。

# 做成一個表凌彬,來瞅一下,最后一列就是標簽

import pandas as pd
data = pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
data.head(3)
# 劃分數(shù)據(jù)集,注意前面一定是xxyy循衰,test_size可以自己設定7:3還是8:2

x_train,x_test,y_train,y_test = train_test_split(wine.data,wine.target,test_size=0.3)
print("x_train的維度{}铲敛,wine.date的維度{}".format(x_train.shape,wine.data.shape))

x_train的維度(124, 13),wine.date的維度(178, 13)

2.random_state & splitter

sklearn通過在分枝時隨機選取部分特征進行優(yōu)化会钝,進而建立很多棵樹伐蒋,返回最好的樹。
在高維度的數(shù)據(jù)中迁酸,每次運行下面的模型先鱼,會返回不同的分數(shù)。為保持結果穩(wěn)定奸鬓,設定random_state參數(shù)焙畔。
splitter控制隨機選項,有兩個參數(shù):'best'根據(jù)重要程度選取特征;'random'在分枝時更隨機,對訓練集的擬合度會降低串远。 所以如果你本身特征就比較多宏多,為了防止過擬合可以設置這兩個參數(shù)

# 建脑璺#看一下

clf = tree.DecisionTreeClassifier(criterion='entropy'
                                 ,random_state=30
                                 ,splitter='random'
                                 )
clf = clf.fit(x_train,y_train)
score = clf.score(x_test,y_test)
print('模型分數(shù):%.4f' %score)
import graphviz
feature_name = ['酒精','蘋果酸','灰','灰的堿性','鎂','總酚','類黃酮','飛黃烷類酚類','花青素','顏色強度','色調','稀釋葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf
                                ,feature_names=feature_name
                                ,class_names=['琴酒','雪莉','貝爾摩德']
                                ,filled=True   # 顏色填充
                                ,rounded=True  # 圓角
                                )
graph = graphviz.Source(dot_data)
graph

graphviz要自己另外安裝伸但,記得加入path。

查看特征排名

# 特征重要性的排名

clf.feature_importances_
# *zip()進行解壓

[*zip(feature_name,clf.feature_importances_)]

3.剪枝參數(shù)(5個)

  • max_depth 限制樹的深度留搔,在高維度低樣本的訓練中非常有效更胖。建議從=3開始嘗試,看擬合效果再決定是否增加深度。
  • min_samples_leaf
    節(jié)點分枝后的每個子節(jié)點包含的樣本數(shù)必須包含的樣本個數(shù)函喉,一般搭配max_depth使用避归,建議從=5開始使用。
  • min_samples_split
    一個節(jié)點必須包含的樣本數(shù)管呵,小于這個樣本數(shù)梳毙,就不會允許繼續(xù)分枝。
  • max_features
    限制分枝時考慮的特征個數(shù)捐下,是一個比較暴力的強行使決策樹停下的參數(shù)账锹。如果希望降維選取重要特征,建議改用PCA坷襟、ICA或其他特征選擇模塊中的降維算法奸柬,盲目限制該參數(shù),可能會使模型學習能力不足婴程。
  • min_impurity_decrease
    當信息增益小于限定的數(shù)值時廓奕,不會再分枝。

一般來講max_depth+min_samples_leaf|min_samples_split就可以完成調參档叔,后面的參數(shù)設置屬于精修范圍桌粉。

# 對訓練集的擬合程度---“太完美了”

train_score=clf.score(x_train,y_train)
train_score

進行剪枝,參數(shù)是隨便修改的衙四,該結果并不是最優(yōu) 铃肯,重點看參數(shù)設置后的變化

cut_clf = tree.DecisionTreeClassifier(criterion='entropy'
                                      ,random_state=30
                                      ,splitter='random'
                                      ,max_depth=4
                                      ,min_samples_leaf=5
                                      ,min_samples_split=45                                   
                                      )
cut_clf = cut_clf.fit(x_train,y_train)
cut_score = cut_clf.score(x_test,y_test)
print('模型分數(shù):%.4f' %cut_score)

cut_dot_data = tree.export_graphviz(cut_clf
                                    ,feature_names=feature_name
                                    ,class_names=['琴酒','雪莉','貝爾摩德']
                                    ,filled=True   # 顏色填充
                                    ,rounded=True  # 圓角
                                    )
cut_graph = graphviz.Source(cut_dot_data)
cut_graph

如何調參

學習曲線的使用

以超參數(shù)的取值為橫坐標,模型的度量值為縱坐標传蹈。

import matplotlib.pyplot as plt
%matplotlib inline

test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i+1
                                      ,criterion='entropy'
                                      ,random_state=30
                                      )
    clf = clf.fit(x_train,y_train)
    score = clf.score(x_test,y_test)
    test.append(score)

plt.plot(range(1,11),test,color='red',label='max_depth')
plt.legend()
plt.show()
學習曲線
  • 剪枝參數(shù)不一定提高模型在測試集上的表現(xiàn)押逼,這取決于數(shù)據(jù)本身。
  • 遺留問題:多參數(shù)調參(后面補上)

目標權重參數(shù)

  • class_weight & min_weight_fraction_leaf
    當樣本類別不平衡時設置的參數(shù)惦界,默認為None挑格,所有標簽具有相同權重。
    樣本加權之后使用min_weight_fraction_leaf配合調參表锻。

重要屬性

  • feature_importances_
    訓練之后恕齐,調用clf.feature_importances_查看特征重要程度。
    與特征名一起解壓瞬逊,得到(特征,權重)元組仪或。

重要接口

  • fit()
  • score()
  • apply()
    返回樣本點所在葉子節(jié)點的索引确镊。
  • predict()
    返回樣本分類/回歸的結果。

總結

決策樹一共講了8個參數(shù)范删,1個屬性蕾域,4個接口

8個參數(shù) 4個接口 1個屬性
criterion計算不純度 fit() feature_importances_
random_state & splitters隨機項設置 score()
max_depth剪枝參數(shù) apply()
min_samples_leaf & min_samples_split 剪枝參數(shù) predict()
max_features & min_impurity_decrease 剪枝參數(shù)
class_weight & min_weight_fraction_leaf 類別權重
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旨巷,隨后出現(xiàn)的幾起案子巨缘,更是在濱河造成了極大的恐慌,老刑警劉巖采呐,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件若锁,死亡現(xiàn)場離奇詭異,居然都是意外死亡斧吐,警方通過查閱死者的電腦和手機又固,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煤率,“玉大人仰冠,你說我怎么就攤上這事〉矗” “怎么了洋只?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昼捍。 經(jīng)常有香客問我木张,道長,這世上最難降的妖魔是什么端三? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任舷礼,我火速辦了婚禮,結果婚禮上郊闯,老公的妹妹穿的比我還像新娘妻献。我一直安慰自己,他們只是感情好团赁,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布育拨。 她就那樣靜靜地躺著,像睡著了一般欢摄。 火紅的嫁衣襯著肌膚如雪熬丧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天怀挠,我揣著相機與錄音析蝴,去河邊找鬼。 笑死绿淋,一個胖子當著我的面吹牛闷畸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吞滞,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼佑菩,長吁一口氣:“原來是場噩夢啊……” “哼盾沫!你這毒婦竟也來了?” 一聲冷哼從身側響起殿漠,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赴精,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绞幌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕾哟,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年啊奄,在試婚紗的時候發(fā)現(xiàn)自己被綠了渐苏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡菇夸,死狀恐怖琼富,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庄新,我是刑警寧澤鞠眉,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站择诈,受9級特大地震影響械蹋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜羞芍,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一哗戈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荷科,春花似錦唯咬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刻获,卻和暖如春蜀涨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝎毡。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工厚柳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顶掉。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓草娜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痒筒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容