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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习基础——RandomForest

發布時間:2024/1/17 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习基础——RandomForest 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隨機森林(Random Forest):

??? 隨機森林是一個最近比較火的算法,它有很多的優點:

  • ??? 在數據集上表現良好
  • ??? 在當前的很多數據集上,相對其他算法有著很大的優勢
  • ??? 它能夠處理很高維度(feature很多)的數據,并且不用做特征選擇
  • ??? 在訓練完后,它能夠給出哪些feature比較重要
  • ??? 在創建隨機森林的時候,對generlization error使用的是無偏估計
  • ??? 訓練速度快
  • ??? 在訓練過程中,能夠檢測到feature間的互相影響
  • ??? 容易做成并行化方法
  • ??? 實現比較簡單

? ? 隨機森林最早由Leo Breiman與Adele Cutler提出,

隨機森林顧名思義,是用隨機的方式建立一個森林,森林里面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的(跟Adaboost相反,Adaboost的每個基學習器互相相關。)。在得到森林之后,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬于哪一類(對于分類算法),然后看看哪一類被選擇最多,就預測這個樣本為那一類。

??? 在建立每一棵決策樹的過程中,有兩點需要注意 - 采樣與完全分裂。首先是兩個隨機采樣的過程,random forest對輸入的數據要進行行的采樣(即樣本的采樣)和列的采樣(特征的采樣)。對于行采樣,采用有放回的方式,也就是在采樣得到的樣本集合中,可能有重復的樣本。假設輸入樣本為N個,那么采樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting,這種方法也叫作re-sampling,通常情況下,隨機抽取得到的N個樣本中,只出現輸入樣本的60~70%的樣本,剩下的樣本不在re-sampling后的樣本中出現。

然后進行列采樣(特征采樣),從M個feature中,選擇m個(一般選擇m=log2M)。之后就是對采樣之后的數據根據CART進行分類。注意:在基學習器深度大于1的情況,要對每個結點都從該點的特征集合中重新選取k個特征,并且根據GINI系數進行判斷,從而將決策樹繼續展開。這樣決策樹的某一個葉子節點要么是無法繼續分裂的(更傾向于這種,這種方法就是設置基學習器CART的高度),要么里面的所有樣本的都是指向的同一個分類(可能每個學習器都需要很多迭代,不推薦)。一般很多的決策樹算法都一個重要的步驟 - 剪枝,但是這里不這樣干,由于之前的兩個隨機采樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。

??? 按這種算法得到的隨機森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。我覺得可以這樣比喻隨機森林算法:每一棵決策樹就是一個精通于某一個窄領域的專家(因為我們從M個feature中選擇m讓每一棵決策樹進行學習),這樣在隨機森林中就有了很多個精通不同領域的專家,對一個新的問題(新的輸入數據),可以用不同的角度去看待它,最終由各個專家,投票得到結果。

下面是隨機森林最簡單實現的Python代碼:

[python]?view plain?copy
  • '''''?
  • ????Samuel?Gao?
  • ????2017.4.19?
  • ????隨機森林?
  • ????離散屬性?
  • ????1、基學習器深度取為1?,因為我這里?
  • ???????只隨機取1個進行決策樹分析,?
  • ???????沒有用到CART決策樹,按gini系數比較。對特征多的可以加上。?
  • ???????ps:要對每個基學習器的節點隨機抽取一個特征進行分叉,除非像我一樣?
  • ???????,將每棵樹的高度設為1.?
  • ????2、基學習器可以并行生成,有興趣的可以用Threading或multiprocessing模塊?
  • ???????來實現,還是不太難的。這里沒有寫出?
  • ?
  • '''??
  • #?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])??#?特征個數??
  • ????????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??
  • ????????#?多線程并行生成基學習器方式:以后有時間完善??
  • ????????#?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為基學習器的個數??
  • ????????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()??#?默認為3個基學習器??
  • ????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

    總結

    以上是生活随笔為你收集整理的机器学习基础——RandomForest的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。