機(jī)器學(xué)習(xí)---決策樹(隨機(jī)森林)

決策樹本質(zhì)上是一個(gè)classfication 問(wèn)題的監(jiān)督學(xué)習(xí)算法,其結(jié)構(gòu)上分為根節(jié)點(diǎn)和葉節(jié)點(diǎn)塌西,底層python 的實(shí)現(xiàn)可以參考機(jī)器學(xué)習(xí)實(shí)戰(zhàn)一書脖阵,本質(zhì)上是一個(gè)遞歸實(shí)現(xiàn)。

  1. 偽代碼的介紹
    假定一個(gè)訓(xùn)練集合D={(x1,y1),(x2,y2),...,(xm,ym)};
    屬性集合A={a1,a2,...,ad}.
    有三種情況下荷辕,導(dǎo)致遞歸直接返回結(jié)果:(1)當(dāng)前節(jié)點(diǎn)包含的樣本全部屬于同一個(gè)類別,無(wú)需進(jìn)行劃分件豌;(2)當(dāng)前屬性為空疮方,或者是所有樣本在所有的屬性上的取值相等,無(wú)法劃分茧彤;(3)當(dāng)前節(jié)點(diǎn)包含的樣本集合為空骡显,不能劃分
  1. 決策樹劃分的原則和定量值
    一般而言,隨著劃分的不斷進(jìn)行曾掂,希望決策樹的分支點(diǎn)所包含的樣本盡可能的屬于同一類別惫谤,即節(jié)點(diǎn)的純度要高,衡量純度的標(biāo)準(zhǔn)為信息熵
    信息熵有如下的定義:假定樣本集合D中的第x類樣本所占的比例之和為px珠洗,則D的信息熵為:

    假定離散屬性a有V個(gè)可能的取值{a1,a2,...,av}溜歪,若使用a對(duì)樣本集合D來(lái)進(jìn)行劃分,則會(huì)產(chǎn)生v個(gè)分支節(jié)點(diǎn)许蓖,其中第v個(gè)分支節(jié)點(diǎn)包含了D中所有在屬性a上取值為av的樣本蝴猪,記作Dv,且考慮到不同的分支節(jié)點(diǎn)所包含的樣本數(shù)不同膊爪,給分支節(jié)點(diǎn)賦予權(quán)重|Dv|/|D|自阱,即樣本數(shù)越多的分支節(jié)點(diǎn)的影響越大
    Gain(D,a)=H[x]-(v=1到v=v的和)|Dv|/|D|*Ent(Dv)

具體來(lái)講,當(dāng)有多個(gè)屬性米酬,每一個(gè)屬性都對(duì)應(yīng)多個(gè)屬性值沛豌,那么就計(jì)算每一個(gè)屬性的信息熵,哪一個(gè)屬性的信息熵大赃额,則選擇該屬性為決策樹的節(jié)點(diǎn)

  1. 增益率
    在周志華p78有一個(gè)例子加派,判斷是否為好瓜阁簸,有17個(gè)樣本,把每一個(gè)樣本進(jìn)行編號(hào)哼丈,作為一列,如果把該列也作為屬性筛严,那么它的信息增益應(yīng)該最大醉旦,因?yàn)檫@樣決策樹就會(huì)產(chǎn)生17個(gè)分支,每一個(gè)分支的節(jié)點(diǎn)就包含一個(gè)樣本桨啃,純度達(dá)到最大车胡,這樣的決策樹準(zhǔn)確率高,但是不具備泛化能力照瘾,無(wú)法對(duì)新樣本進(jìn)行有效的預(yù)測(cè)
    增益率的公式為:
    Gain_ratio(D,a)=Gain(D,a)/IV(a)
    其中匈棘,iv(a)=-(v=1到v=v的和)|Dv|/|D|*log2|Dv|/|D| (C4.5算法)
  1. 基尼指數(shù)(CART Classification and regression Tree 的簡(jiǎn)稱,這是一種著名決策樹的學(xué)習(xí)算法析命,分類和回歸都可以使用)

    其中屬性a的基尼指數(shù)定義為:
    Gini_index(D,a)=(v=1 到v=v的和)|Dv|/|D|Gini(Dv)
  1. 對(duì)過(guò)擬合的解決方法
    采用預(yù)剪枝/后剪枝的方法來(lái)進(jìn)行處理
    周志華p81-p83對(duì)于此講解十分清楚主卫,感興趣可以去拜讀一下

