生活随笔
收集整理的這篇文章主要介紹了
机器学习基础——RandomForest
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
隨機(jī)森林(Random Forest):
??? 隨機(jī)森林是一個(gè)最近比較火的算法,它有很多的優(yōu)點(diǎn):
- ??? 在數(shù)據(jù)集上表現(xiàn)良好
- ??? 在當(dāng)前的很多數(shù)據(jù)集上,相對(duì)其他算法有著很大的優(yōu)勢(shì)
- ??? 它能夠處理很高維度(feature很多)的數(shù)據(jù),并且不用做特征選擇
- ??? 在訓(xùn)練完后,它能夠給出哪些feature比較重要
- ??? 在創(chuàng)建隨機(jī)森林的時(shí)候,對(duì)generlization error使用的是無偏估計(jì)
- ??? 訓(xùn)練速度快
- ??? 在訓(xùn)練過程中,能夠檢測(cè)到feature間的互相影響
- ??? 容易做成并行化方法
- ??? 實(shí)現(xiàn)比較簡單
? ? 隨機(jī)森林最早由Leo Breiman與Adele Cutler提出,
隨機(jī)森林顧名思義,是用隨機(jī)的方式建立一個(gè)森林,森林里面有很多的決策樹組成,隨機(jī)森林的每一棵決策樹之間是沒有關(guān)聯(lián)的(跟Adaboost相反,Adaboost的每個(gè)基學(xué)習(xí)器互相相關(guān)。)。在得到森林之后,當(dāng)有一個(gè)新的輸入樣本進(jìn)入的時(shí)候,就讓森林中的每一棵決策樹分別進(jìn)行一下判斷,看看這個(gè)樣本應(yīng)該屬于哪一類(對(duì)于分類算法),然后看看哪一類被選擇最多,就預(yù)測(cè)這個(gè)樣本為那一類。
??? 在建立每一棵決策樹的過程中,有兩點(diǎn)需要注意 - 采樣與完全分裂。首先是兩個(gè)隨機(jī)采樣的過程,random forest對(duì)輸入的數(shù)據(jù)要進(jìn)行行的采樣(即樣本的采樣)和列的采樣(特征的采樣)。對(duì)于行采樣,采用有放回的方式,也就是在采樣得到的樣本集合中,可能有重復(fù)的樣本。假設(shè)輸入樣本為N個(gè),那么采樣的樣本也為N個(gè)。這樣使得在訓(xùn)練的時(shí)候,每一棵樹的輸入樣本都不是全部的樣本,使得相對(duì)不容易出現(xiàn)over-fitting,這種方法也叫作re-sampling,通常情況下,隨機(jī)抽取得到的N個(gè)樣本中,只出現(xiàn)輸入樣本的60~70%的樣本,剩下的樣本不在re-sampling后的樣本中出現(xiàn)。
然后進(jìn)行列采樣(特征采樣),從M個(gè)feature中,選擇m個(gè)(一般選擇m=log2M)。之后就是對(duì)采樣之后的數(shù)據(jù)根據(jù)CART進(jìn)行分類。注意:在基學(xué)習(xí)器深度大于1的情況,要對(duì)每個(gè)結(jié)點(diǎn)都從該點(diǎn)的特征集合中重新選取k個(gè)特征,并且根據(jù)GINI系數(shù)進(jìn)行判斷,從而將決策樹繼續(xù)展開。這樣決策樹的某一個(gè)葉子節(jié)點(diǎn)要么是無法繼續(xù)分裂的(更傾向于這種,這種方法就是設(shè)置基學(xué)習(xí)器CART的高度),要么里面的所有樣本的都是指向的同一個(gè)分類(可能每個(gè)學(xué)習(xí)器都需要很多迭代,不推薦)。一般很多的決策樹算法都一個(gè)重要的步驟 - 剪枝,但是這里不這樣干,由于之前的兩個(gè)隨機(jī)采樣的過程保證了隨機(jī)性,所以就算不剪枝,也不會(huì)出現(xiàn)over-fitting。
??? 按這種算法得到的隨機(jī)森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。我覺得可以這樣比喻隨機(jī)森林算法:每一棵決策樹就是一個(gè)精通于某一個(gè)窄領(lǐng)域的專家(因?yàn)槲覀儚腗個(gè)feature中選擇m讓每一棵決策樹進(jìn)行學(xué)習(xí)),這樣在隨機(jī)森林中就有了很多個(gè)精通不同領(lǐng)域的專家,對(duì)一個(gè)新的問題(新的輸入數(shù)據(jù)),可以用不同的角度去看待它,最終由各個(gè)專家,投票得到結(jié)果。
下面是隨機(jī)森林最簡單實(shí)現(xiàn)的Python代碼:
[python]?view plain
?copy''?????????????????import?numpy?as?np??import?pandas?as?pd??import?random??from?threading?import?Thread??from?collections?import?Counter??????def?xunlian(data,?number):??????featureChoice?=?int(np.random.randint(0,?number-1,?1))??????features?=?list(data[featureChoice].unique())??????????????categorys?=?list(data[featureChoice])??????dicts?=?{}??????cc?=?0????????for?ll?in?features:??????????dicts[ll]?=?[]??????????for?m?in?categorys:??????????for?j?in?features:??????????????if?m?==?j:??????????????????dicts[j].append(cc)??????????????????cc?+=?1????????for?i?in?features:??????????lst?=?dicts.get(i)??????????new_lst?=?[]??????????if?len(lst)?>?0:??????????????for?k?in?lst:??????????????????new_lst.append(int(data[k:k+1][data.shape[1]-1]))??????????????jieguo?=?Counter(new_lst).most_common(1)[0][0]??????????????dicts[i]?=?jieguo????????return?dicts????????????class?RandomForest():????????def?__init__(self,?n_estimators?=?3):??????????self.estimators?=?n_estimators???????@staticmethod??????def?assemble(inputs,?labels):??????????n?=?len(labels)??????????for?i?in?range(n):??????????????inputs[i].append(labels[i])????????????data?=?np.vstack(inputs)??????????return?data????????def?train(self,?inputs,?labels):??????????n?=?len(inputs[0])????????????data?=?RandomForest.assemble(inputs,?labels)??????????data?=?pd.DataFrame(data)????????????sum_dicts?=?{}????????????rows?=?int(data.shape[0])??????????rcounts?=?rows?-?1????????????for?i?in?range(self.estimators):??????????????df?=?pd.DataFrame()??????????????for?m?in?range(rows):??????????????????j?=?random.randint(0,?int(rcounts))??????????????????df?=?df.append(data.loc[j,?:])??????????????sum_dicts[i]?=?xunlian(df,?n)????????????return?sum_dicts????????????????????????????????????????????????????????????????????????????????????????????????????def?predict(self,?input,?model):??????????n?=?len(model)????????????????????predicts?=?list()??????????for?i?in?range(n):??????????????categoryes?=?model[i]??????????????for?j?in?input:??????????????????if?j?in?categoryes.keys():??????????????????????predicts.append(categoryes[j])??????????prediction?=?Counter(predicts).most_common(1)??????????print(prediction)??????????if?prediction[0][0]?==?0:????????????????print("預(yù)測(cè)結(jié)果為:壞瓜")??????????else:????????????????print("預(yù)測(cè)結(jié)果為:好瓜")????????????if?__name__?==?"__main__":??????ex?=?RandomForest()????????a0?=?['淺綠',?'清脆',?'中']??????a1?=?['深綠',?'沉悶',?'大']??????a2?=?['薄白',?'清脆',?'小']??????a3?=?['淺綠',?'清脆',?'小']??????a4?=?['深綠',?'沉悶',?'中']??????lst?=?[a0,?a1,?a2,?a3,?a4]??????y?=?[0,?1,?0,?1,?1]??????????model?=?ex.train(lst,?y)??????ex.predict(['淺綠',?'清脆',?'小'],?model)??
參考資料:
1、 http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html
2 、http://blog.csdn.net/w28971023/article/details/8240756
總結(jié)
以上是生活随笔為你收集整理的机器学习基础——RandomForest的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。