先記錄一下使用方法,哇我真的吹爆scikit-learn這個庫,之前想做pca分析,手動代碼實現,用了一上午去複習方差協方差矩陣各種線代知識,然後發現scikit-learn直接提供了方法,好吧,對於小白來說總要多走走路纔好,理解一下實現原理也不錯,但是不妨礙scikit-learn這個是真的好用啊,什麼都提供了,機器學習首選!!
1. scikit-learn - RangeForestClassifier
scikit-learn中和隨機森林算法相關的類爲RangeForestClassifier,相關官方文檔講解點擊這裏,這個類的主要參數和方法如下:
類的構造函數:
RandomForestClassifier(n_estimators=10,criterion=’gini’, 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, class_weight=None)
說明:
參數(params):
n_estimators:數值型取值
森林中決策樹的個數,默認是10
criterion:字符型取值
採用何種方法度量分裂質量,信息熵或者基尼指數,默認是基尼指數
max_features:取值爲int型, float型, string類型, or None(),默認"auto"
尋求最佳分割時的考慮的特徵數量,即特徵數達到多大時進行分割。
int:max_features等於這個int值
float:max_features是一個百分比,每(max_features * n_features)特徵在每個分割出被考慮。
"auto":max_features等於sqrt(n_features)
"sqrt":同等於"auto"時
"log2":max_features=log2(n_features)
None:max_features = n_features
max_depth:int型取值或者None,默認爲None
樹的最大深度
min_samples_split:int型取值,float型取值,默認爲2
分割內部節點所需的最少樣本數量
int:如果是int值,則就是這個int值
float:如果是float值,則爲min_samples_split * n_samples
min_samples_leaf:int取值,float取值,默認爲1
葉子節點上包含的樣本最小值
int:就是這個int值
float:min_samples_leaf * n_samples
min_weight_fraction_leaf : float,default=0.
能成爲葉子節點的條件是:該節點對應的實例數和總樣本數的比值,至少大於這個min_weight_fraction_leaf值
max_leaf_nodes:int類型,或者None(默認None)
最大葉子節點數,以最好的優先方式生成樹,最好的節點被定義爲雜質相對較少,即純度較高的葉子節點
min_impurity_split:float取值
樹增長停止的閥值。一個節點將會分裂,如果他的雜質度比這個閥值;如果比這個值低,就會成爲一個葉子節點。
min_impurity_decrease:float取值,默認0.
一個節點將會被分裂,如果分裂之後,雜質度的減少效果高於這個值。
bootstrap:boolean類型取值,默認True
是否採用有放回式的抽樣方式
oob_score:boolean類型取值,默認False
是否使用袋外樣本來估計該模型大概的準確率
n_jobs:int類型取值,默認1
擬合和預測過程中並行運用的作業數量。如果爲-1,則作業數設置爲處理器的core數。
class_weight:dict, list or dicts, "balanced"
如果沒有給定這個值,那麼所有類別都應該是權重1
對於多分類問題,可以按照分類結果y的可能取值的順序給出一個list或者dict值,用來指明各類的權重.
"balanced"模式,使用y值自動調整權重,該模式類別權重與輸入數據中的類別頻率成反比,
即n_samples / (n_classes * np.bincount(y)),分佈爲第n個類別對應的實例數。
"balanced_subsample"模式和"balanced"模式類似,只是它計算使用的是有放回式的取樣中取得樣本數,而不是總樣本數
該類的主要屬性:
屬性:
estimators_:決策樹列表
擬合好的字分類器列表,也就是單個決策樹
classes_:array of shape = [n_features]
類別標籤列表
n_classes_:int or list
類別數量
n_features:int
擬合過程中使用的特徵的數量
n_outputs:int
擬合過程中輸出的數量
featrue_importances:特徵重要程度列表
值越大,說明越重要
oob_score:array of shape = [n_features]
使用oob數據集測試得到的得分數
oob_decision_funtion_:array of shape = [n_features, n_classes]
oob樣本預測結果,每一個樣本及相應結果對列表
該類的主要方法:
方法:
apply(X):用構造好的森林中的樹對數據集X進行預測,返回每棵樹預測的葉子節點。所以結果應該是二維矩陣,
行爲樣本第幾個樣本,列爲每棵樹預測的葉子節點。
decision_path(X):返回森林中的決策路徑
fit(X, y[, sample_weight]):用訓練數據集(x, y)來構造森林
get_params([deep]):獲得分類器的參數
predict(X):預測X的類別
predict_log_proba(X):預測X的類的對數概率,和predict_proba類似,只是取了對數
predict_proba(X):預測X的類別的概率。輸入樣本的預測類別概率被計算爲森林中樹木的平均預測類別概率。
單個樹的類概率是葉中同一類的樣本的比率。因爲葉子節點並不是完全純淨的,它也有雜質,
不同種類所佔惡比率是不一樣的,但肯定有一類純度很高。返回值是array of shape = [n_samples, n_classes]
score(X, y[,sample_weight]):返回給定的數據集(數據集指定了類別)的預測準確度
set_params(**params):設置決策樹的參數
2. Demo - 處理印第安人糖尿病診斷問題
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import numpy as np
# 導入數據
dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',')
# 分割輸入x和輸出Y
x = dataset[:, 0: 8]
Y = dataset[:, 8]
feature_train, feature_test, target_train, target_test = train_test_split(x, Y, test_size=0.2, random_state=56)
rf_model = RandomForestClassifier(n_estimators=100)
rf_model.fit(feature_train, target_train)
predict_results = rf_model.predict(feature_test)
print(accuracy_score(predict_results, target_test))
結果:
3. 使用GridSearchCV調參
官方API
1)引入GridSearchCV
from sklearn.model_selection import GridSearchCV
2)調參1:n_estimators
弱學習器的最大迭代次數,或者說最大的弱學習器的個數。一般來說n_estimators太小,容易欠擬合,n_estimators太大,計算量會太大,並且n_estimators到一定的數量後,再增大n_estimators獲得的模型提升很小,所以一般選擇一個適中的數值,默認是100。
param_test1 = {'n_estimators': range(80, 201, 10)}
gsearch1 = GridSearchCV(estimator=RandomForestClassifier(min_samples_split=100,
min_samples_leaf=20, max_depth=8, max_features='sqrt',
random_state=10),
param_grid=param_test1, scoring='roc_auc', cv=5)
gsearch1.fit(x, Y)
print(gsearch1.best_params_, gsearch1.best_score_)
結果:
3)接着對決策樹最大深度max_depth和內部節點再劃分所需最小樣本數min_samples_split進行網格搜索
# 調參2:max_depth,min_samples_split
param_test2 = {'max_depth': range(3, 14, 2), 'min_samples_split': range(50, 201, 20)}
gsearch2 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170,
min_samples_leaf=20, max_features='sqrt', oob_score=True,
random_state=10),
param_grid=param_test2, scoring='roc_auc', iid=False, cv=5)
gsearch2.fit(x, Y)
print(gsearch2.best_params_, gsearch2.best_score_)
結果:
4)對內部節點再劃分所需最小樣本數min_samples_split和葉子節點最少樣本數min_samples_leaf一起調參
# 調參3:min_samples_split,min_samples_leaf
param_test3 = {'min_samples_split': range(80, 150, 20), 'min_samples_leaf': range(10, 60, 10)}
gsearch3 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170, max_depth=7,
max_features='sqrt', oob_score=True, random_state=10),
param_grid=param_test3, scoring='roc_auc', iid=False, cv=5)
gsearch3.fit(x, Y)
print(gsearch3.best_params_, gsearch3.best_score_)
結果:
5)對最大特徵數max_features調參
# 調參:max_features
param_test4 = {'max_features': range(3, 8, 1)}
gsearch4 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170, max_depth=7, min_samples_split=80,
min_samples_leaf=10, oob_score=True, random_state=10),
param_grid=param_test4, scoring='roc_auc', iid=False, cv=5)
gsearch4.fit(x, Y)
print(gsearch4.best_params_, gsearch4.best_score_)
結果:
參考:機器學習之集成學習(七)隨機森林scikit-learn庫
可見調參不一定是有用的