前言——主要內(nèi)容
這篇筆記是StatQuest系列視頻的第53-55節(jié)弃理,其中第53節(jié)講的是隨機(jī)森林,第54節(jié)講的是缺失值的處理,第55節(jié)講的是R與隨機(jī)森林。
決策樹(shù)的局限
隨機(jī)森林(Random Forests)來(lái)源于決策樹(shù)治筒,因此如果不了解決策樹(shù)的話,可以看上一篇筆記舷蒲,決策樹(shù)如下所示:
決策樹(shù)很容易構(gòu)建矢炼,也很好用,也很好題解阿纤。但事實(shí)上句灌,決策樹(shù)并非完美無(wú)缺,引用《The Elements of Statistical Learning》(又名《The Bible of Machine Learning》),中文譯名為《統(tǒng)計(jì)學(xué)習(xí)基礎(chǔ):數(shù)據(jù)挖掘胰锌、推理與預(yù)測(cè)》的話講骗绕,決策樹(shù)的不精確準(zhǔn)確(inaccuracy)決定了它無(wú)法作為一個(gè)理想的預(yù)測(cè)學(xué)習(xí)工具,如下所示:
換句話說(shuō)资昧,就是決策樹(shù)的構(gòu)建要利用大量的數(shù)據(jù)酬土,但是當(dāng)用這個(gè)構(gòu)建好的決策樹(shù)來(lái)對(duì)一批新的數(shù)據(jù)進(jìn)行分類(lèi)時(shí),決策樹(shù)并不能靈活地處理這些新數(shù)據(jù)格带,如下所示:
隨機(jī)森林的優(yōu)勢(shì)
隨機(jī)森林綜合了決策樹(shù)簡(jiǎn)潔的特征撤缴,同時(shí)又具備靈活性,因此隨機(jī)森林在精確性方面也得到了極大的提高叽唱,如下所示:
構(gòu)建隨機(jī)森林
接著屈呕,我們來(lái)看一下隨機(jī)森林的構(gòu)建過(guò)程。
第一步:構(gòu)建自舉數(shù)據(jù)集
構(gòu)建隨機(jī)森林的第一步就是從原始數(shù)據(jù)中隨機(jī)挑選數(shù)據(jù)棺亭,構(gòu)建“自舉”數(shù)據(jù)集(自舉:bootstrap)虎眨,如下所示:
下面是原始的數(shù)據(jù)集,這個(gè)數(shù)據(jù)集還是我們上篇筆記中的那個(gè)數(shù)據(jù)集镶摘,里面有4個(gè)變量嗽桩,分別為胸痛(Chest Pain)
,良好血液循環(huán)(Good Blood Circ.)
凄敢,動(dòng)脈阻塞(Blocked Arteries)
碌冶,體重(Weight),
雖然這個(gè)數(shù)據(jù)集非常小涝缝,但是不影響使用扑庞,如下所示:
為了構(gòu)建一個(gè)與原始數(shù)據(jù)集同樣大小的自舉數(shù)據(jù)集(bootstrapped dataset),我們僅需要隨機(jī)地從原始數(shù)據(jù)中挑選樣本即可俊卤,這個(gè)隨機(jī)挑選的過(guò)程是有放回地挑選(這就是bootstrap)嫩挤,也就是我從原始數(shù)據(jù)集中隨機(jī)挑一個(gè)樣本,然后放回去消恍,再隨機(jī)挑一個(gè)樣本岂昭,這樣的話,相同有樣本有可能被挑中好幾次狠怨,如下所示:
我們先隨機(jī)挑一個(gè)樣本约啊,這次挑中了第2個(gè)樣本,如下所示:
把這個(gè)樣本放到我們的自舉數(shù)據(jù)集中佣赖,就成了自舉數(shù)據(jù)集中的第1個(gè)樣本恰矩,如下所示:
再隨機(jī)挑一個(gè)樣本,這次挑中了原始數(shù)據(jù)集中的第1個(gè)樣本憎蛤,把它放到我們的自舉數(shù)據(jù)集中外傅,就是自舉數(shù)據(jù)集中的第2個(gè)樣本纪吮,如下所示:
再?gòu)脑紨?shù)據(jù)中隨機(jī)挑一個(gè),放到自舉數(shù)據(jù)集中萎胰,如下所示:
再隨機(jī)挑一個(gè)碾盟,放到自舉數(shù)據(jù)集中,這里需要注意的是技竟,我們挑了兩次原始數(shù)據(jù)集中第4個(gè)樣本冰肴,這樣在自舉數(shù)據(jù)集中就有了2個(gè)重復(fù)的樣本,這個(gè)沒(méi)關(guān)系榔组,如下所示:
此時(shí)熙尉,我們就構(gòu)建好了一個(gè)自舉數(shù)據(jù)集,這個(gè)自舉數(shù)據(jù)集的大小與原始數(shù)據(jù)集的大小相同搓扯,也就是說(shuō)有同樣數(shù)目的樣本检痰,如下所示:
第二步:構(gòu)建樹(shù)
構(gòu)建隨機(jī)森林的第二步就是利用我們構(gòu)建的自舉數(shù)據(jù)集來(lái)構(gòu)建一個(gè)決策樹(shù),并且一次只能使用一個(gè)變量(或列)的隨機(jī)亞集(subset)進(jìn)行構(gòu)建擅编,在這個(gè)案例中攀细,我們每一步只會(huì)使用2個(gè)變量(列)箫踩,至于為什么使用2個(gè)變量爱态,后文會(huì)講解,如下所示:
因此境钟,我們不會(huì)使用所有的4個(gè)變量來(lái)區(qū)分根節(jié)點(diǎn)锦担,如下所示:
而是隨機(jī)選擇2個(gè)變量來(lái)區(qū)分根節(jié)點(diǎn),如下所示:
在這個(gè)案例中慨削,我們隨機(jī)使用良好血液循環(huán)(Good Blood Circulation)
和動(dòng)脈阻塞(Blocked Arteries)
這兩個(gè)變量來(lái)區(qū)分根節(jié)點(diǎn)洞渔,如下所示:
就像我們這個(gè)案例的目的一樣,我們假設(shè)良好血液循環(huán)(Good Blood Circulation)能夠很好地區(qū)分樣本缚态,我們就用它作為根節(jié)點(diǎn)磁椒,如下所示:
由于我們使用過(guò)了良好血液循環(huán)(Good Blood Circulation)這個(gè)變量,因此這里把它變灰玫芦,以便于我們研究剩余的變量浆熔,如下所示:
現(xiàn)在我們看一下中間節(jié)點(diǎn)如何區(qū)分,如下所示:
與根節(jié)點(diǎn)一樣桥帆,我們并不使用剩余的所有3個(gè)變量医增,而是隨機(jī)選擇2個(gè)變量用于區(qū)分,如下所示:
接著老虫,我們就像以前構(gòu)建決策樹(shù)那樣叶骨,構(gòu)建樹(shù),不過(guò)我們一次只使用一個(gè)變量的隨機(jī)亞集祈匙,如下所示:
最終的結(jié)果如下所示:
現(xiàn)在回顧一下我們構(gòu)建這個(gè)樹(shù)的過(guò)程:第一步忽刽,構(gòu)建自舉數(shù)據(jù)集;第二步,每一步隨機(jī)選擇一個(gè)變量亞集來(lái)構(gòu)建節(jié)點(diǎn)跪帝,如下所示:
第三步:循環(huán)第1到到第2步
此時(shí)宝剖,我們就構(gòu)建好了一個(gè)樹(shù),現(xiàn)在我們?cè)倩氐降谝徊角干酰貜?fù)操作万细,再生成一個(gè)自舉數(shù)據(jù)集,還是一次使用變量的一個(gè)隨機(jī)亞集來(lái)構(gòu)建一個(gè)樹(shù)(就是下圖中第2個(gè)樹(shù))纸泄,如下所示:
不斷地重復(fù)這個(gè)過(guò)程赖钞,重復(fù)100次,這樣我們會(huì)構(gòu)建一系列的樹(shù)聘裁,下圖只是顯示了其中的6種樹(shù)雪营,如下所示:
通過(guò)利用一個(gè)自舉樣本,一次只利用變量的一個(gè)隨機(jī)亞集衡便,就會(huì)產(chǎn)生大量不同的樹(shù)献起,這些樹(shù)就構(gòu)成了隨機(jī)森林(一次生成一棵樹(shù),多次運(yùn)算镣陕,就是多棵樹(shù)谴餐,也就是森林了),它遠(yuǎn)比單一的決策樹(shù)有效呆抑,如下所示:
隨機(jī)森林的使用
此時(shí)岂嗓,我們已經(jīng)學(xué)會(huì)了構(gòu)建隨機(jī)森林的基本思想,那么隨機(jī)森林有什么用處呢鹊碍,如下所示:
我們看一個(gè)案例厌殉,例如,我們遇到了一個(gè)新病人侈咕,他的各種參數(shù)如下所示:
現(xiàn)在我們想知道公罕,他是否得有心臟病,如下所示:
那么耀销,我們把他的數(shù)據(jù)放到我們生成隨機(jī)森林中楼眷,先放到第1棵樹(shù)上,如下所示:
運(yùn)算結(jié)果顯示Yes树姨,此時(shí)記錄一下這個(gè)數(shù)據(jù)摩桶,如下所示:
現(xiàn)在把這個(gè)人的參數(shù)放到隨機(jī)森林中的第2棵樹(shù)上運(yùn)行,如下所示:
計(jì)算結(jié)果是Yes帽揪,此時(shí)記錄下這個(gè)數(shù)據(jù)硝清,如下所示:
我們把這個(gè)人的數(shù)據(jù)再放到隨機(jī)森林中的其他的樹(shù)中運(yùn)算,如下所示:
總之转晰,就是不斷地放到不同的樹(shù)上運(yùn)算芦拿,如下所示:
當(dāng)運(yùn)算結(jié)果后士飒,我們記錄下所有樹(shù)的運(yùn)算結(jié)果,我們會(huì)看到Y(jié)es或No哪個(gè)得票最多蔗崎,如下所示:
在這個(gè)案例中酵幕,明顯Yes得票最多,因此我們就能下結(jié)論缓苛,這個(gè)人得了心臟病芳撒,如下所示:
隨機(jī)森林相關(guān)術(shù)語(yǔ)
自舉數(shù)據(jù)并對(duì)它們進(jìn)行匯總做出的決策稱為袋裝法(Bagging),如下所示:
隨機(jī)森林的評(píng)估
我們已經(jīng)了解了隨機(jī)森林構(gòu)建的基本思想未桥,也知道了如何使用它笔刹,此時(shí)可能還有一個(gè)問(wèn)題,這個(gè)模型的好壞程度到底如何冬耿,如下所示:
我們回到前面構(gòu)建自舉數(shù)據(jù)集的內(nèi)容舌菜,我們?cè)谇拔闹姓f(shuō)過(guò),在一個(gè)自舉數(shù)據(jù)集中亦镶,我們?cè)试S兩條相同的記錄(entry日月,記錄可以理解為一個(gè)樣本,也就是一行數(shù)據(jù))存在缤骨,如下所示:
最終在自舉數(shù)據(jù)集中爱咬,沒(méi)有包含原始數(shù)據(jù)集中的第3條目錄,如下所示:
通常來(lái)說(shuō)荷憋,大概會(huì)有三分之一的原始數(shù)據(jù)集中的記錄不會(huì)包含在自舉數(shù)據(jù)集中台颠,如下所示:
下圖的右側(cè)就是那條未包含在自舉數(shù)據(jù)集中的記錄褐望,如下所示:
如果原始數(shù)據(jù)集非常大的話勒庄,那么就有不止一條記錄不包含在自舉數(shù)據(jù)集中,如下所示:
這些不包含在自舉數(shù)據(jù)集上的記錄被稱為“出袋數(shù)據(jù)集”(out-of-bag dataset瘫里,未找到相應(yīng)的中文譯名实蔽,此處暫譯為“出袋數(shù)據(jù)集”),這樣命名主要是因?yàn)榻鞫粒绻炎耘e數(shù)據(jù)集看成一個(gè)袋子局装,這些數(shù)據(jù)并不在這個(gè)袋子中,如下所示:
由于這些出袋數(shù)據(jù)集并沒(méi)有用于構(gòu)建這些樹(shù)劳殖,如下所示:
因此铐尚,我們可以把這個(gè)數(shù)據(jù)集當(dāng)作是一個(gè)新的樣本,把它放到隨機(jī)森林中計(jì)算哆姻,看能不能得到想要的結(jié)果(沒(méi)得心臟残觥),如下所示:
在這個(gè)案例中矛缨,這個(gè)樣本最終的計(jì)算結(jié)果是No爹脾,也就是沒(méi)得心臟病帖旨,如下所示:
然后我們把這些出袋數(shù)據(jù)集放到其他樹(shù)中計(jì)算,如下所示:
有一個(gè)樹(shù)計(jì)算的結(jié)果是Yes灵妨,這個(gè)明顯是錯(cuò)誤的,如下所示:
其他的樹(shù)計(jì)算結(jié)果是No,如下所示:
對(duì)所有樹(shù)的計(jì)算結(jié)果進(jìn)行統(tǒng)計(jì)折晦,我們發(fā)現(xiàn)教沾,No的得票最多,那么我們就能下結(jié)論朱转,這個(gè)樣本的結(jié)果是沒(méi)得心臟病碉熄,與樣本本身的結(jié)果一致,如下所示:
我們對(duì)其他的出袋數(shù)據(jù)集繼續(xù)進(jìn)行計(jì)算(出袋數(shù)據(jù)據(jù)不止一個(gè)樣本肋拔,有很多)锈津,這個(gè)樣本的結(jié)果是Yes,與樣本本身的結(jié)果一致凉蜂,如下所示:
再計(jì)算另外的樣本琼梆,樣本本身的結(jié)果是No,但計(jì)算出來(lái)的結(jié)果卻是Yes窿吩,并不一致茎杂,如下所示:
經(jīng)過(guò)不斷地計(jì)算,我們會(huì)得到很多計(jì)算結(jié)果纫雁,最終我們?cè)儆?jì)算一下煌往,隨機(jī)森林計(jì)算的樣本結(jié)果與樣本本身的結(jié)果一致的比例,我們就能得到隨機(jī)森林的精確程度轧邪,其中隨機(jī)森林計(jì)算的結(jié)果與樣本本身的結(jié)果不一致的比例刽脖,我們稱為出袋錯(cuò)誤(Out-Of-Bag Error)(未找到相應(yīng)的中文譯名,此處暫譯為“出袋錯(cuò)誤”)忌愚,如下所示:
至此曲管,我們了解了這些內(nèi)容:第一,構(gòu)建隨機(jī)森林硕糊;第二院水,使用隨機(jī)森林;第三简十,評(píng)估隨機(jī)森林的精確性檬某。
既然我們知道了如何評(píng)估隨機(jī)森林的精確性,那么此時(shí)我們?cè)倩氐降谝徊糠置私庖幌码S機(jī)森林是的構(gòu)建原理恢恼,如下所示:
在構(gòu)建隨機(jī)森林時(shí),我們最初在每一步中胶逢,使用的是隨機(jī)選擇的2個(gè)變量厅瞎,如下所示:
現(xiàn)在我們就要比較一下饰潜,使用隨機(jī)選擇的2個(gè)變量與3個(gè)變量導(dǎo)致的出袋錯(cuò)誤的差異,我們測(cè)試一些不同的參數(shù)和簸,來(lái)研究一下如何選擇一個(gè)最為精確的隨機(jī)森林彭雾,如下所示:
換句話講,我們做上述事件的順序是:
第一锁保,構(gòu)建隨機(jī)森林薯酝;
第二,評(píng)估隨機(jī)森林的精確性爽柒。
接著吴菠,改變每一個(gè)步驟中的變量數(shù)目,不斷地重復(fù)這個(gè)過(guò)程浩村,得到一個(gè)最精確的隨機(jī)森林做葵,如下所示:
通常來(lái)說(shuō),我們最初使用的變量數(shù)目為總變量數(shù)目的平方根心墅,例如在前面的案例中酿矢,總變量數(shù)目是4,它的平方根是2怎燥,那么我們一開(kāi)始就先使用2個(gè)變量作為每次運(yùn)算時(shí)變量的數(shù)目瘫筐,然后在這個(gè)數(shù)目上下進(jìn)行調(diào)整,如下所示:
在構(gòu)建隨機(jī)森林的過(guò)程中我們可能會(huì)遇到缺失值铐姚,缺失值有兩種策肝,我們先看第一種缺失值的處理。
第一種缺失值的處理
我們看一下我們的原始數(shù)據(jù)隐绵,如下所示:
原始數(shù)據(jù)一共是4個(gè)患者之众,其中第4名患者有2個(gè)數(shù)據(jù)缺失,用問(wèn)號(hào)表示氢橙,如下所示:
隨機(jī)森林中有2類(lèi)缺失值酝枢,分別為:第一,用于構(gòu)建隨機(jī)森林的原始數(shù)據(jù)集中的數(shù)據(jù)缺失悍手,就是上面的情況;第二袍患,用于歸類(lèi)的坦康,一個(gè)新的樣本中的數(shù)據(jù)缺失情況,如下所示:
我們先講第一種數(shù)據(jù)的缺失情況诡延,如下所示:
我們要從上面的原始數(shù)據(jù)集中構(gòu)建隨機(jī)森林滞欠,但是不清楚第4個(gè)患者的動(dòng)脈阻塞與體重?cái)?shù)據(jù),如下所示:
處理這種缺失數(shù)據(jù)的常規(guī)方式是觀察其他數(shù)據(jù)肆良,先做出一個(gè)可能不太好的初始猜測(cè)筛璧,然后逐步改進(jìn)這個(gè)猜測(cè)逸绎,直到這個(gè)猜測(cè)變得比較好為止(希望如此),如下所示:
現(xiàn)在我們就做這樣的猜測(cè)夭谤,我們先看血管阻塞這個(gè)變量棺牧,然后找到這個(gè)變量出現(xiàn)最多的數(shù)據(jù)就可做出猜測(cè),如下所示:
我們發(fā)現(xiàn)朗儒,在這個(gè)變量中颊乘,No
出現(xiàn)的頻率最高(2個(gè)No,1個(gè)Yes)醉锄,如下所示:
因此乏悄,我們就可以猜測(cè),在這個(gè)變量中恳不,第4個(gè)患者的值可能是No
檩小,如下所示:
猜測(cè)完血管阻塞這個(gè)變量中的缺失值后,我們?cè)俨聹y(cè)一下體重這個(gè)變量在第4個(gè)患者中的缺失值烟勋,體重是一種連續(xù)型變量(數(shù)值)识啦,因此我們可以看一下這個(gè)變量中其他數(shù)值的中位數(shù)即可(在決策樹(shù)中,這種缺失值的處理神妹,要么使用中位數(shù)颓哮,要么使用中位數(shù)),如下所示:
在其他的患者中鸵荠,體重這個(gè)變量的中位數(shù)是180冕茅,因此我們就可以把第4個(gè)患者的體重缺失值寫(xiě)為180,如下所示:
經(jīng)過(guò)這樣的處理蛹找,原始數(shù)據(jù)中缺失的數(shù)據(jù)就填充好了姨伤,如下所示:
填充好缺失值后,我們還要評(píng)估這些數(shù)據(jù)猜測(cè)得到底合理不合理庸疾,現(xiàn)在就需要看一下哪些樣本與含有缺失值的樣本比較類(lèi)似乍楚,接著我們就會(huì)講一下這種相似性如何計(jì)算,如下所示:
第一步:構(gòu)建隨機(jī)森林届慈,如下所示:
第二步:將所有的原始數(shù)據(jù)放到隨機(jī)森林中運(yùn)行徒溪,如下所示:
我們先在隨機(jī)森林中的第1棵樹(shù)上運(yùn)行,如下所示:
把所有患者的數(shù)據(jù)依次放進(jìn)去金顿,如下所示:
這4個(gè)患者的數(shù)據(jù)經(jīng)過(guò)計(jì)算后臊泌,我們會(huì)發(fā)現(xiàn),患者3和患者4最終位于同一片葉子節(jié)點(diǎn)上揍拆,如下所示:
這就說(shuō)明渠概,第3個(gè)患者與第4個(gè)患者相似,如下所示:
相似性矩陣
現(xiàn)在我們用一個(gè)相似性矩陣(Proximity Matrix)來(lái)研究相似的患者數(shù)據(jù)嫂拴,如下所示:
相似性矩陣的每行代表一個(gè)樣本播揪,如下所示:
相似性矩陣的每列也代表一個(gè)樣本贮喧,如下所示:
因?yàn)榈?個(gè)樣本與第4個(gè)樣本最終位于同一個(gè)葉子節(jié)點(diǎn)上,如下所示:
我們把患者3和患者4交叉的地方填上1猪狈,如下所示:
此外箱沦,還有一個(gè)交叉點(diǎn),也填上1罪裹,如下所示:
由于在隨機(jī)森林中第1棵樹(shù)上運(yùn)行后饱普,除了第3個(gè)患者和第4個(gè)患者的最終結(jié)果相同外,并沒(méi)有其他的患者結(jié)果相同状共,因此我們?cè)诘?棵樹(shù)上運(yùn)行后套耕,得到的相似性矩陣就如下所示:
現(xiàn)在我們把所有的數(shù)據(jù)放到隨機(jī)森林的第2棵樹(shù)上運(yùn)行,如下所示:
運(yùn)行過(guò)程如下所示:
最終我們發(fā)現(xiàn)峡继,患者2冯袍,患者3和患者4位于同一個(gè)葉子節(jié)點(diǎn)上,如下所示:
我們?cè)倏匆幌履肱疲?jīng)過(guò)第1棵樹(shù)運(yùn)行后的相似性矩陣如下所示:
經(jīng)過(guò)第2棵樹(shù)的運(yùn)算康愤,我們把有相同結(jié)果的患者交叉處填上1,如果原來(lái)的交叉位置有1舶吗,就加1征冷,如下所示:
從中我們可以看到,患者3和患者4還是位于同一個(gè)葉子節(jié)點(diǎn)上誓琼,因此就在原有的基礎(chǔ)上再加1检激,如下所示:
患者2和患者3位于同一個(gè)節(jié)點(diǎn),患者2和患者4位于同一個(gè)節(jié)點(diǎn)腹侣,如下所示:
現(xiàn)在我們把所有的數(shù)據(jù)放到第3棵樹(shù)上運(yùn)行叔收,如下所示:
得到結(jié)果后,我們?cè)俑乱幌孪嗨菩跃仃嚢亮ィ缦滤荆?/p>
其中我們發(fā)現(xiàn)饺律,患者3和患者4還是位于同一個(gè)節(jié)點(diǎn)上,再加1跺株,如下所示:
最終复濒,我們運(yùn)行完所有的樹(shù),得到一個(gè)最終的相似性矩陣帖鸦,如下所示:
然后芝薇,我們把這個(gè)相似性矩陣中的所有值除以所有樹(shù)的數(shù)目,在這個(gè)案例中作儿,所有的樹(shù)的數(shù)目是10,得到結(jié)果如下所示:
現(xiàn)在我們使用這個(gè)近似矩陣來(lái)評(píng)估一下我們對(duì)缺失值猜測(cè)的效果如何馋劈,如下所示:
對(duì)于動(dòng)脈阻塞這個(gè)變量來(lái)說(shuō)攻锰,我們使用這個(gè)近似值來(lái)計(jì)算Yes與No的加權(quán)頻率晾嘶,對(duì)于體重缺失值的處理,也是如此娶吞,如下所示:
其中動(dòng)脈阻塞這個(gè)變量中垒迂,除了缺失值外,在剩下的數(shù)據(jù)中妒蛇,Yes的頻率是1/3机断,No的頻率是2/3,如下所示:
那么對(duì)Yes的加權(quán)頻率計(jì)算如下所示:
患者2中Yes對(duì)應(yīng)的近似值為0.1绣夺,如下所示:
然后除以患者4中所有近似值的和吏奸,如下所示:
Yes的權(quán)重是0.1,如下所示:
那么Yes的加權(quán)頻率就是0.03陶耍,如下所示:
再來(lái)計(jì)算No的權(quán)加頻率奋蔚,如下所示:
它的公式為:
No的權(quán)重是0.9,如下所示:
最終計(jì)算結(jié)果是0.6烈钞,我們發(fā)現(xiàn)泊碑,No的加權(quán)頻率更高,也就是說(shuō)毯欣,我們可以在這個(gè)缺失值處填上No馒过,如下所示:
對(duì)于體重缺失值的處理,我們也是采用近似值來(lái)計(jì)算它的加權(quán)平均數(shù)酗钞,如下所示:
加權(quán)平均數(shù)的的公式如下所示:
第一個(gè)樣本的加權(quán)平均體重是0.1腹忽,用125乘以它即可,如下所示:
接著計(jì)算患者2的權(quán)加平均數(shù)算吩,如下所示:
最終計(jì)算出加權(quán)平均數(shù)留凭,如下所示:
此時(shí),把這個(gè)結(jié)果(也就是198.5)填到缺失值處偎巢,如下所示:
現(xiàn)在我們?cè)僦匦聦徱曇幌挛覀兊牟聹y(cè)蔼夜,重新再運(yùn)行一次數(shù)據(jù),然后構(gòu)建一個(gè)隨機(jī)森林压昼,在所有的樹(shù)中計(jì)算數(shù)據(jù)求冷,重新計(jì)算近似值,再次計(jì)算缺失值窍霞,這個(gè)過(guò)程要重復(fù)6或7次匠题,直接覆蓋所有的缺失值(直到我們?cè)俅斡?jì)算時(shí),這個(gè)數(shù)據(jù)不再變化為止)但金,如下所示:
相似矩陣的拓展
這里我們先看一下相似矩陣的一些很有意思的東西韭山,如下所示:
我們?cè)倏匆幌略诔?0(隨機(jī)森林的所有樹(shù)的數(shù)目)之間前的相似矩陣,如下所示:
如果樣本3和樣本4最終都落在了所有的10個(gè)樹(shù)的同一個(gè)葉子節(jié)點(diǎn)上,那么上述的數(shù)字8就是10钱磅,如下所示:
我們?cè)俪?0(所有樹(shù)的數(shù)目)梦裂,我們就看到在這個(gè)相似矩陣中最大的數(shù)值就是1,如下所示:
在這個(gè)近似矩陣中盖淡,1意味著這兩個(gè)樣本是盡可能接近的年柠,如下所示:
此時(shí),我們用1減去這些近似值褪迟,就得到了某個(gè)距離冗恨,那么樣本3和樣本4的近似值是1,1減去1味赃,就是0掀抹,也就是說(shuō)這兩個(gè)樣本之間沒(méi)有距離,如下所示:
樣本1和樣本4之間的的估計(jì)值是0.1洁桌,用1減去這個(gè)數(shù)值渴丸,得到0.9,那么這就表示另凌,這兩個(gè)樣本的距離很大谱轨,也就表示它們之間離得遠(yuǎn),如下所示:
我們把1減去這個(gè)近似值矩陣得到的新矩陣稱為距離矩陣(distance matrix)吠谢,畫(huà)出熱圖就是下面的這個(gè)樣子:
我們也可以繪制出MDS圖土童,如下所示:
我們對(duì)相似矩陣的這些拓展計(jì)算很有意思,因?yàn)楣し唬瑹o(wú)論你的數(shù)據(jù)是什么形式(有序數(shù)據(jù)献汗,多個(gè)選擇,連續(xù)型數(shù)據(jù))王污,如果我們使用這些數(shù)據(jù)構(gòu)建一個(gè)樹(shù)罢吃,我們就能畫(huà)出熱圖或者是MDS圖,用于研究不同樣本的之間的相似性昭齐,如下所示:
第二種缺失值的處理
此時(shí)尿招,再回到缺失值的處理上來(lái)捶惜,前面我們只是介紹了一種缺失值的處理枢希,也就是用于構(gòu)建隨機(jī)森林的原始數(shù)據(jù)中的缺失值處理望薄,現(xiàn)在我們介紹一下另外一種缺失值的處理捷绑,也就是我們想用于分類(lèi)的新的樣本中的缺失值處理,如下所示:
試想乘寒,我們已經(jīng)通過(guò)現(xiàn)有的數(shù)據(jù)構(gòu)建了一個(gè)隨機(jī)森林辱魁,此時(shí)我們要將下面的的這個(gè)患者進(jìn)行分類(lèi)翻伺,不過(guò)他的一個(gè)動(dòng)脈阻塞參數(shù)是缺失的喧枷,如下所示:
但我們還是想要知道這個(gè)患者是否患有心臟病虹统,如下所示:
但我們不知道動(dòng)脈阻塞這個(gè)參數(shù)弓坞,因此我們需要對(duì)這個(gè)參數(shù)進(jìn)行一個(gè)猜測(cè),其過(guò)程就是把這個(gè)患者的其他參數(shù)放到隨機(jī)森林中運(yùn)行窟却,如下所示:
第一步:我們先猜測(cè)這個(gè)患者得了心臟病與不得心臟病這兩種情況昼丑,做出兩份數(shù)據(jù)呻逆,如下所示:
然后我們使用先前提到的迭代方法來(lái)對(duì)這動(dòng)脈阻塞這個(gè)參數(shù)進(jìn)行猜測(cè)夸赫,如下所示:
猜測(cè)結(jié)果一個(gè)是Yes,一個(gè)是No咖城,如下所示:
然后把這兩個(gè)數(shù)據(jù)放到隨機(jī)森林中運(yùn)算茬腿,如下所示:
然后我們觀察這兩個(gè)數(shù)據(jù)在隨機(jī)森林中的運(yùn)行結(jié)果,看一下哪個(gè)結(jié)果數(shù)目最多宜雀,如下所示:
在第一個(gè)數(shù)據(jù)中切平,所有的3個(gè)樹(shù)都標(biāo)記了其為Yes,如下所示:
在第二個(gè)數(shù)據(jù)中辐董,只有一個(gè)樹(shù)正確地標(biāo)記了No悴品,如下所示:
因此第一個(gè)數(shù)據(jù)是正確的數(shù)據(jù),因?yàn)樗械臉?shù)中它被正確計(jì)算的次數(shù)最多简烘,如下所示:
R語(yǔ)言與隨機(jī)森林
加載包
在使用R語(yǔ)言構(gòu)建隨機(jī)森林的時(shí)候苔严,需要使用如下三個(gè)包:
library(ggplot2)
library(cowplot)
library(randomForest)
數(shù)據(jù)集的處理
原始數(shù)據(jù)使用UCI機(jī)器學(xué)習(xí)的數(shù)據(jù),這里的數(shù)據(jù)很多孤澎,我們只用其中的心臟病方面的一個(gè)數(shù)據(jù)集届氢,如下所示:
代碼如下所示:
url <- "http://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"
data <- read.csv(url, header=FALSE)
head(data)
數(shù)據(jù)如下所示:
> head(data)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14
1 63 1 1 145 233 1 2 150 0 2.3 3 0.0 6.0 0
2 67 1 4 160 286 0 2 108 1 1.5 2 3.0 3.0 2
3 67 1 4 120 229 0 2 129 1 2.6 2 2.0 7.0 1
4 37 1 3 130 250 0 0 187 0 3.5 3 0.0 3.0 0
5 41 0 2 130 204 0 2 172 0 1.4 1 0.0 3.0 0
6 56 1 2 120 236 0 0 178 0 0.8 1 0.0 3.0 0
從數(shù)據(jù)中我們可以發(fā)現(xiàn),第一行對(duì)于每個(gè)變量的命名并不是特別的規(guī)范覆旭,因此退子,根據(jù)網(wǎng)站提供的信息,我們把這些變量名改一下型将,如下所示:
colnames(data) <- c(
"age",
"sex",
"cp",
"trestbps",
"chol",
"fbs",
"restecg",
"thalach",
"exang",
"oldpeak",
"slope",
"ca",
"thal",
"hd"
)
head(data)
更改后的結(jié)果如下所示:
> head(data)
age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal hd
1 63 1 1 145 233 1 2 150 0 2.3 3 0.0 6.0 0
2 67 1 4 160 286 0 2 108 1 1.5 2 3.0 3.0 2
3 67 1 4 120 229 0 2 129 1 2.6 2 2.0 7.0 1
4 37 1 3 130 250 0 0 187 0 3.5 3 0.0 3.0 0
5 41 0 2 130 204 0 2 172 0 1.4 1 0.0 3.0 0
6 56 1 2 120 236 0 0 178 0 0.8 1 0.0 3.0 0
查看一下數(shù)據(jù)結(jié)構(gòu)寂祥,如下所示:
> str(data)
'data.frame': 303 obs. of 14 variables:
$ age : num 63 67 67 37 41 56 62 57 63 53 ...
$ sex : num 1 1 1 1 0 1 0 0 1 1 ...
$ cp : num 1 4 4 3 2 2 4 4 4 4 ...
$ trestbps: num 145 160 120 130 130 120 140 120 130 140 ...
$ chol : num 233 286 229 250 204 236 268 354 254 203 ...
$ fbs : num 1 0 0 0 0 0 0 0 0 1 ...
$ restecg : num 2 2 2 0 2 0 2 0 2 2 ...
$ thalach : num 150 108 129 187 172 178 160 163 147 155 ...
$ exang : num 0 1 1 0 0 0 0 1 0 1 ...
$ oldpeak : num 2.3 1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 ...
$ slope : num 3 2 2 3 1 1 3 1 2 3 ...
$ ca : Factor w/ 5 levels "?","0.0","1.0",..: 2 5 4 2 2 2 4 2 3 2 ...
$ thal : Factor w/ 4 levels "?","3.0","6.0",..: 3 2 4 2 2 2 2 2 4 4 ...
$ hd : int 0 2 1 0 0 0 3 0 2 1 ...
現(xiàn)在解釋一下各個(gè)變量:
sex
是性別,其中0表示女性七兜,1表示男性丸凭,在分析時(shí),需要把sex
這個(gè)變量根據(jù)1或0更改為M或F惊搏。
cp
是chest pain
的縮寫(xiě)贮乳,其數(shù)值是1-3,這個(gè)范圍表示不同類(lèi)型的胸痛恬惯,4表示沒(méi)有胸痛向拆。
ca
與thal
是因子數(shù)據(jù)類(lèi)型,我們看到酪耳,其中有的數(shù)值是?
浓恳,這個(gè)是不符合規(guī)范的刹缝,因此后面我們會(huì)把它改為NA。
此外颈将,還要把其它的變量更改為因子類(lèi)型梢夯,如下所示:
data[data == "?"] <- NA
data[data$sex == 0,]$sex <- "F"
data[data$sex == 1,]$sex <- "M"
data$sex <- as.factor(data$sex)
data$cp <- as.factor(data$cp)
data$fbs <- as.factor(data$fbs)
data$restecg <- as.factor(data$restecg)
data$exang <- as.factor(data$exang)
data$slope <- as.factor(data$slope)
data$ca <- as.integer(data$ca)
data$ca <- as.factor(data$ca)
data$thal <- as.factor(data$thal)
data$hd <- ifelse(test=data$hd == 0, yes = "Healthy", no="Unhealthy")
data$hd <- as.factor(data$hd)
查看一下數(shù)據(jù)類(lèi)型,如下所示:
> str(data)
'data.frame': 303 obs. of 14 variables:
$ age : num 63 67 67 37 41 56 62 57 63 53 ...
$ sex : Factor w/ 2 levels "F","M": 2 2 2 2 1 2 1 1 2 2 ...
$ cp : Factor w/ 4 levels "1","2","3","4": 1 4 4 3 2 2 4 4 4 4 ...
$ trestbps: num 145 160 120 130 130 120 140 120 130 140 ...
$ chol : num 233 286 229 250 204 236 268 354 254 203 ...
$ fbs : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 2 ...
$ restecg : Factor w/ 3 levels "0","1","2": 3 3 3 1 3 1 3 1 3 3 ...
$ thalach : num 150 108 129 187 172 178 160 163 147 155 ...
$ exang : Factor w/ 2 levels "0","1": 1 2 2 1 1 1 1 2 1 2 ...
$ oldpeak : num 2.3 1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 ...
$ slope : Factor w/ 3 levels "1","2","3": 3 2 2 3 1 1 3 1 2 3 ...
$ ca : Factor w/ 4 levels "2","3","4","5": 1 4 3 1 1 1 3 1 2 1 ...
$ thal : Factor w/ 4 levels "?","3.0","6.0",..: 3 2 4 2 2 2 2 2 4 4 ...
$ hd : Factor w/ 2 levels "Healthy","Unhealthy": 1 2 2 1 1 1 2 1 2 2 ...
補(bǔ)充缺失值
由于我們要生成隨機(jī)森林晴圾,此時(shí)我們?cè)O(shè)一個(gè)種子颂砸,用于生成隨機(jī)數(shù),這樣我們可以重復(fù)我們的計(jì)算結(jié)果死姚,在構(gòu)建隨機(jī)森林之間人乓,由于我們的數(shù)據(jù)集中的缺失值,此時(shí)要對(duì)缺失值進(jìn)行補(bǔ)充都毒,補(bǔ)充缺失值使用的是rfImpute()
函數(shù)色罚,如下所示:
set.seed(42)
data.imputed <- rfImpute(hd ~.,data=data,iter=6)
hd~.
是第1個(gè)參數(shù),它表示账劲,我們使用hd(heart disease)這一列作為最終的預(yù)測(cè)戳护,也就是說(shuō)拿一個(gè)患者的數(shù)據(jù),預(yù)測(cè)患者是否得有心臟病瀑焦。
data = data
這個(gè)表示腌且,我們使用data
這個(gè)數(shù)據(jù)集來(lái)構(gòu)建隨機(jī)森林。
iter=6
用來(lái)指定迭代多少次來(lái)評(píng)估缺失值蝠猬,從理論上講切蟋,這個(gè)值是4到6就足夠了,如下所示:
運(yùn)行結(jié)果如下所示:
> data.imputed <- rfImpute(hd ~.,data=data,iter=6)
ntree OOB 1 2
300: 17.49% 12.80% 23.02%
ntree OOB 1 2
300: 16.83% 14.02% 20.14%
ntree OOB 1 2
300: 17.82% 13.41% 23.02%
ntree OOB 1 2
300: 17.49% 14.02% 21.58%
ntree OOB 1 2
300: 17.16% 12.80% 22.30%
ntree OOB 1 2
300: 18.15% 14.63% 22.30%
經(jīng)過(guò)每次迭代榆芦,rflmpute()
就會(huì)在第2列輸出出袋錯(cuò)誤率(OOB柄粹,即Out-of-Bag),如果估計(jì)值在不斷地改善匆绣,那么這個(gè)值就會(huì)不斷地變小驻右,但在這個(gè)結(jié)果中,我們發(fā)現(xiàn)這個(gè)值并沒(méi)有不斷地變小崎淳,那么我們就可以認(rèn)為堪夭,我們利用此函數(shù)得到的估計(jì)值可以滿足計(jì)算,如下所示:
構(gòu)建隨機(jī)森林
接著拣凹,我們使用randomForest()
函數(shù)來(lái)構(gòu)建隨機(jī)森林森爽,如下所示:
model <- randomForest(hd ~., data=data.imputed, proximity= TRUE)
在這些參數(shù)中,第1個(gè)參數(shù)不用解釋嚣镜,跟前面的一樣爬迟,第2個(gè)參數(shù)data.imputed
是填充了估計(jì)值后的數(shù)據(jù)集,第3個(gè)參數(shù)是proximity = TRUE
菊匿,它表示要返回相似矩陣付呕,最終我們可以使用這個(gè)數(shù)據(jù)來(lái)進(jìn)行聚類(lèi)计福。
現(xiàn)在我們看一下結(jié)果,如下所示:
> model
Call:
randomForest(formula = hd ~ ., data = data.imputed, proximity = TRUE)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 3
OOB estimate of error rate: 16.83%
Confusion matrix:
Healthy Unhealthy class.error
Healthy 142 22 0.1341463
Unhealthy 29 110 0.2086331
現(xiàn)在說(shuō)明一下這個(gè)結(jié)果徽职,先看第一部分象颖,如下所示:
Call:
randomForest(formula = hd ~ ., data = data.imputed, proximity = TRUE)
這一部分是構(gòu)建隨機(jī)森林的一些參數(shù)。
再看第二部分姆钉,如下所示:
Type of random forest: classification
這一部分的意思是講说订,我們構(gòu)建隨機(jī)森林的類(lèi)型是分類(lèi)(classification),如果我們使用隨機(jī)森林來(lái)預(yù)測(cè)體重或身高這種連續(xù)型變量育韩,那么這個(gè)就是回歸(regression)克蚂,如果我們忽略隨機(jī)森林要預(yù)測(cè)的某個(gè)變量(我的理解就是,即不預(yù)測(cè)分類(lèi)筋讨,也就是說(shuō)不預(yù)測(cè)心臟病,也不預(yù)測(cè)回歸摸恍,也就是說(shuō)不預(yù)測(cè)體重或身高)悉罕,那么這里就是無(wú)監(jiān)督(unsupervised),如下所示:
再看下一部分立镶,如下所示:
Number of trees: 500
這里是說(shuō)壁袄,隨機(jī)森林中有多少棵樹(shù),默認(rèn)的數(shù)字是500媚媒,隨后我們會(huì)看一下500棵樹(shù)能否做出一個(gè)很好的分類(lèi)嗜逻。
再看下一部分,如下所示:
No. of variables tried at each split: 3
這一段文字是說(shuō)缭召,在每個(gè)內(nèi)部節(jié)點(diǎn)上栈顷,使用的變量(也就是列)的數(shù)目,用于分類(lèi)的隨機(jī)森林默認(rèn)使用變量數(shù)目的平方根進(jìn)行計(jì)算嵌巷,例如在這個(gè)案例中萄凤,變量的數(shù)目是13(不包括hd這個(gè)變量),那么13的平方根就是3.6搪哪,取整數(shù)(這里不是四舍五入)靡努,就是3,至于這個(gè)3是不是最好的數(shù)值晓折,我們隨后會(huì)進(jìn)行調(diào)整惑朦,如果是用于回歸的隨機(jī)森林,那么這個(gè)數(shù)字就是變量的數(shù)目除以3漓概,如下所示:
再看下一部分漾月,如下所示:
OOB estimate of error rate: 16.83%
這一部分是出袋錯(cuò)誤率(OOB,即Out-of-Bag)垛耳,這表明栅屏,這個(gè)隨機(jī)森林能夠?qū)?3.5%的OOB樣本正確地歸類(lèi)飘千,如下所示:
最后一部分是混淆矩陣(confusion matrix),如下所示(可能與教程中的有些出入栈雳,但整體相差不大):
Confusion matrix:
Healthy Unhealthy class.error
Healthy 142 22 0.1341463
Unhealthy 29 110 0.2086331
混淆矩陣是總結(jié)分類(lèi)模型預(yù)測(cè)結(jié)果的情形分析表护奈,它以矩陣形式將數(shù)據(jù)集中的記錄按照真實(shí)的類(lèi)別與分類(lèi)模型作出的分類(lèi)判斷兩個(gè)標(biāo)準(zhǔn)進(jìn)行匯總,那么哥纫,在上面的這個(gè)矩陣中霉旗,我們可以看到:
- 有142名健康的病人被正確地標(biāo)記為“健康”;
- 有29名健康的病人被錯(cuò)誤地標(biāo)記為“健康”蛀骇;
- 有22名健康的病人被錯(cuò)誤地標(biāo)記為“不健康”厌秒;
- 有110名不健康的病人被正確地標(biāo)記為“不健康”。
繪制錯(cuò)誤率圖
此時(shí)擅憔,我們看一下鸵闪,500棵樹(shù)能否做出一個(gè)良好的分類(lèi),我們先畫(huà)出錯(cuò)誤率暑诸,繪圖使用的是ggplot2包蚌讼,因此要構(gòu)建一個(gè)數(shù)據(jù)框用于ggplot2的識(shí)別,如下所示:
oob.error.data <- data.frame(
Trees=rep(1:nrow(model$err.rate),times=3),
Type=rep(c("OOB","Healthy","Unhealthy"),each=nrow(model$err.rate)),
Error=c(model$err.rate[,"OOB"],
model$err.rate[,"Healthy"],
model$err.rate[,"Unhealthy"]))
這段代碼有點(diǎn)復(fù)雜个榕,現(xiàn)在解釋一下:
- 這段代碼的大部分都是基于
model
這個(gè)數(shù)據(jù)中的err.rate
來(lái)構(gòu)建的篡石,我們查看下這個(gè)數(shù)據(jù),如下所示:
> head(model$err.rate)
OOB Healthy Unhealthy
[1,] 0.2571429 0.2765957 0.2413793
[2,] 0.2470588 0.2068966 0.2891566
[3,] 0.2783019 0.2758621 0.2812500
[4,] 0.2704918 0.2647059 0.2777778
[5,] 0.2592593 0.2600000 0.2583333
[6,] 0.2597865 0.2467532 0.2755906
> tail(model$err.rate)
OOB Healthy Unhealthy
[495,] 0.1683168 0.1341463 0.2086331
[496,] 0.1683168 0.1341463 0.2086331
[497,] 0.1683168 0.1341463 0.2086331
[498,] 0.1683168 0.1341463 0.2086331
[499,] 0.1683168 0.1341463 0.2086331
[500,] 0.1683168 0.1341463 0.2086331
其中第1列是OOB錯(cuò)誤率西采,第2列是健康患者錯(cuò)誤率(就是說(shuō)有多大的可能性會(huì)把健康患者錯(cuò)誤分類(lèi))凰萨,第3列是不健康患者錯(cuò)誤率(就是說(shuō)有多大的可能性會(huì)把不健康患者錯(cuò)誤分類(lèi))。
每1行表示的是械馆,在構(gòu)建隨機(jī)森林的不同階段的的錯(cuò)誤率胖眷,如下所示:
其中,第1行表示構(gòu)建了第1棵樹(shù)后的錯(cuò)誤率狱杰,如下所示:
第2行表示瘦材,構(gòu)建了前2棵樹(shù)后的錯(cuò)誤率,如下所示:
那么最后1行則表示仿畸,已經(jīng)構(gòu)建了隨機(jī)森林中500棵樹(shù)后的錯(cuò)誤率食棕,如下所示:
因此,使用上述代碼错沽,我們最終生成的數(shù)據(jù)框則是下面的這個(gè)樣本簿晓,如下所示:
> head(oob.error.data)
Trees Type Error
1 1 OOB 0.2571429
2 2 OOB 0.2470588
3 3 OOB 0.2783019
4 4 OOB 0.2704918
5 5 OOB 0.2592593
6 6 OOB 0.2597865
第1列數(shù)字則表示的是隨機(jī)森林中樹(shù)的數(shù)目,如下所示:
第2列則是錯(cuò)誤類(lèi)型千埃,如下所示:
再看一下其他的:
最后1列是錯(cuò)誤的實(shí)際數(shù)值憔儿,如下所示:
調(diào)用ggplot函數(shù),如下所示:
ggplot(data=oob.error.data,aes(x=Trees,y=Error)) +
geom_line(aes(color=Type))
繪圖結(jié)果如下所示:
其中藍(lán)線是對(duì)不健康患者進(jìn)行歸類(lèi)時(shí)的錯(cuò)誤率放可,綠線是總的OOB錯(cuò)誤率谒臼,紅線是對(duì)健康患者進(jìn)行歸類(lèi)時(shí)的錯(cuò)誤率朝刊。通常我們發(fā)現(xiàn),隨著隨機(jī)森林中的樹(shù)越來(lái)越多蜈缤,錯(cuò)誤率是逐步下降的拾氓,如下所示
各項(xiàng)參數(shù)調(diào)整
添加樹(shù)的數(shù)目
我們?cè)囅胍幌拢绻覀冊(cè)黾痈嗟臉?shù)底哥,錯(cuò)誤率會(huì)不會(huì)更低咙鞍,如下所示:
此時(shí),我們將樹(shù)的數(shù)目設(shè)為1000趾徽,如下所示:
model <- randomForest(hd ~., data=data.imputed, ntree = 1000, proximity= TRUE)
這里我們需要注意一下续滋,前面我們并沒(méi)有使用ntree=1000
這個(gè)參數(shù),這是因?yàn)?code>randomForest默認(rèn)的ntree=500
孵奶,因此這個(gè)參數(shù)如果使用默認(rèn)值疲酌,就可以不添加,如果要改變這個(gè)數(shù)字拒课,就需要更改徐勃,現(xiàn)在看一下結(jié)果:
Call:
randomForest(formula = hd ~ ., data = data.imputed, ntree = 1000, proximity = TRUE)
Type of random forest: classification
Number of trees: 1000
No. of variables tried at each split: 3
OOB estimate of error rate: 16.5%
Confusion matrix:
Healthy Unhealthy class.error
Healthy 142 22 0.1341463
Unhealthy 28 111 0.2014388
看一下OOB estimate of error rate: 16.5%
這一行,它的OOB值是16.5%早像,而當(dāng)ntree=500
時(shí),這個(gè)數(shù)值是16.83%肖爵,基本上兩者是相同的卢鹦,我們?cè)倏匆幌?code>ntree=500時(shí)的混淆矩陣,如下所示:
Confusion matrix:
Healthy Unhealthy class.error
Healthy 142 22 0.1341463
Unhealthy 29 110 0.2086331
這兩者的數(shù)值也差不多劝堪,再看一下繪圖結(jié)果冀自,如下所示:
從這個(gè)繪圖結(jié)果來(lái)看,當(dāng)樹(shù)的數(shù)目超過(guò)500后秒啦,錯(cuò)誤率基本上就穩(wěn)定了熬粗,因此我們添加再多的樹(shù),意義不大余境,如下所示:
更改節(jié)點(diǎn)變量數(shù)目
現(xiàn)在我們?cè)賮?lái)看一下構(gòu)建原來(lái)內(nèi)部節(jié)點(diǎn)時(shí)使用的變量數(shù)目驻呐,原來(lái)使用的是3,如下所示:
現(xiàn)在我們改一下這個(gè)數(shù)字芳来,此時(shí)我們需要一個(gè)空向量含末,它所含元素的數(shù)目是10,如下所示:
oob.values <- vector(length = 10)
然后再使用一個(gè)循環(huán)即舌,用于測(cè)試構(gòu)建每個(gè)內(nèi)部節(jié)點(diǎn)的不同變量數(shù)目佣盒,如下所示:
代碼為:
for(i in 1:10){
temp.model <- randomForest(hd ~ .,data=data.imputed, mtry=i,ntree=1000)
oob.values[i] <- temp.model$err.rate[nrow(temp.model$err.rate),1]
}
查看一下輸出結(jié)果:
oob.values
[1] 0.1650165 0.1716172 0.1650165 0.1815182 0.1848185 0.1815182 0.1848185 0.1914191
[9] 0.1881188 0.1881188
其中第3個(gè)數(shù)值對(duì)應(yīng)的就是mtry=3
,它是構(gòu)建隨機(jī)森林的默認(rèn)數(shù)字顽聂,從中我們可以發(fā)現(xiàn)肥惭,這個(gè)數(shù)字基本上是最小的(0.1716172)盯仪,也就是說(shuō)它有最低的OOB錯(cuò)誤率,因此蜜葱,默認(rèn)數(shù)值已經(jīng)是最好的數(shù)值了全景,不過(guò),如果我們不知道最優(yōu)的數(shù)值笼沥,那么就要嘗試一下其他的數(shù)值蚪燕,如下所示:
繪制隨機(jī)森林的MDS圖
最后,我們繪制一下隨機(jī)森林的MDS圖奔浅,首先利用dist()
函數(shù)從1- 相似矩
中構(gòu)建一個(gè)距離矩陣馆纳,如下所示:
distance.matrix <- dist(1-model$proximity)
然后使用縮放函數(shù)cmdscale
,再計(jì)算距離矩陣的x軸與y軸的占總變異的百分比汹桦,如下所示:
mds.stuff <- cmdscale(distance.matrix,eig=TRUE,x.ret=TRUE)
mds.var.per <- round(mds.stuff$eig/sum(mds.stuff$eig)*100,1)
構(gòu)建ggplot繪圖的數(shù)據(jù)集并繪圖鲁驶,如下所示:
mds.values <- mds.stuff$points
mds.data <- data.frame(Sample = rownames(mds.values),
X=mds.values[,1],
Y=mds.values[,2],
Status=data.imputed$hd)
ggplot(data=mds.data, aes(x=X, y=Y, label=Sample)) +
geom_text(aes(color=Status)) +
theme_bw()+
xlab(paste("MDS1 - ", mds.var.per[1], "%", sep="")) +
ylab(paste("MDS2 - ", mds.var.per[2], "%", sep="")) +
ggtitle("MDS plot using(1 - Random Forest Proximities)")
最終繪圖結(jié)果如下所示:
從圖上我們可以得到如下信息:
- 不健康的患者位于左側(cè),健康的患者位于右側(cè)舞骆;
- 但在左側(cè)钥弯,有幾個(gè)患者被錯(cuò)誤歸類(lèi)了(綠色中的紅色文字);
- 我們?cè)倏匆幌聏軸督禽,可以發(fā)現(xiàn)脆霎,MDS1占了總變異的47.7%,y軸上是MDS2狈惫,它占據(jù)了總異的14.2%睛蛛;
- 整個(gè)圖形呈一個(gè)V型(教程中是倒V型,我不太理解為什么我繪圖出來(lái)是反的)胧谈,它的開(kāi)口是朝上x(chóng)軸的相反方向的忆肾,這表明,在V型的兩臂上菱肖,兩個(gè)樣本相離得越遠(yuǎn)客冈,他們之間的差異就越大;
- 如果我們拿到一個(gè)新的患者的數(shù)據(jù)稳强,在不知道他是否得了心臟病的情況下场仲,如果經(jīng)計(jì)算,他被歸類(lèi)到V型的左臂键袱,那么我們就可以得到一個(gè)肯定的結(jié)論燎窘,他得了心臟病,如下所示: