StatQuest學(xué)習(xí)筆記20——隨機(jī)森林

前言——主要內(nèi)容

這篇筆記是StatQuest系列視頻的第53-55節(jié)弃理,其中第53節(jié)講的是隨機(jī)森林,第54節(jié)講的是缺失值的處理,第55節(jié)講的是R與隨機(jī)森林。

決策樹(shù)的局限

隨機(jī)森林(Random Forests)來(lái)源于決策樹(shù)治筒,因此如果不了解決策樹(shù)的話,可以看上一篇筆記舷蒲,決策樹(shù)如下所示:

image

決策樹(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í)工具,如下所示:

image

換句話說(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ù)格带,如下所示:

image

隨機(jī)森林的優(yōu)勢(shì)

隨機(jī)森林綜合了決策樹(shù)簡(jiǎn)潔的特征撤缴,同時(shí)又具備靈活性,因此隨機(jī)森林在精確性方面也得到了極大的提高叽唱,如下所示:

image

構(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)虎眨,如下所示:

image

下面是原始的數(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ù)集非常小涝缝,但是不影響使用扑庞,如下所示:

image

為了構(gòu)建一個(gè)與原始數(shù)據(jù)集同樣大小的自舉數(shù)據(jù)集(bootstrapped dataset),我們僅需要隨機(jī)地從原始數(shù)據(jù)中挑選樣本即可俊卤,這個(gè)隨機(jī)挑選的過(guò)程是有放回地挑選(這就是bootstrap)嫩挤,也就是我從原始數(shù)據(jù)集中隨機(jī)挑一個(gè)樣本,然后放回去消恍,再隨機(jī)挑一個(gè)樣本岂昭,這樣的話,相同有樣本有可能被挑中好幾次狠怨,如下所示:

image

我們先隨機(jī)挑一個(gè)樣本约啊,這次挑中了第2個(gè)樣本,如下所示:

image

把這個(gè)樣本放到我們的自舉數(shù)據(jù)集中佣赖,就成了自舉數(shù)據(jù)集中的第1個(gè)樣本恰矩,如下所示:

image

再隨機(jī)挑一個(gè)樣本,這次挑中了原始數(shù)據(jù)集中的第1個(gè)樣本憎蛤,把它放到我們的自舉數(shù)據(jù)集中外傅,就是自舉數(shù)據(jù)集中的第2個(gè)樣本纪吮,如下所示:

image

再?gòu)脑紨?shù)據(jù)中隨機(jī)挑一個(gè),放到自舉數(shù)據(jù)集中萎胰,如下所示:

image

再隨機(jī)挑一個(gè)碾盟,放到自舉數(shù)據(jù)集中,這里需要注意的是技竟,我們挑了兩次原始數(shù)據(jù)集中第4個(gè)樣本冰肴,這樣在自舉數(shù)據(jù)集中就有了2個(gè)重復(fù)的樣本,這個(gè)沒(méi)關(guān)系榔组,如下所示:

image

此時(shí)熙尉,我們就構(gòu)建好了一個(gè)自舉數(shù)據(jù)集,這個(gè)自舉數(shù)據(jù)集的大小與原始數(shù)據(jù)集的大小相同搓扯,也就是說(shuō)有同樣數(shù)目的樣本检痰,如下所示:

image

第二步:構(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ì)講解,如下所示:

image

因此境钟,我們不會(huì)使用所有的4個(gè)變量來(lái)區(qū)分根節(jié)點(diǎn)锦担,如下所示:

image

而是隨機(jī)選擇2個(gè)變量來(lái)區(qū)分根節(jié)點(diǎn),如下所示:

image

在這個(gè)案例中慨削,我們隨機(jī)使用良好血液循環(huán)(Good Blood Circulation)動(dòng)脈阻塞(Blocked Arteries)這兩個(gè)變量來(lái)區(qū)分根節(jié)點(diǎn)洞渔,如下所示:

image

就像我們這個(gè)案例的目的一樣,我們假設(shè)良好血液循環(huán)(Good Blood Circulation)能夠很好地區(qū)分樣本缚态,我們就用它作為根節(jié)點(diǎn)磁椒,如下所示:

image

由于我們使用過(guò)了良好血液循環(huán)(Good Blood Circulation)這個(gè)變量,因此這里把它變灰玫芦,以便于我們研究剩余的變量浆熔,如下所示:

