RandomForest 調參

在scikit-learn中,RandomForest的分類器是RandomForestClassifier,迴歸器是RandomForestRegressor,需要調參的參數包括兩部分,第一部分是Bagging框架的參數,第二部分是CART決策樹的參數。

 

一、Bagging框架的參數:

1. n_estimators: 最大的弱學習器的個數,默認是10。一般來說n_estimators太小,容易欠擬合,n_estimators太大,又容易過擬合。對Random Forest來說,增加“子模型數”(n_estimators)可以明顯降低整體模型的方差,且不會對子模型的偏差和方差有任何影響。模型的準確度會隨着“子模型數”的增加而提高,由於減少的是整體模型方差公式的第二項,故準確度的提高有一個上限。在實際應用中,可以以10爲單位,考察取值範圍在1至201的調參情況。

2. bootstrap默認True,是否有放回的採樣。

3. oob_score 默認爲False,即是否採用袋外樣本來評估模型的好壞。有放回採樣中大約36.8%的沒有被採樣到的數據,我們常常稱之爲袋外數據(Out Of Bag, 簡稱OOB),這些數據沒有參與訓練集模型的擬合,因此可以用來檢測模型的泛化能力。個人推薦設置爲True,因爲袋外分數反應了一個模型擬合後的泛化能力。對單個模型的參數訓練,我們知道可以用cross validation(cv)來進行,但是特別消耗時間,而且對於隨機森林這種情況也沒有大的必要,所以就用這個數據對決策樹模型進行驗證,算是一個簡單的交叉驗證,性能消耗小,但是效果不錯。

4. criterion 即CART樹做劃分時對特徵的評價標準,分類模型和迴歸模型的損失函數是不一樣的。分類RF對應的CART分類樹默認是基尼係數gini,另一個可選擇的標準是信息增益entropy,是用來選擇節點的最優特徵和切分點的兩個準則。迴歸RF對應的CART迴歸樹默認是均方差mse,另一個可以選擇的標準是絕對值差mae。一般來說選擇默認的標準就已經很好的。

從上面可以看出, RF重要的框架參數比較少,主要需要關注的是 n_estimators,即RF最大的決策樹個數。

 

二、決策樹的參數:

1. max_features: RF劃分時考慮的最大特徵數。可以使用很多種類型的值,默認是"None",意味着劃分時考慮所有的特徵數;如果是"log2"意味着劃分時最多考慮log2N個特徵;如果是"sqrt"或者"auto"意味着劃分時最多考慮N−−√N個特徵。如果是整數,代表考慮的特徵絕對數。如果是浮點數,代表考慮特徵百分比,即考慮(百分比xN)取整後的特徵數,其中N爲樣本總特徵數。一般來說,如果樣本特徵數不多,比如小於50,我們用默認的"None"就可以了,如果特徵數非常多,我們可以靈活使用剛纔描述的其他取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。

2. max_depth決策樹最大深度。默認爲"None",決策樹在建立子樹的時候不會限制子樹的深度這樣建樹時,會使每一個葉節點只有一個類別,或是達到min_samples_split。一般來說,數據少或者特徵少的時候可以不管這個值。如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分佈。常用的可以取值10-100之間。

3. min_samples_split內部節點再劃分所需最小樣本數,默認2。這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 默認是2,如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。

4. min_samples_leaf:葉子節點最少樣本數。 這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。 默認是1,可以輸入最少的樣本數的整數,或者最少樣本數佔樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。

5. min_weight_fraction_leaf葉子節點最小的樣本權重和。這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。 默認是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分佈類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。

6. max_leaf_nodes最大葉子節點數。通過限制最大葉子節點數,可以防止過擬合,默認是"None”,即不限制最大的葉子節點數。如果加了限制,算法會建立在最大葉子節點數內最優的決策樹。如果特徵不多,可以不考慮這個值,但是如果特徵分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。

7. min_impurity_split節點劃分最小不純度。這個值限制了決策樹的增長,如果某節點的不純度(基於基尼係數,均方差)小於這個閾值,則該節點不再生成子節點,即爲葉子節點 。一般不推薦改動默認值1e-7。

8. splitter: 隨機選擇屬性"random"還是選擇不純度最大"best"的屬性,建議用默認 best。

9. presort:是否對數據進行預分類,以加快擬閤中最佳分裂點的發現。默認False,適用於大數據集。小數據集使用True,可以加快訓練。是否預排序,預排序可以加速查找最佳分裂點,對於稀疏數據不管用,Bool,auto:非稀疏數據則預排序,若稀疏數據則不預排序.

 

以n_estimators爲例進行調參:

from util import load_data
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text importTfidfTransformer

from sklearn.ensemble import RandomForestClassifier
import numpy as np
import math
import random
from matplotlib import pyplot as plt


train_file = 'data/train.txt'
test_file = 'data/test.txt'
stop_words = load_data('stopwords_en.txt')
train_datas = read_corpus(train_file, stop_words)
test_datas = read_corpus(test_file,stop_words,train=False)
train_questions, train_labels = zip(*train_datas)
test_questions, test_labels = zip(*test_datas)

train_questions = [' '.join(question) for question in train_questions]
test_questions = [' '.join(question) for question in test_questions]

counter = CountVectorizer(max_df=400, min_df=0.0001)
counts_train = counter.fit_transform(train_questions)
tfidftransformer = TfidfTransformer()
tfidf_train = tfidftransformer.fit(counts_train).transform(counts_train)


counts_test= counter.transform(test_questions)
tfidf_test = tfidftransformer.transform(counts_test)


scores = []
nums = range(1, 300, 10)
for i in nums:
    model = RandomForestClassifier(n_estimators =i,random_state=0,bootstrap=False)
    model.fit(train_data,train_labels)
    scores.append(model.score(test_data,test_labels))
    preds = model.predict(test_data)
    accuracy = np.mean(preds == test_labels)
    print('n_estimator:%s, accuracy:%s'%(i,accuracy*29))

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(nums, scores, label ='test')
ax.set_xlabel('estimator_num')
ax.set_ylabel('score')
ax.legend(loc='lower right')
ax.set_ylim(0,1.05)
plt.suptitle('RandomForestClassifier')
plt.show()    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章