下面介紹sklearn 官方文檔

  • criterion 可以使用"gini"或者"entropy",前者就是上文代表的基尼系數(shù)鹃愤,后者代表信息增益簇搅。一般說(shuō)使用默認(rèn)的基尼系數(shù)"gini"就可以了,即CART算法软吐。
  • splitter 可以使用"best"或者"random"瘩将。前者在特征的所有劃分點(diǎn)中找出最優(yōu)的劃分點(diǎn)。后者是隨機(jī)的在部分劃分點(diǎn)中找局部最優(yōu)的劃分點(diǎn)凹耙。 默認(rèn)的"best"適合樣本量不大的時(shí)候姿现,而如果樣本數(shù)據(jù)量非常大,此時(shí)決策樹構(gòu)建推薦"random"
  • max_depth 決策樹的最大深度肖抱, 決策樹的最大深度备典,默認(rèn)可以不輸入,如果不輸入的話虐沥,決策樹在建立子樹的時(shí)候不會(huì)限制子樹的深度熊经。一般來(lái)說(shuō),數(shù)據(jù)少或者特征少的時(shí)候可以不管這個(gè)值欲险。如果模型樣本量多镐依,特征也多的情況下,推薦限制這個(gè)最大深度天试,具體的取值取決于數(shù)據(jù)的分布槐壳。常用的可以取值10-100之間
  • min_samples_split 這個(gè)值限制了子樹繼續(xù)劃分的條件,如果某節(jié)點(diǎn)的樣本數(shù)少于min_samples_split喜每,則不會(huì)繼續(xù)再嘗試選擇最優(yōu)特征來(lái)進(jìn)行劃分务唐。 默認(rèn)是2 如果樣本量不大雳攘,不需要管這個(gè)值。如果樣本量數(shù)量級(jí)非常大枫笛,則推薦增大這個(gè)值
  • min_samples_leaf 這個(gè)值限制了葉子節(jié)點(diǎn)最少的樣本數(shù)吨灭,如果某葉子節(jié)點(diǎn)數(shù)目小于樣本數(shù),則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝刑巧。 默認(rèn)是1,可以輸入最少的樣本數(shù)的整數(shù)
  • min_weight_fraction_leaf 這個(gè)值限制了葉子節(jié)點(diǎn)所有樣本權(quán)重和的最小值喧兄,如果小于這個(gè)值,則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝啊楚。 默認(rèn)是0吠冤,就是不考慮權(quán)重問(wèn)題。一般來(lái)說(shuō)恭理,如果我們有較多樣本有缺失值拯辙,或者分類樹樣本的分布類別偏差很大,就會(huì)引入樣本權(quán)重颜价,這時(shí)我們就要注意這個(gè)值了涯保。
  • max_leaf_nodes 通過(guò)限制最大葉子節(jié)點(diǎn)數(shù),可以防止過(guò)擬合拍嵌,默認(rèn)是"None”遭赂,即不限制最大的葉子節(jié)點(diǎn)數(shù)。如果加了限制横辆,算法會(huì)建立在最大葉子節(jié)點(diǎn)數(shù)內(nèi)最優(yōu)的決策樹撇他。如果特征不多,可以不考慮這個(gè)值狈蚤,但是如果特征分成多的話困肩,可以加以限制,具體的值可以通過(guò)交叉驗(yàn)證得到脆侮。
  • max_features The number of features to consider when looking for the best split 用于劃分選取的最大特征值的個(gè)數(shù)

