python實現機器學習之隨機森林

2021-08-13 19:41:45 字數 3088 閱讀 8472

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

首先推薦的就是:隨機森林入門—簡化版  老外寫的部落格,是我目前覺得寫的最好的關於隨機森林的入門文章。重點講解來隨機森林的構造過程,並舉了墨西哥的人均收入的問題來進行隨機森林概念的講解。

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

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

引數說明:

最主要的兩個引數是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。

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

這裡我使用了scikit-learn自帶的iris資料來進行隨機森林的**:

[python]

view plain

copy

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]  

返回的結果如下:

(150,)

[[ 6.3  3.3  6.   2.5]

[ 7.2  3.6  6.1  2.5]]

instance 0 prediction; [ 2.]

instance 1 prediction; [ 2.]

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

[python]

view plain

copy

from

sklearn.cross_validation 

import

cross_val_score, shufflesplit  

x = iris["data"

]  y = iris["target"

]  names = iris["feature_names"

]  rf = randomforestregressor()  

scores =   

fori 

inrange(x.shape[

1]):  

score = cross_val_score(rf, x[:, i:i+1

], y, scoring=

"r2"

,  cv=shufflesplit(len(x), 3

, .3

))  

), names[i]))  

print

sorted(scores, reverse=

true

)  

顯示的結果如下:

[(0.934, 'petal width (cm)'), (0.929, 'petal length (cm)'), (0.597, 'sepal length (cm)'), (0.276, 'sepal width (cm)')]

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

機器學習 隨機森林及python實現

隨機森林演算法流程 使用python實現隨機森林 想要知道什麼是隨機森林,我們需要知道bagging bagging 是 bootstrap aggregating 的英文縮寫,剛接觸的童鞋不要誤認為 bagging 是一種演算法,bagging 和 boosting 都是整合學習中的學習框架,代表...

機器學習 python調包實現 隨機森林回歸演算法

此處採用波士頓房價資料集 可直接呼叫 訓練特徵為13個,輸出標籤為medv。資料截圖如下,顯示中文標籤 plt.rcparams axes.unicode minus false 匯入波士頓房價資料集 from sklearn.datasets import load boston x,y load...

機器學習之隨機森林(一)

如果大家想學人工智慧的話,那麼就一定不能夠忽視有關機器學習的內容。這時候就會有人問,什麼是機器學習?所謂機器學習就是一門多領域交叉學科,涉及概率論 統計學 逼近論等多門學科。機器學習是專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能的一門...