Python 隨機森林

2021-07-29 13:33:29 字數 3516 閱讀 9220

隨機森林講解文件(scikit-learn官方文件)

scikit-learn的官方文件:  

主要告訴大家如何使用scikit-learn包中的類方法來進行隨機森林演算法的**。其中講的比較好的是各個引數的具體用途。

這裡我給出我的理解和部分翻譯:

(1)sklearn ensemble模組包含了兩個基於隨機決策樹的平均演算法:隨機森林演算法和extr隨機樹

這兩個演算法都是特指用來擾亂和合併樹結構的設計。這意味著建立乙個多樣化的分類器,即在分類器結構方面引入隨機性。整合方法的**結果由所有的單個分類器的**值的平均值決定。

與其他分類器相比,樹分類器需要有兩個陣列:

乙個密度稀疏矩陣x:【n_samples,n_features】儲存著訓練樣本

乙個y:【n_samples】儲存著與訓練樣本對應的標籤值

像決策樹,森林數會拓展到多輸出問題(y=【n_samples, n_outputs】)

(2)在隨機森林中,整合器中每棵樹都是通過對訓練集又放回的抽取進行建立的。另外,在構建數的結構的過程中分離出來的節點,該被選節點不是所有特種中最好的**特徵。而是當前子訓練集所有特徵中的最好**節點。最為這種隨機性的結構,bias是會有稍微的增加的(相較與單個非隨機樹),但是基於平均計算,方差是在減小的,而且減小的代價是優於bias增長帶來的損失的。因此,構建了乙個整體較好的模型。(3)引數說明:

最主要的兩個引數是n_estimators和max_features。

n_estimators:表示森林裡樹的個數。理論上是越大越好。但是伴隨著就是計算時間的增長。但是並不是取得越大就會越好,**效果最好的將會出現在合理的樹個數。

max_features:隨機選擇特徵集合的子集合,並用來分割節點。子集合的個數越少,方差就會減少的越快,但同時偏差就會增加的越快。根據較好的實踐經驗。如果是回歸問題則:

max_features=n_features,如果是分類問題則max_features=sqrt(n_features)。

如果想獲取較好的結果,必須將max_depth=none,同時min_sample_split=1。

同時還要記得進行cross_validated(交叉驗證),除此之外記得在random forest中,bootstrap=true。但在extra-trees中,bootstrap=false。

這裡也給出一篇老外寫的文章:調整你的隨機森林模型引數 

隨機森林入門—簡化版  

重點講解來隨機森林的構造過程,並舉了墨西哥的人均收入的問題來進行隨機森林概念的講解。

from sklearn.tree import decisiontreeregressor  

from sklearn.ensemble import randomforestregressor

import numpy as np

from sklearn.datasets import load_iris

iris=load_iris()

#print iris#iris的4個屬性是:萼片寬度 萼片長度 花瓣寬度 花瓣長度 標籤是花的種類:setosa versicolour virginica

print iris['target'].shape

rf=randomforestregressor()#這裡使用了預設的引數設定

rf.fit(iris.data[:150],iris.target[:150])#進行模型的訓練

#

#隨機挑選兩個**不相同的樣本

instance=iris.data[[100,109]]

print instance

print 'instance 0 prediction;',rf.predict(instance[0])

print 'instance 1 prediction;',rf.predict(instance[1])

print iris.target[100],iris.target[109]

上述**中:

iris.target中一共有三個類別:0,1,2

iris.data資料圖如下所示,一共有四個特徵,150個樣本

最後測試資料如下圖兩個樣本:

最後返回結果如下:

(150,)

[[ 6.3  3.3  6.   2.5]

[ 7.2  3.6  6.1  2.5]]

('instance 0 prediction\xef\xbc\x9b', array([ 2.]))

('instance 1 prediction\xef\xbc\x9b', array([ 2.]))

(2, 2)

最後結果都是類別2.

原文如下:

在這裡我有點困惑,就是在scikit-learn演算法包中隨機森林實際上就是一顆顆決策樹組成的。但是之前我寫的決策樹部落格中是可以將決策樹給顯示出來。但是隨機森林卻做了黑盒處理。我們不知道內部的決策樹結構,甚至連父節點的選擇特徵都不知道是誰。所以我給出下面的**(這**不是我的原創),可以顯示的顯示出所有的特徵的貢獻。所以對於貢獻不大的,甚至是負貢獻的我們可以考慮刪除這一列的特徵值,避免做無用的分類。

from sklearn.cross_validation import cross_val_score, shufflesplit

x = iris["data"]

y = iris["target"]

names = iris["feature_names"]

rf = randomforestregressor()

scores = #對每乙個特徵值進行打分,表示重要程度

a = x.shape[1]

for i in range(x.shape[1]):

score = cross_val_score(rf, x[:, i:i+1], y, scoring="r2",

cv=shufflesplit(len(x), 3, .3))

print sorted(scores, reverse=true)

note:python中shape方法用法: 矩陣.shape[0]:返回矩陣行數;

矩陣.shape[1]:返回矩陣列數;

最後返回結果:

[(0.92, 'petal length (cm)'), (0.915, 'petal width (cm)'), (0.576, 'sepal length (cm)'), (-0.009, 'sepal width (cm)')]

這裡我們會發現petal width、petal length這兩個特徵將起到絕對的貢獻,之後是sepal length,影響最小的是sepal width。這段**將會提示我們各個特徵的貢獻,可以讓我們知道部分內部的結構。

隨機森林 python

這 幾天一直在看隨機森林。可以說遇到任何乙個有關 的問題。都可以首先隨機森林來進行 同時得到的結果也不會太差。在這篇文章裡我首先會向大家推薦幾篇寫的比較好的部落格。接著會將我覺得比較好的例子使用python scikit learn包來實現出來。首先推薦的就是 隨機森林入門 簡化版 老外寫的部落格,...

隨機森林python引數 隨機森林的引數說明

a.max features 隨機森林允許單個決策樹使用特徵的最大數量。python為最大特徵數提供了多個可選項。下面是其中的幾個 auto none 簡單地選取所有特徵,每顆樹都可以利用他們。這種情況下,每顆樹都沒有任何的限制。sqrt 此選項是每顆子樹可以利用總特徵數的平方根個。例如,如果變數 ...

python 隨機森林調參 隨機森林調參

前兩天寫了個scikit learn初步學習,今天沒事又照著寫了個rf模型的,剛開始還不懂這個python列表推導式,想了想還是挺好用的。然後用了gridsearchcv這個引數優化類,遍歷多種引數組合 也就是暴搜最優引數組合 通過交叉驗證確定最佳效果引數。所以優化完可能對訓練資料擬合更差,泛化能力...