methods

  • apply(X, check_input=True) Returns the index of the leaf that each sample is predicted as.
  • decision_path(X, check_input=True) Return the decision path in the tree
  • fit(X, y, sample_weight=None, check_input=True, X_idx_sorted=None) 其中锌畸,X為樣本集合,y為所屬的類標(biāo)簽靖避,參數(shù)sample_weight 為樣本的權(quán)重潭枣,默認(rèn)為None,權(quán)重相同
  • get_params(deep=True) 得到評(píng)估器的參數(shù),deep 默認(rèn)為True ,表示輸出所有參數(shù)
  • predict_log_proba(X) Predict class log-probabilities of the input samples X. 得到預(yù)測(cè)屬于某一類別的log 值
  • predict_proba(X, check_input=True) Predict class probabilities of the input samples X 得到預(yù)測(cè)屬于某一類別的值
  • score(X, y, sample_weight=None) X為測(cè)試集幻捏, y為測(cè)試集的真實(shí)的類別標(biāo)簽盆犁,返回的是測(cè)試結(jié)果準(zhǔn)確度(即多少判斷正確,多少判斷錯(cuò)誤)

下面來(lái)看一個(gè)簡(jiǎn)單的demo

import  sklearn
from sklearn import tree#輸出決策樹

x=[[0,0],[2,2]]
y=[0,1]
clf=tree.DecisionTreeClassifier()#這是用于進(jìn)行分類問(wèn)題
clf=clf.fit(x,y)
#print (clf.predict_proba([[1,1]]))
#print (clf.apply(x))  返回葉節(jié)點(diǎn)所在位置的索引
#print (clf.predict([[3,4]]))

x=[[0,0],[2,2]]
y=[0.5,2.5]#注意這時(shí)候標(biāo)簽是浮點(diǎn)類型的篡九,且是不連續(xù)的
clf=tree.DecisionTreeRegressor()#就要用到回歸決策樹分類器
clf=clf.fit(x,y)
#print (clf.predict_proba([[1,1]]))
#print (clf.apply(x))  返回葉節(jié)點(diǎn)所在位置的索引
print (clf.predict([[3,4]]))

最后是一個(gè)官方的實(shí)例谐岁,結(jié)合matplotlib的呈現(xiàn)

import  sklearn
from sklearn.tree import DecisionTreeRegressor#輸出回歸決策樹
import numpy as np
import matplotlib.pyplot  as plt

rng=np.random.RandomState(1)#其中1為偽隨機(jī)種子。只要隨機(jī)種子一樣,那么生成的序列就相同
x=np.sort(5*rng.rand(80,1),axis=0)#其中random.rand 的用處是生成一個(gè)指定形狀的數(shù)組伊佃,np.sort 參數(shù)axis默認(rèn)為-1窜司,表示按照最后一行排序
#print (x)  最終生成了一組80個(gè)由小到大排列的數(shù)
"""
>>> a = np.array([[1,4],[3,1]])
>>> np.sort(a)                # sort along the last axis
array([[1, 4],
       [1, 3]])
>>> np.sort(a, axis=None)     # sort the flattened array
array([1, 1, 3, 4])
>>> np.sort(a, axis=0)        # sort along the first axis
array([[1, 1],
       [3, 4]])
"""
y=np.sin(x).ravel()#np.sin(np.pi/2)得到[[1]],ravel的作用是降維的作用
y[::5]+=3*(0.5-rng.rand(16))# 80/5=16 利用rand 產(chǎn)生16個(gè)一維數(shù)組
# #print (y)
regr_1=DecisionTreeRegressor(max_depth=2)
regr_2=DecisionTreeRegressor(max_depth=5)#產(chǎn)生兩個(gè)深度不同的樹
regr_1.fit(x,y)
regr_2.fit(x,y)#分別訓(xùn)練兩棵樹


#ppredict
x_test=np.arange(0.0,5.0,0.01)[:,np.newaxis]#將1行多列的數(shù)組轉(zhuǎn)化為多行一列的數(shù)組
y_1=regr_1.predict(x_test)
y_2=regr_2.predict(x_test)