image

現(xiàn)在我們看一下中間節(jié)點(diǎn)如何區(qū)分,如下所示:

image

與根節(jié)點(diǎn)一樣桥帆,我們并不使用剩余的所有3個(gè)變量医增,而是隨機(jī)選擇2個(gè)變量用于區(qū)分,如下所示:

image

接著老虫,我們就像以前構(gòu)建決策樹(shù)那樣叶骨,構(gòu)建樹(shù),不過(guò)我們一次只使用一個(gè)變量的隨機(jī)亞集祈匙,如下所示:

image

最終的結(jié)果如下所示:

image

現(xiàn)在回顧一下我們構(gòu)建這個(gè)樹(shù)的過(guò)程:第一步忽刽,構(gòu)建自舉數(shù)據(jù)集;第二步,每一步隨機(jī)選擇一個(gè)變量亞集來(lái)構(gòu)建節(jié)點(diǎn)跪帝,如下所示:

image

第三步:循環(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ù))纸泄,如下所示:

image

不斷地重復(fù)這個(gè)過(guò)程赖钞,重復(fù)100次,這樣我們會(huì)構(gòu)建一系列的樹(shù)聘裁,下圖只是顯示了其中的6種樹(shù)雪营,如下所示:

image

通過(guò)利用一個(gè)自舉樣本,一次只利用變量的一個(gè)隨機(jī)亞集衡便,就會(huì)產(chǎn)生大量不同的樹(shù)献起,這些樹(shù)就構(gòu)成了隨機(jī)森林(一次生成一棵樹(shù),多次運(yùn)算镣陕,就是多棵樹(shù)谴餐,也就是森林了),它遠(yuǎn)比單一的決策樹(shù)有效呆抑,如下所示:

image

隨機(jī)森林的使用

此時(shí)岂嗓,我們已經(jīng)學(xué)會(huì)了構(gòu)建隨機(jī)森林的基本思想,那么隨機(jī)森林有什么用處呢鹊碍,如下所示:

image

我們看一個(gè)案例厌殉,例如,我們遇到了一個(gè)新病人侈咕,他的各種參數(shù)如下所示:

image

現(xiàn)在我們想知道公罕,他是否得有心臟病,如下所示:

image

那么耀销,我們把他的數(shù)據(jù)放到我們生成隨機(jī)森林中楼眷,先放到第1棵樹(shù)上,如下所示:

image

運(yùn)算結(jié)果顯示Yes树姨,此時(shí)記錄一下這個(gè)數(shù)據(jù)摩桶,如下所示:

image

現(xiàn)在把這個(gè)人的參數(shù)放到隨機(jī)森林中的第2棵樹(shù)上運(yùn)行,如下所示:

image

計(jì)算結(jié)果是Yes帽揪,此時(shí)記錄下這個(gè)數(shù)據(jù)硝清,如下所示:

image

我們把這個(gè)人的數(shù)據(jù)再放到隨機(jī)森林中的其他的樹(shù)中運(yùn)算,如下所示:

image

總之转晰,就是不斷地放到不同的樹(shù)上運(yùn)算芦拿,如下所示:

image

當(dāng)運(yùn)算結(jié)果后士飒,我們記錄下所有樹(shù)的運(yùn)算結(jié)果,我們會(huì)看到Y(jié)es或No哪個(gè)得票最多蔗崎,如下所示:

image

在這個(gè)案例中酵幕,明顯Yes得票最多,因此我們就能下結(jié)論缓苛,這個(gè)人得了心臟病芳撒,如下所示:

image

隨機(jī)森林相關(guān)術(shù)語(yǔ)

自舉數(shù)據(jù)并對(duì)它們進(jìn)行匯總做出的決策稱為袋裝法(Bagging),如下所示:

image

隨機(jī)森林的評(píng)估

我們已經(jīng)了解了隨機(jī)森林構(gòu)建的基本思想未桥,也知道了如何使用它笔刹,此時(shí)可能還有一個(gè)問(wèn)題,這個(gè)模型的好壞程度到底如何冬耿,如下所示:

image

