基于python的随机森林回归实现_随机森林理论与python代码实现
1,初品隨機森林
隨機森林,森林就是很多決策樹放在一起一起叫森林,而隨機體現在數據集的隨機采樣中和特征的隨機選取中,具體下面再講。通俗的說隨機森林就是建立多顆決策樹(CART),來做分類(回歸),以多數表決(平均法)來得出我們的分類(回歸)結果。
這種思想就是一種集成思想,集成算法目前有兩大類,一類是基學習器(可看做本文講的決策樹)之間存在強依賴性,基分類器的得出依賴于前面的分類器(前面分類器的結果會影響后面分類器的訓練),可形象的看做個基學習器是串聯的,代表是 Adaboost, Xgboost, GBDT(后面兩種我們以后總結)。另一類是個體學習器之間不存在相關關系,相互獨立,可形象的看做并聯關系,代表是bagging和隨機森林。
在建立獨立的決策樹時,有一些細節問題需要注意。
2, 隨機選擇樣本
隨機森林的隨機之一就在樣本的選擇上,我們從樣本集中有放回的隨機采樣,這種采樣方法與bagging采樣方法一致,具體采樣過程如下:
3, 隨機選擇特征
隨機森林的另一隨機就在特征選擇上,隨機森林本質就是對決策樹的Bagging集成,只是在決策樹的建立過程中加入了特征的隨機選擇。一直說特征選擇,到底在哪用到了特征選擇?接著說,每一棵決策樹的每一個節點的建立不再是遍歷每個特征的每一個取值,而是隨機的選取預設個數的特征,要比原特征個數小,這樣是為了使決策樹有差異,這樣的森林具有更好的泛化能力。然后在選取的特征上進行最優特征與最優切分點的選取。
def feature_sample(rows,n_feature):import randomfeature_index = [] #用于存放隨機選取的特征對應的列號while len(feature_index)<n_feature:index = random.randrange(len(rows[0])-1)if index not in feature_index: #選取的特征不重復feature_index.append(index)return feature_index4, 集成方式
5, 隨機森林代碼實現
我們做一個隨機森林的簡單實現,使得更加理解隨機森林。但如果在實際項目中使用,直接調用sklearn庫中的函數即可。有一些輔助函數的實現,在上一篇決策樹理論總結與代碼實現 - 劉毛毛的文章 - 知乎 https://zhuanlan.zhihu.com/p/106833254文章中有實現,這里將直接使用。
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)#與決策樹相比每個節點的最優特征候選集小了#根據抽取的特征對數據集進行拆分###for col in features_index:column_values={}for row in rows:column_values[row[col]]=1 #這樣較決策樹里的代碼修改了一下,不重復的記錄某特征的值values =[]for key in column_values.keys():#不在遍歷某特征的所有值,只不重復的遍歷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))添加預測函數,求準確率函數,結果集成函數(分類)
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)隨機森林實現
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親測有效,只是對樣本量小,特征又小的數據集效果不好,原因應該是在數據集較小的情況下,采樣的數據就更加簡單化,訓練的模型自然不好。
總結
以上是生活随笔為你收集整理的基于python的随机森林回归实现_随机森林理论与python代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python里split_python中
- 下一篇: python 运算符重载_Python3