1. 程式人生 > >隨機森林引數理解與調優

隨機森林引數理解與調優

首先理解隨機森林模型各引數的含義:

class sklearn.ensemble.RandomForestRegressor(n_estimators=10, criterion=’mse’, max_depth=None, min_samples_split=2, min_samples_leaf=1,  min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False,  n_jobs=1, random_state=None, verbose=0, warm_start=False) 上面的值是對應的預設值,隨機森林的分類模型與之類似.

n_estimators:森林中數的個數。  這個屬性是典型的模型表現與模型效率成反比的影響因子,即便如此,你還是應該儘可能提高這個數字,以讓你的模型更準確更穩定。  criterion :度量分裂的標準。可選值:“mse”,均方差(mean squared error);“mae”,平均絕對值誤差(mean absolute error)  max_features :尋找最佳分裂點時考慮的屬性數目。可選值,int(具體的數目),float(數目的百分比),string(“auto”, “sqrt”,“log2”).  這一屬性是對單個樹來設定的,通常來講,這個值越大單棵樹可以考慮的屬性越多,則模型的表現就越好。但是這也不是肯定的,不過有一點是肯定的,增加這個值會導致演算法執行速度變慢,所以需要我們考慮去達到一個平衡。  max_depth : integer或者None。數的最大深度,如果None,節點擴充套件直到所有葉子是純的或者所有葉子節點包含的樣例數小於min_samples_split  min_samples_split : 分裂內部節點需要的最少樣例數。int(具體數目),float(數目的百分比)  min_samples_leaf :葉子節點上應有的最少樣例數。int(具體數目),float(數目的百分比)。  更少的節點數使得模型更容易遭受noise data的影響,我通常設定這個值大於50,但是你需要尋找最適合你的數值。  min_weight_fraction_leaf :  max_leaf_nodes :以”最優優先方式”(best-first fashion),最優節點定義為:純度的相對減少.如果None則不限制葉子節點個數;[float]  min_impurity_split : 樹增長提前結束的閾值.對於當前節點,大於這個閾值將分裂,否則就看做葉子節點; [float]  min_impurity_decrease :一個閾值,表示一個節點分裂的條件是:如果這次分裂純度的減少大於等於這這個值.  bootstrap :構建數是不是採用有放回樣本的方式(bootstrap samples); [True/False]  oob_score :交叉驗證相關的屬性。  n_jobs :設定fit和predict階段並列執行的任務個數,如果設定為-1表示並行執行的任務數等於計算級核數; [integer, optional (default=1)]  random_state :如果是int數值表示它就是隨機數產生器的種子.如果指定RandomState例項,它就是隨機產生器的種子.如果是None,隨機數產生器是np.random所用的RandomState例項; [int, RandomState instance or None, optional (default=None)]  verbose :控制構建數過程的冗長度; [int, optional (default=0)]  warm_start :當設定為True,重新使用之前的結構去擬合樣例並且加入更多的估計器(estimators,在這裡就是隨機樹)到組合器中; [True/False]  class_weight: “banlanced”模式是根據y標籤值自動調整權值與輸入資料的類頻率成反比,計算公式是:n_samples / (n_classes np.bincount(y)).“balanced_subsample”模式的與”balanced模式相同,只不過在每一次樹增長過程中權值的計算是根據有放回樣本的.

那麼這麼多樣本怎麼去調參呢,這裡介紹sklearn中的神器:GridSearcherCV(),它使用交叉驗證的方式,對某一分類器,你制定想要調參的名稱和數值,作為一個字典傳入進這個函式,然後它就會告訴你最佳的引數組合.(其實就是for for for都試試).下面是我的一段程式碼.

這裡寫程式碼片 from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestClassifier #準備訓練資料和y值 X_train, y_train = ... #初步定義分類器 rfc = RandomForestClassifier(max_depth=2, random_state=0) #需要選擇的引數名稱一起後選值 tuned_parameter = [{'min_samples_leaf':[1,2,3,4], 'n_estimators':[50,100,200]}] #神器出場,cv設定交叉驗證 clf = GridSearchCV(estimator=rfc,param_grid=tuned_parameters, cv=5, n_jobs=1) #擬合訓練集 clf.fit(X_train, y_train) print('Best parameters:') pritn(clf.best_params_) ---------------------  原文:https://blog.csdn.net/u012559520/article/details/77336098