我們回到前面構(gòu)建自舉數(shù)據(jù)集的內(nèi)容舌菜,我們?cè)谇拔闹姓f(shuō)過(guò),在一個(gè)自舉數(shù)據(jù)集中亦镶,我們?cè)试S兩條相同的記錄(entry日月,記錄可以理解為一個(gè)樣本,也就是一行數(shù)據(jù))存在缤骨,如下所示:

image

最終在自舉數(shù)據(jù)集中爱咬,沒(méi)有包含原始數(shù)據(jù)集中的第3條目錄,如下所示:

image

通常來(lái)說(shuō)荷憋,大概會(huì)有三分之一的原始數(shù)據(jù)集中的記錄不會(huì)包含在自舉數(shù)據(jù)集中台颠,如下所示:

image

下圖的右側(cè)就是那條未包含在自舉數(shù)據(jù)集中的記錄褐望,如下所示:

image

如果原始數(shù)據(jù)集非常大的話勒庄,那么就有不止一條記錄不包含在自舉數(shù)據(jù)集中,如下所示:

image

這些不包含在自舉數(shù)據(jù)集上的記錄被稱為“出袋數(shù)據(jù)集”(out-of-bag dataset瘫里,未找到相應(yīng)的中文譯名实蔽,此處暫譯為“出袋數(shù)據(jù)集”),這樣命名主要是因?yàn)榻鞫粒绻炎耘e數(shù)據(jù)集看成一個(gè)袋子局装,這些數(shù)據(jù)并不在這個(gè)袋子中,如下所示:

image

由于這些出袋數(shù)據(jù)集并沒(méi)有用于構(gòu)建這些樹(shù)劳殖,如下所示:

image

因此铐尚,我們可以把這個(gè)數(shù)據(jù)集當(dāng)作是一個(gè)新的樣本,把它放到隨機(jī)森林中計(jì)算哆姻,看能不能得到想要的結(jié)果(沒(méi)得心臟残觥),如下所示:

image

在這個(gè)案例中矛缨,這個(gè)樣本最終的計(jì)算結(jié)果是No爹脾,也就是沒(méi)得心臟病帖旨,如下所示:

image

然后我們把這些出袋數(shù)據(jù)集放到其他樹(shù)中計(jì)算,如下所示:

image

有一個(gè)樹(shù)計(jì)算的結(jié)果是Yes灵妨,這個(gè)明顯是錯(cuò)誤的,如下所示:

image

其他的樹(shù)計(jì)算結(jié)果是No,如下所示:

image

對(duì)所有樹(shù)的計(jì)算結(jié)果進(jìn)行統(tǒng)計(jì)折晦,我們發(fā)現(xiàn)教沾,No的得票最多,那么我們就能下結(jié)論朱转,這個(gè)樣本的結(jié)果是沒(méi)得心臟病碉熄,與樣本本身的結(jié)果一致,如下所示:

image

我們對(duì)其他的出袋數(shù)據(jù)集繼續(xù)進(jìn)行計(jì)算(出袋數(shù)據(jù)據(jù)不止一個(gè)樣本肋拔,有很多)锈津,這個(gè)樣本的結(jié)果是Yes,與樣本本身的結(jié)果一致凉蜂,如下所示:

image

再計(jì)算另外的樣本琼梆,樣本本身的結(jié)果是No,但計(jì)算出來(lái)的結(jié)果卻是Yes窿吩,并不一致茎杂,如下所示:

image

經(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ò)誤”)忌愚,如下所示:

image

至此曲管,我們了解了這些內(nèi)容:第一,構(gòu)建隨機(jī)森林硕糊;第二院水,使用隨機(jī)森林;第三简十,評(píng)估隨機(jī)森林的精確性檬某。

既然我們知道了如何評(píng)估隨機(jī)森林的精確性,那么此時(shí)我們?cè)倩氐降谝徊糠置私庖幌码S機(jī)森林是的構(gòu)建原理恢恼,如下所示:

image

在構(gòu)建隨機(jī)森林時(shí),我們最初在每一步中胶逢,使用的是隨機(jī)選擇的2個(gè)變量厅瞎,如下所示:

image

現(xiàn)在我們就要比較一下饰潜,使用隨機(jī)選擇的2個(gè)變量與3個(gè)變量導(dǎo)致的出袋錯(cuò)誤的差異,我們測(cè)試一些不同的參數(shù)和簸,來(lái)研究一下如何選擇一個(gè)最為精確的隨機(jī)森林彭雾,如下所示:

