生活随笔
收集整理的這篇文章主要介紹了
机器学习基础——RandomForest
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
隨機森林(Random Forest):
??? 隨機森林是一個最近比較火的算法,它有很多的優(yōu)點:
- ??? 在數(shù)據(jù)集上表現(xiàn)良好
- ??? 在當前的很多數(shù)據(jù)集上,相對其他算法有著很大的優(yōu)勢
- ??? 它能夠處理很高維度(feature很多)的數(shù)據(jù),并且不用做特征選擇
- ??? 在訓練完后,它能夠給出哪些feature比較重要
- ??? 在創(chuàng)建隨機森林的時候,對generlization error使用的是無偏估計
- ??? 訓練速度快
- ??? 在訓練過程中,能夠檢測到feature間的互相影響
- ??? 容易做成并行化方法
- ??? 實現(xiàn)比較簡單
? ? 隨機森林最早由Leo Breiman與Adele Cutler提出,
隨機森林顧名思義,是用隨機的方式建立一個森林,森林里面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯(lián)的(跟Adaboost相反,Adaboost的每個基學習器互相相關。)。在得到森林之后,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬于哪一類(對于分類算法),然后看看哪一類被選擇最多,就預測這個樣本為那一類。
??? 在建立每一棵決策樹的過程中,有兩點需要注意 - 采樣與完全分裂。首先是兩個隨機采樣的過程,random forest對輸入的數(shù)據(jù)要進行行的采樣(即樣本的采樣)和列的采樣(特征的采樣)。對于行采樣,采用有放回的方式,也就是在采樣得到的樣本集合中,可能有重復的樣本。假設輸入樣本為N個,那么采樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現(xiàn)over-fitting,這種方法也叫作re-sampling,通常情況下,隨機抽取得到的N個樣本中,只出現(xiàn)輸入樣本的60~70%的樣本,剩下的樣本不在re-sampling后的樣本中出現(xiàn)。
然后進行列采樣(特征采樣),從M個feature中,選擇m個(一般選擇m=log2M)。之后就是對采樣之后的數(shù)據(jù)根據(jù)CART進行分類。注意:在基學習器深度大于1的情況,要對每個結點都從該點的特征集合中重新選取k個特征,并且根據(jù)GINI系數(shù)進行判斷,從而將決策樹繼續(xù)展開。這樣決策樹的某一個葉子節(jié)點要么是無法繼續(xù)分裂的(更傾向于這種,這種方法就是設置基學習器CART的高度),要么里面的所有樣本的都是指向的同一個分類(可能每個學習器都需要很多迭代,不推薦)。一般很多的決策樹算法都一個重要的步驟 - 剪枝,但是這里不這樣干,由于之前的兩個隨機采樣的過程保證了隨機性,所以就算不剪枝,也不會出現(xiàn)over-fitting。
??? 按這種算法得到的隨機森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。我覺得可以這樣比喻隨機森林算法:每一棵決策樹就是一個精通于某一個窄領域的專家(因為我們從M個feature中選擇m讓每一棵決策樹進行學習),這樣在隨機森林中就有了很多個精通不同領域的專家,對一個新的問題(新的輸入數(shù)據(jù)),可以用不同的角度去看待它,最終由各個專家,投票得到結果。
下面是隨機森林最簡單實現(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("預測結果為:壞瓜")??????????else:????????????????print("預測結果為:好瓜")????????????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
總結
以上是生活随笔為你收集整理的机器学习基础——RandomForest的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。