求問隨機森林演算法的簡單實現過程?

隨機森林(Random forest)指的是利用多棵樹對樣本進行訓練並預測的一種分類器。 並且其輸出的類別是由個別樹輸出的類別的眾數而定。在機器學習中有一個地位很重要的包scikit-learn可實現隨機森林演算法。

原理:(隨機森林的分類預測和回歸預測sklearn.ensemble.RandomForestRegressor方法)

(1)給定訓練集S,測試集T,特徵維數F。確定參數:使用到的CART的數量t,每棵樹的深度d,每個節點使用到的特徵數量f,終止條件:節點上最少樣本數s,節點上最少的信息增益m,對於第1-t棵樹,i=1-t:

(2)從S中有放回的抽取大小和S一樣的訓練集S(i),作為根節點的樣本,從根節點開始訓練

(3)如果當前節點上達到終止條件,則設置當前節點為葉子節點,如果是分類問題,該葉子節點的預測輸出為當前節點樣本集合中數量最多的那一類c(j),概率p為c(j)占當前樣本集的比例;如果是回歸問題,預測輸出為當前節點樣本集各個樣本值的平均值。然後繼續訓練其他節點。如果當前節點沒有達到終止條件,則從F維特徵中無放回的隨機選取f維特徵。利用這f維特徵,尋找分類效果最好的一維特徵k及其閾值th,當前節點上樣本第k維特徵小於th的樣本被劃分到左節點,其餘的被劃分到右節點。繼續訓練其他節點。

(4)重複(2)(3)直到所有節點都訓練過了或者被標記為葉子節點。

(5)重複(2),(3),(4)直到所有CART都被訓練過。

隨機森林的簡單實現過程如下:

一、 開發環境、編譯環境:

PyCharm Community Edition 2016.2.3

Python2.7.10

二、 所用庫及安裝方法:

pandas[python自帶]

sklearn:命令行pip install sklearn;如果沒有安裝pip,先使用easy_install pip安裝pip;如果在MAC上沒有許可權,使用sudo pip install sklearn;

三、 代碼介紹

1. 使用pandas讀取本地excel的訓練集和測試集,將屬性集賦給X_train和Y_train;將要預測的集合賦給X_test和Y_test;

2. 使用DictVectorizer對數據進行規範化、標準化

3. 生成RandomForestRegressor對象,並將訓練集傳入fit方法中進行訓練

4. 調用predict函數進行預測,並將結果存入y_predict變數中;

5. 使用mean_squared_error、score方法輸出MSE、NMSE值對擬合度、穩定度進行分析;輸出feature_importance,對影響最終結果的屬性進行分析;

6. 詳細代碼見附錄

四、 附錄

# coding:utf-8

import pandas as pd

data_train = pd.read_excel("/Users/xiaoliu/Desktop/data_train.xlsx")

X_train = data_train[["CPI", "GDP", "PPI", "AJR", "BJFJ", "FBDR", "PCFD", "PCFDED", "BDR"]]

y_train = data_train["FJ"]

data_test = pd.read_excel("/Users/xiaoliu/Desktop/data_test.xlsx")

X_test = data_test[["CPI", "GDP", "PPI", "AJR", "BJFJ", "FBDR", "PCFD", "PCFDED", "BDR"]]

y_test = data_test["FJ"]

from sklearn.feature_extraction import DictVectorizer

vec = DictVectorizer(sparse=False)

X_train = vec.fit_transform(X_train.to_dict(orient="records"))

X_test = vec.transform(X_test.to_dict(orient="records"))

from sklearn.ensemble import RandomForestRegressor

rf = RandomForestRegressor()

rf.fit(X_train,y_train)

y_predict = rf.predict(X_test)

print "predict value:",y_predict

from sklearn.metrics import mean_squared_error

print "MSE:", mean_squared_error(y_test, y_predict)

print "NMES:",rf.score(X_test, y_test)

print rf.feature_importances_


推薦閱讀:

AppleScript類自然語言與非英語語法設計
學編程有哪些好點的網站?
求余和取模
阻擋你學會Haskell最大的兩個問題是什麼?
如何進行系統性的編程學習?

TAG:演算法 | 編程語言 | 機器學習 | 編程 | 演算法與數據結構 |