image

換句話講,我們做上述事件的順序是:

第一锁保,構(gòu)建隨機(jī)森林薯酝;

第二,評(píng)估隨機(jī)森林的精確性爽柒。

接著吴菠,改變每一個(gè)步驟中的變量數(shù)目,不斷地重復(fù)這個(gè)過(guò)程浩村,得到一個(gè)最精確的隨機(jī)森林做葵,如下所示:

image

通常來(lái)說(shuō),我們最初使用的變量數(shù)目為總變量數(shù)目的平方根心墅,例如在前面的案例中酿矢,總變量數(shù)目是4,它的平方根是2怎燥,那么我們一開(kāi)始就先使用2個(gè)變量作為每次運(yùn)算時(shí)變量的數(shù)目瘫筐,然后在這個(gè)數(shù)目上下進(jìn)行調(diào)整,如下所示:

image

在構(gòu)建隨機(jī)森林的過(guò)程中我們可能會(huì)遇到缺失值铐姚,缺失值有兩種策肝,我們先看第一種缺失值的處理。

第一種缺失值的處理

我們看一下我們的原始數(shù)據(jù)隐绵,如下所示:

image

原始數(shù)據(jù)一共是4個(gè)患者之众,其中第4名患者有2個(gè)數(shù)據(jù)缺失,用問(wèn)號(hào)表示氢橙,如下所示:

image

隨機(jī)森林中有2類(lèi)缺失值酝枢,分別為:第一,用于構(gòu)建隨機(jī)森林的原始數(shù)據(jù)集中的數(shù)據(jù)缺失悍手,就是上面的情況;第二袍患,用于歸類(lèi)的坦康,一個(gè)新的樣本中的數(shù)據(jù)缺失情況,如下所示:

image

我們先講第一種數(shù)據(jù)的缺失情況诡延,如下所示:

image

我們要從上面的原始數(shù)據(jù)集中構(gòu)建隨機(jī)森林滞欠,但是不清楚第4個(gè)患者的動(dòng)脈阻塞與體重?cái)?shù)據(jù),如下所示:

image

處理這種缺失數(shù)據(jù)的常規(guī)方式是觀察其他數(shù)據(jù)肆良,先做出一個(gè)可能不太好的初始猜測(cè)筛璧,然后逐步改進(jìn)這個(gè)猜測(cè)逸绎,直到這個(gè)猜測(cè)變得比較好為止(希望如此),如下所示:

image

現(xiàn)在我們就做這樣的猜測(cè)夭谤,我們先看血管阻塞這個(gè)變量棺牧,然后找到這個(gè)變量出現(xiàn)最多的數(shù)據(jù)就可做出猜測(cè),如下所示:

image

我們發(fā)現(xiàn)朗儒,在這個(gè)變量中颊乘,No出現(xiàn)的頻率最高(2個(gè)No,1個(gè)Yes)醉锄,如下所示:

image

因此乏悄,我們就可以猜測(cè),在這個(gè)變量中恳不,第4個(gè)患者的值可能是No檩小,如下所示:

image

猜測(cè)完血管阻塞這個(gè)變量中的缺失值后,我們?cè)俨聹y(cè)一下體重這個(gè)變量在第4個(gè)患者中的缺失值烟勋,體重是一種連續(xù)型變量(數(shù)值)识啦,因此我們可以看一下這個(gè)變量中其他數(shù)值的中位數(shù)即可(在決策樹(shù)中,這種缺失值的處理神妹,要么使用中位數(shù)颓哮,要么使用中位數(shù)),如下所示:

image

在其他的患者中鸵荠,體重這個(gè)變量的中位數(shù)是180冕茅,因此我們就可以把第4個(gè)患者的體重缺失值寫(xiě)為180,如下所示:

image

經(jīng)過(guò)這樣的處理蛹找,原始數(shù)據(jù)中缺失的數(shù)據(jù)就填充好了姨伤,如下所示:

image

填充好缺失值后,我們還要評(píng)估這些數(shù)據(jù)猜測(cè)得到底合理不合理庸疾,現(xiàn)在就需要看一下哪些樣本與含有缺失值的樣本比較類(lèi)似乍楚,接著我們就會(huì)講一下這種相似性如何計(jì)算,如下所示:

image