#picture
plt.figure()#畫布搭建
plt.scatter(x,y, s=20,marker='<',edgecolor='black',c='darkorange',label='data')
"""
其中的s可以理解為點(diǎn)的大小,c為顏色序列,當(dāng)有多個(gè)點(diǎn)的時(shí)候航揉,可以接受一個(gè)顏色組成的列表塞祈,每個(gè)點(diǎn)的顏色按照序列顏色生成
marker 表示生成的點(diǎn)的形狀,默認(rèn)為'o'
label 圖像標(biāo)簽
"""
plt.plot(x_test, y_1, color="cornflowerblue",label="max_depth=2", linewidth=2)
plt.plot(x_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

最終的圖像展示如下

未完待續(xù)帅涂。织咧。。漠秋。。抵屿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庆锦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子轧葛,更是在濱河造成了極大的恐慌搂抒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尿扯,死亡現(xiàn)場(chǎng)離奇詭異求晶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)衷笋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門芳杏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人辟宗,你說(shuō)我怎么就攤上這事爵赵。” “怎么了泊脐?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵空幻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我容客,道長(zhǎng)秕铛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任缩挑,我火速辦了婚禮但两,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘调煎。我一直安慰自己镜遣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悲关,像睡著了一般谎僻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寓辱,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天艘绍,我揣著相機(jī)與錄音,去河邊找鬼秫筏。 笑死诱鞠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的这敬。 我是一名探鬼主播航夺,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼崔涂!你這毒婦竟也來(lái)了阳掐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冷蚂,失蹤者是張志新(化名)和其女友劉穎缭保,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝙茶,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艺骂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隆夯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钳恕。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹄衷,靈堂內(nèi)的尸體忽然破棺而出苞尝,到底是詐尸還是另有隱情,我是刑警寧澤宦芦,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布宙址,位于F島的核電站,受9級(jí)特大地震影響调卑,放射性物質(zhì)發(fā)生泄漏抡砂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一恬涧、第九天 我趴在偏房一處隱蔽的房頂上張望注益。 院中可真熱鬧,春花似錦溯捆、人聲如沸丑搔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)啤月。三九已至煮仇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谎仲,已是汗流浹背浙垫。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郑诺,地道東北人夹姥。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辙诞,于是被迫代替她去往敵國(guó)和親辙售。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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

  • 以西瓜書為主線飞涂,以其他書籍作為參考進(jìn)行補(bǔ)充圾亏,例如《統(tǒng)計(jì)學(xué)習(xí)方法》,《PRML》等 第一章 緒論 1.2 基本術(shù)語(yǔ) ...
    danielAck閱讀 4,535評(píng)論 0 6
  • 決策樹理論在決策樹理論中封拧,有這樣一句話,“用較少的東西夭问,照樣可以做很好的事情泽西。越是小的決策樹,越優(yōu)于大的決策樹”缰趋。...
    制杖灶灶閱讀 5,866評(píng)論 0 25
  • 決策樹 1 基本流程 決策樹基于樹結(jié)構(gòu)進(jìn)行決策捧杉,決策過(guò)程的每個(gè)判定問(wèn)題都是對(duì)某個(gè)屬性的“測(cè)試”。 一般的秘血,一棵決策...
    edwin1993閱讀 3,553評(píng)論 0 0
  • 1. 小時(shí)候味抖,最喜歡干的一件事,就是跑到家后面的山坡上放風(fēng)箏灰粮。伴著夕陽(yáng)的余暉仔涩,看著翱翔在天際的風(fēng)箏,總是別有一番意...
    鄧義福閱讀 613評(píng)論 8 11
  • 今天和晶晶聊了很多粘舟,大家看見的只是她做出的成果熔脂,卻不知道她對(duì)待每個(gè)資源有多認(rèn)真、細(xì)致地去分析柑肴;大家也不知道霞揉,她走了...
    Sammy_S閱讀 204評(píng)論 0 2