日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习基础——RandomForest

發(fā)布時(shí)間:2024/1/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习基础——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
  • '''''?
  • ????Samuel?Gao?
  • ????2017.4.19?
  • ????隨機(jī)森林?
  • ????離散屬性?
  • ????1、基學(xué)習(xí)器深度取為1?,因?yàn)槲疫@里?
  • ???????只隨機(jī)取1個(gè)進(jìn)行決策樹分析,?
  • ???????沒有用到CART決策樹,按gini系數(shù)比較。對(duì)特征多的可以加上。?
  • ???????ps:要對(duì)每個(gè)基學(xué)習(xí)器的節(jié)點(diǎn)隨機(jī)抽取一個(gè)特征進(jìn)行分叉,除非像我一樣?
  • ???????,將每棵樹的高度設(shè)為1.?
  • ????2、基學(xué)習(xí)器可以并行生成,有興趣的可以用Threading或multiprocessing模塊?
  • ???????來實(shí)現(xiàn),還是不太難的。這里沒有寫出?
  • ?
  • '''??
  • #?from?sklearn.ensemble?import?RandomForestClassifier??
  • 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())??
  • ????#?features為['清脆',?'沉悶']的形式??
  • ??
  • ????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??
  • ????#?dicts?為?{'清脆':1,?'沉悶':0}的形式??
  • ??
  • ??
  • 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])??#?特征個(gè)數(shù)??
  • ????????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??
  • ????????#?多線程并行生成基學(xué)習(xí)器方式:以后有時(shí)間完善??
  • ????????#?threads?=?[]??
  • ????????#?for?i?in?range(self.estimators):??
  • ????????#?????ti?=?Thread(target=xunlian,?args=(data,?n,))??
  • ????????#?????threads.append(ti)??
  • ????????#??
  • ????????#?for?t?in?threads:??
  • ????????#?????t.setDeamon(True)??
  • ????????#?????t.start()??
  • ??
  • ??
  • ????def?predict(self,?input,?model):??
  • ????????n?=?len(model)??
  • ????????#?n為基學(xué)習(xí)器的個(gè)數(shù)??
  • ????????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()??#?默認(rèn)為3個(gè)基學(xué)習(xí)器??
  • ????a0?=?['淺綠',?'清脆',?'中']??
  • ????a1?=?['深綠',?'沉悶',?'大']??
  • ????a2?=?['薄白',?'清脆',?'小']??
  • ????a3?=?['淺綠',?'清脆',?'小']??
  • ????a4?=?['深綠',?'沉悶',?'中']??
  • ????lst?=?[a0,?a1,?a2,?a3,?a4]??
  • ????y?=?[0,?1,?0,?1,?1]??#?0壞?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ò),歡迎將生活随笔推薦給好友。