第一步:構(gòu)建隨機(jī)森林届慈,如下所示:

image

第二步:將所有的原始數(shù)據(jù)放到隨機(jī)森林中運(yùn)行徒溪,如下所示:

image

我們先在隨機(jī)森林中的第1棵樹(shù)上運(yùn)行,如下所示:

image

把所有患者的數(shù)據(jù)依次放進(jìn)去金顿,如下所示:

image

這4個(gè)患者的數(shù)據(jù)經(jīng)過(guò)計(jì)算后臊泌,我們會(huì)發(fā)現(xiàn),患者3和患者4最終位于同一片葉子節(jié)點(diǎn)上揍拆,如下所示:

image

這就說(shuō)明渠概,第3個(gè)患者與第4個(gè)患者相似,如下所示:

image

相似性矩陣

現(xiàn)在我們用一個(gè)相似性矩陣(Proximity Matrix)來(lái)研究相似的患者數(shù)據(jù)嫂拴,如下所示:

image

相似性矩陣的每行代表一個(gè)樣本播揪,如下所示:

image

相似性矩陣的每列也代表一個(gè)樣本贮喧,如下所示:

image

因?yàn)榈?個(gè)樣本與第4個(gè)樣本最終位于同一個(gè)葉子節(jié)點(diǎn)上,如下所示:

image

我們把患者3和患者4交叉的地方填上1猪狈,如下所示:

image

此外箱沦,還有一個(gè)交叉點(diǎn),也填上1罪裹,如下所示:

image

由于在隨機(jī)森林中第1棵樹(shù)上運(yùn)行后饱普,除了第3個(gè)患者和第4個(gè)患者的最終結(jié)果相同外,并沒(méi)有其他的患者結(jié)果相同状共,因此我們?cè)诘?棵樹(shù)上運(yùn)行后套耕,得到的相似性矩陣就如下所示:

image

現(xiàn)在我們把所有的數(shù)據(jù)放到隨機(jī)森林的第2棵樹(shù)上運(yùn)行,如下所示:

image

運(yùn)行過(guò)程如下所示:

image

最終我們發(fā)現(xiàn)峡继,患者2冯袍,患者3和患者4位于同一個(gè)葉子節(jié)點(diǎn)上,如下所示:

image

我們?cè)倏匆幌履肱疲?jīng)過(guò)第1棵樹(shù)運(yùn)行后的相似性矩陣如下所示:

image

經(jīng)過(guò)第2棵樹(shù)的運(yùn)算康愤,我們把有相同結(jié)果的患者交叉處填上1,如果原來(lái)的交叉位置有1舶吗,就加1征冷,如下所示:

image

從中我們可以看到,患者3和患者4還是位于同一個(gè)葉子節(jié)點(diǎn)上誓琼,因此就在原有的基礎(chǔ)上再加1检激,如下所示:

image

患者2和患者3位于同一個(gè)節(jié)點(diǎn),患者2和患者4位于同一個(gè)節(jié)點(diǎn)腹侣,如下所示:

image

現(xiàn)在我們把所有的數(shù)據(jù)放到第3棵樹(shù)上運(yùn)行叔收,如下所示:

image

得到結(jié)果后,我們?cè)俑乱幌孪嗨菩跃仃嚢亮ィ缦滤荆?/p>

image

其中我們發(fā)現(xiàn)饺律,患者3和患者4還是位于同一個(gè)節(jié)點(diǎn)上,再加1跺株,如下所示:

image

最終复濒,我們運(yùn)行完所有的樹(shù),得到一個(gè)最終的相似性矩陣帖鸦,如下所示:

image

然后芝薇,我們把這個(gè)相似性矩陣中的所有值除以所有樹(shù)的數(shù)目,在這個(gè)案例中作儿,所有的樹(shù)的數(shù)目是10,得到結(jié)果如下所示:

image

現(xiàn)在我們使用這個(gè)近似矩陣來(lái)評(píng)估一下我們對(duì)缺失值猜測(cè)的效果如何馋劈,如下所示:

image

對(duì)于動(dòng)脈阻塞這個(gè)變量來(lái)說(shuō)攻锰,我們使用這個(gè)近似值來(lái)計(jì)算Yes與No的加權(quán)頻率晾嘶,對(duì)于體重缺失值的處理,也是如此娶吞,如下所示:

