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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

基于python的随机森林回归实现_随机森林理论与python代码实现

發(fā)布時間:2023/12/4 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于python的随机森林回归实现_随机森林理论与python代码实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1,初品隨機森林

隨機森林,森林就是很多決策樹放在一起一起叫森林,而隨機體現(xiàn)在數(shù)據(jù)集的隨機采樣中和特征的隨機選取中,具體下面再講。通俗的說隨機森林就是建立多顆決策樹(CART),來做分類(回歸),以多數(shù)表決(平均法)來得出我們的分類(回歸)結(jié)果。

這種思想就是一種集成思想,集成算法目前有兩大類,一類是基學(xué)習(xí)器(可看做本文講的決策樹)之間存在強依賴性,基分類器的得出依賴于前面的分類器(前面分類器的結(jié)果會影響后面分類器的訓(xùn)練),可形象的看做個基學(xué)習(xí)器是串聯(lián)的,代表是 Adaboost, Xgboost, GBDT(后面兩種我們以后總結(jié))。另一類是個體學(xué)習(xí)器之間不存在相關(guān)關(guān)系,相互獨立,可形象的看做并聯(lián)關(guān)系,代表是bagging和隨機森林。

在建立獨立的決策樹時,有一些細節(jié)問題需要注意。

2, 隨機選擇樣本

隨機森林的隨機之一就在樣本的選擇上,我們從樣本集中有放回的隨機采樣,這種采樣方法與bagging采樣方法一致,具體采樣過程如下:

  • 有放回的從樣本集中( 個)隨機采取 個樣本,這 個樣本中有重復(fù)樣本。
  • 進行 輪采樣( 為決策樹個數(shù)),采樣方法如1。
  • def

    3, 隨機選擇特征

    隨機森林的另一隨機就在特征選擇上,隨機森林本質(zhì)就是對決策樹的Bagging集成,只是在決策樹的建立過程中加入了特征的隨機選擇。一直說特征選擇,到底在哪用到了特征選擇?接著說,每一棵決策樹的每一個節(jié)點的建立不再是遍歷每個特征的每一個取值,而是隨機的選取預(yù)設(shè)個數(shù)的特征,要比原特征個數(shù)小,這樣是為了使決策樹有差異,這樣的森林具有更好的泛化能力。然后在選取的特征上進行最優(yōu)特征與最優(yōu)切分點的選取。

    def feature_sample(rows,n_feature):import randomfeature_index = [] #用于存放隨機選取的特征對應(yīng)的列號while len(feature_index)<n_feature:index = random.randrange(len(rows[0])-1)if index not in feature_index: #選取的特征不重復(fù)feature_index.append(index)return feature_index

    4, 集成方式

  • 平均法:回歸任務(wù),對所有決策樹的預(yù)測結(jié)果進行求平均
  • 投票法:分類任務(wù),少數(shù)服從多數(shù)
  • 5, 隨機森林代碼實現(xiàn)

    我們做一個隨機森林的簡單實現(xiàn),使得更加理解隨機森林。但如果在實際項目中使用,直接調(diào)用sklearn庫中的函數(shù)即可。有一些輔助函數(shù)的實現(xiàn),在上一篇決策樹理論總結(jié)與代碼實現(xiàn) - 劉毛毛的文章 - 知乎 https://zhuanlan.zhihu.com/p/106833254文章中有實現(xiàn),這里將直接使用。

    def buildTree(rows,scoref,n_feature,min_size,min_gini,max_depth,depth):if len(rows)<=min_size:return decisionNode(results = uniquecounts(rows))if depth>=max_depth:return decisionNode(results = uniquecount(rows))best_gini = 0best_criteria = Nonebest_sets = None#特征抽樣###features_index = feature_sample(rows,n_feature)#與決策樹相比每個節(jié)點的最優(yōu)特征候選集小了#根據(jù)抽取的特征對數(shù)據(jù)集進行拆分###for col in features_index:column_values={}for row in rows:column_values[row[col]]=1 #這樣較決策樹里的代碼修改了一下,不重復(fù)的記錄某特征的值values =[]for key in column_values.keys():#不在遍歷某特征的所有值,只不重復(fù)的遍歷values.append(key)for value in values:(set1,set2)=divideset(rows,col,value)p_set = float(len(set1))/len(rows)gini = p_set*scoref(set1)+(1-p_set)*scoref(set2)if gini>best_gini and len(set1)>0 and len(set2)>0:best_gini = ginibest_criteria=(col,value)best_sets = (set1,set2)if best_gini > min_gini:truebranch = buildTree(best_sets[0],scoref,n_feature,min_size,mini_gini,max_depth,depth+1)falsebranch = buildTree(best_sets[1],scoref,n_feature,min_size,mini_gini,max_depth,depth+1)return decisionnode(col = best_criteria[0],value = best_criteria[1],tb = truebranch,fb = falsebranch)else:return decisionnode(results=classcounts(rows))

    添加預(yù)測函數(shù),求準確率函數(shù),結(jié)果集成函數(shù)(分類)

    def predict_results(observation,tree):if tree.results != None:return tree.resultselse:v = observation[tree.col]Branch = Noneif isinstance(v,int) or isinstance(v,float):if v >= tree.value:Branch = tree.tbelse:Branch = tree.fbelse:if v == tree.value:Branch = tree.tbelse:Branch = tree.fbreturn predict_results(observation,Branch)def predict(observation,tree):results = predict_results(observation,tree)label = Noneb_count = 0for key in results.keys():if results[key] > b_count:b_count = results[key]label = keyreturn label def accuracy(actual,predicted):correct =0for i in range(len(actual)):if actual[i]==predicted[i]:correct += 1accuracy = (float(correct)/len(actual))*100return accuracy def bagging_predict(trees,row):predictions=[predict(row,tree) for tree in trees]return max(set(predictions),key=predictions.count)

    隨機森林實現(xiàn)

    def RandomForest(train,test,ratio,max_depth=4,min_size=3,min_gini=0.3,n_trees=100,n_features=3,scoref=giniimpurity):trees = []for i in range(n_trees):subset = subsample(train,ratio)#subset = traintree=buildTree(subset,scoref,n_features,min_gini,min_size,max_depth,0)trees.append(tree)predictions=[bagging_predict(trees,row) for row in test]actual = [row[-1] for row in test]test_score = accuracy(actual,predictions)return test_score

    親測有效,只是對樣本量小,特征又小的數(shù)據(jù)集效果不好,原因應(yīng)該是在數(shù)據(jù)集較小的情況下,采樣的數(shù)據(jù)就更加簡單化,訓(xùn)練的模型自然不好。

    總結(jié)

    以上是生活随笔為你收集整理的基于python的随机森林回归实现_随机森林理论与python代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。