image

其中動(dòng)脈阻塞這個(gè)變量中垒迂,除了缺失值外,在剩下的數(shù)據(jù)中妒蛇,Yes的頻率是1/3机断,No的頻率是2/3,如下所示:

image

那么對(duì)Yes的加權(quán)頻率計(jì)算如下所示:

image

患者2中Yes對(duì)應(yīng)的近似值為0.1绣夺,如下所示:

image

然后除以患者4中所有近似值的和吏奸,如下所示:

image

Yes的權(quán)重是0.1,如下所示:

image

那么Yes的加權(quán)頻率就是0.03陶耍,如下所示:

image

再來(lái)計(jì)算No的權(quán)加頻率奋蔚,如下所示:

image

它的公式為:

image

No的權(quán)重是0.9,如下所示:

image

最終計(jì)算結(jié)果是0.6烈钞,我們發(fā)現(xiàn)泊碑,No的加權(quán)頻率更高,也就是說(shuō)毯欣,我們可以在這個(gè)缺失值處填上No馒过,如下所示:

image

對(duì)于體重缺失值的處理,我們也是采用近似值來(lái)計(jì)算它的加權(quán)平均數(shù)酗钞,如下所示:

image

加權(quán)平均數(shù)的的公式如下所示:

image

第一個(gè)樣本的加權(quán)平均體重是0.1腹忽,用125乘以它即可,如下所示:

image

接著計(jì)算患者2的權(quán)加平均數(shù)算吩,如下所示:

image

最終計(jì)算出加權(quán)平均數(shù)留凭,如下所示:

image

此時(shí),把這個(gè)結(jié)果(也就是198.5)填到缺失值處偎巢,如下所示:

image

現(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ù)不再變化為止)但金,如下所示:

image

相似矩陣的拓展

這里我們先看一下相似矩陣的一些很有意思的東西韭山,如下所示:

image

我們?cè)倏匆幌略诔?0(隨機(jī)森林的所有樹(shù)的數(shù)目)之間前的相似矩陣,如下所示:

image

如果樣本3和樣本4最終都落在了所有的10個(gè)樹(shù)的同一個(gè)葉子節(jié)點(diǎn)上,那么上述的數(shù)字8就是10钱磅,如下所示:

image

我們?cè)俪?0(所有樹(shù)的數(shù)目)梦裂,我們就看到在這個(gè)相似矩陣中最大的數(shù)值就是1,如下所示:

image

在這個(gè)近似矩陣中盖淡,1意味著這兩個(gè)樣本是盡可能接近的年柠,如下所示:

image

此時(shí),我們用1減去這些近似值褪迟,就得到了某個(gè)距離冗恨,那么樣本3和樣本4的近似值是1,1減去1味赃,就是0掀抹,也就是說(shuō)這兩個(gè)樣本之間沒(méi)有距離,如下所示:

image

樣本1和樣本4之間的的估計(jì)值是0.1洁桌,用1減去這個(gè)數(shù)值渴丸,得到0.9,那么這就表示另凌,這兩個(gè)樣本的距離很大谱轨,也就表示它們之間離得遠(yuǎn),如下所示:

image

我們把1減去這個(gè)近似值矩陣得到的新矩陣稱為距離矩陣(distance matrix)吠谢,畫(huà)出熱圖就是下面的這個(gè)樣子:

image

我們也可以繪制出MDS圖土童,如下所示:

image

我們對(duì)相似矩陣的這些拓展計(jì)算很有意思,因?yàn)楣し唬瑹o(wú)論你的數(shù)據(jù)是什么形式(有序數(shù)據(jù)献汗,多個(gè)選擇,連續(xù)型數(shù)據(jù))王污,如果我們使用這些數(shù)據(jù)構(gòu)建一個(gè)樹(shù)罢吃,我們就能畫(huà)出熱圖或者是MDS圖,用于研究不同樣本的之間的相似性昭齐,如下所示:

image

第二種缺失值的處理

此時(shí)尿招,再回到缺失值的處理上來(lái)捶惜,前面我們只是介紹了一種缺失值的處理枢希,也就是用于構(gòu)建隨機(jī)森林的原始數(shù)據(jù)中的缺失值處理望薄,現(xiàn)在我們介紹一下另外一種缺失值的處理捷绑,也就是我們想用于分類(lèi)的新的樣本中的缺失值處理,如下所示:

image

試想乘寒,我們已經(jīng)通過(guò)現(xiàn)有的數(shù)據(jù)構(gòu)建了一個(gè)隨機(jī)森林辱魁,此時(shí)我們要將下面的的這個(gè)患者進(jìn)行分類(lèi)翻伺,不過(guò)他的一個(gè)動(dòng)脈阻塞參數(shù)是缺失的喧枷,如下所示:

image

但我們還是想要知道這個(gè)患者是否患有心臟病虹统,如下所示:

image

但我們不知道動(dòng)脈阻塞這個(gè)參數(shù)弓坞,因此我們需要對(duì)這個(gè)參數(shù)進(jìn)行一個(gè)猜測(cè),其過(guò)程就是把這個(gè)患者的其他參數(shù)放到隨機(jī)森林中運(yùn)行窟却,如下所示:

image

第一步:我們先猜測(cè)這個(gè)患者得了心臟病與不得心臟病這兩種情況昼丑,做出兩份數(shù)據(jù)呻逆,如下所示:

image

然后我們使用先前提到的迭代方法來(lái)對(duì)這動(dòng)脈阻塞這個(gè)參數(shù)進(jìn)行猜測(cè)夸赫,如下所示:

image

猜測(cè)結(jié)果一個(gè)是Yes,一個(gè)是No咖城,如下所示:

image

然后把這兩個(gè)數(shù)據(jù)放到隨機(jī)森林中運(yùn)算茬腿,如下所示:

image

然后我們觀察這兩個(gè)數(shù)據(jù)在隨機(jī)森林中的運(yùn)行結(jié)果,看一下哪個(gè)結(jié)果數(shù)目最多宜雀,如下所示:

image

在第一個(gè)數(shù)據(jù)中切平,所有的3個(gè)樹(shù)都標(biāo)記了其為Yes,如下所示:

image

在第二個(gè)數(shù)據(jù)中辐董,只有一個(gè)樹(shù)正確地標(biāo)記了No悴品,如下所示:

image

因此第一個(gè)數(shù)據(jù)是正確的數(shù)據(jù),因?yàn)樗械臉?shù)中它被正確計(jì)算的次數(shù)最多简烘,如下所示:

image

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ù)集届氢,如下所示:

image

代碼如下所示:

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惊搏。

cpchest pain的縮寫(xiě)贮乳,其數(shù)值是1-3,這個(gè)范圍表示不同類(lèi)型的胸痛恬惯,4表示沒(méi)有胸痛向拆。

cathal是因子數(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就足夠了,如下所示:

image

運(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ì)算,如下所示:

image

構(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),如下所示:

image

再看下一部分立镶,如下所示:

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漓概,如下所示:

image

再看下一部分漾月,如下所示:

        OOB estimate of  error rate: 16.83%

這一部分是出袋錯(cuò)誤率(OOB,即Out-of-Bag)垛耳,這表明栅屏,這個(gè)隨機(jī)森林能夠?qū)?3.5%的OOB樣本正確地歸類(lèi)飘千,如下所示:

image

最后一部分是混淆矩陣(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è)矩陣中霉旗,我們可以看到:

  1. 有142名健康的病人被正確地標(biāo)記為“健康”;
  2. 有29名健康的病人被錯(cuò)誤地標(biāo)記為“健康”蛀骇;
  3. 有22名健康的病人被錯(cuò)誤地標(biāo)記為“不健康”厌秒;
  4. 有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)在解釋一下:

  1. 這段代碼的大部分都是基于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ò)誤率胖眷,如下所示:

image

其中,第1行表示構(gòu)建了第1棵樹(shù)后的錯(cuò)誤率狱杰,如下所示:

image

第2行表示瘦材,構(gòu)建了前2棵樹(shù)后的錯(cuò)誤率,如下所示:

image

那么最后1行則表示仿畸,已經(jīng)構(gòu)建了隨機(jī)森林中500棵樹(shù)后的錯(cuò)誤率食棕,如下所示:

image

因此,使用上述代碼错沽,我們最終生成的數(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ù)目,如下所示:

image

第2列則是錯(cuò)誤類(lèi)型千埃,如下所示:

image

再看一下其他的:

image

最后1列是錯(cuò)誤的實(shí)際數(shù)值憔儿,如下所示:

image

調(diào)用ggplot函數(shù),如下所示:

ggplot(data=oob.error.data,aes(x=Trees,y=Error)) +
  geom_line(aes(color=Type))

繪圖結(jié)果如下所示:

image

其中藍(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ò)誤率是逐步下降的拾氓,如下所示

image

各項(xiàng)參數(shù)調(diào)整

添加樹(shù)的數(shù)目

我們?cè)囅胍幌拢绻覀冊(cè)黾痈嗟臉?shù)底哥,錯(cuò)誤率會(huì)不會(huì)更低咙鞍,如下所示:

image

此時(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é)果冀自,如下所示:

image

從這個(gè)繪圖結(jié)果來(lái)看,當(dāng)樹(shù)的數(shù)目超過(guò)500后秒啦,錯(cuò)誤率基本上就穩(wěn)定了熬粗,因此我們添加再多的樹(shù),意義不大余境,如下所示:

image

更改節(jié)點(diǎn)變量數(shù)目

現(xiàn)在我們?cè)賮?lái)看一下構(gòu)建原來(lái)內(nèi)部節(jié)點(diǎn)時(shí)使用的變量數(shù)目驻呐,原來(lái)使用的是3,如下所示:

image

現(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ù)目佣盒,如下所示:

image

代碼為:

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ù)值蚪燕,如下所示:

image

繪制隨機(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é)果如下所示:

image

從圖上我們可以得到如下信息:

  1. 不健康的患者位于左側(cè),健康的患者位于右側(cè)舞骆;
  2. 但在左側(cè)钥弯,有幾個(gè)患者被錯(cuò)誤歸類(lèi)了(綠色中的紅色文字);
  3. 我們?cè)倏匆幌聏軸督禽,可以發(fā)現(xiàn)脆霎,MDS1占了總變異的47.7%,y軸上是MDS2狈惫,它占據(jù)了總異的14.2%睛蛛;
  4. 整個(gè)圖形呈一個(gè)V型(教程中是倒V型,我不太理解為什么我繪圖出來(lái)是反的)胧谈,它的開(kāi)口是朝上x(chóng)軸的相反方向的忆肾,這表明,在V型的兩臂上菱肖,兩個(gè)樣本相離得越遠(yuǎn)客冈,他們之間的差異就越大;
  5. 如果我們拿到一個(gè)新的患者的數(shù)據(jù)稳强,在不知道他是否得了心臟病的情況下场仲,如果經(jīng)計(jì)算,他被歸類(lèi)到V型的左臂键袱,那么我們就可以得到一個(gè)肯定的結(jié)論燎窘,他得了心臟病,如下所示:
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹄咖,一起剝皮案震驚了整個(gè)濱河市褐健,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖蚜迅,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舵匾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谁不,警方通過(guò)查閱死者的電腦和手機(jī)坐梯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刹帕,“玉大人吵血,你說(shuō)我怎么就攤上這事⊥的纾” “怎么了蹋辅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挫掏。 經(jīng)常有香客問(wèn)我侦另,道長(zhǎng),這世上最難降的妖魔是什么尉共? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任褒傅,我火速辦了婚禮,結(jié)果婚禮上袄友,老公的妹妹穿的比我還像新娘殿托。我一直安慰自己,他們只是感情好剧蚣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布碌尔。 她就那樣靜靜地躺著,像睡著了一般券敌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柳洋,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天待诅,我揣著相機(jī)與錄音,去河邊找鬼熊镣。 笑死卑雁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绪囱。 我是一名探鬼主播测蹲,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鬼吵!你這毒婦竟也來(lái)了扣甲?” 一聲冷哼從身側(cè)響起汰寓,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎症副,沒(méi)想到半個(gè)月后决摧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡示辈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年寥茫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矾麻。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纱耻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出险耀,到底是詐尸還是另有隱情弄喘,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布胰耗,位于F島的核電站限次,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柴灯。R本人自食惡果不足惜卖漫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赠群。 院中可真熱鬧羊始,春花似錦、人聲如沸查描。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冬三。三九已至匀油,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勾笆,已是汗流浹背敌蚜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窝爪,地道東北人弛车。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蒲每,于是被迫代替她去往敵國(guó)和親纷跛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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