我設法用GridSearchCV
from sklearn.datasets import fetch_covtype
from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation
from sklearn import grid_search
import numpy as np
covtype = fetch_covtype()
clf = RandomForestClassifier()
X_train, X_test, y_train, y_test = cross_validation.train_test_split(covtype.data,
covtype.target,
test_size=0.33,
random_state=42)
params = {'n_estimators':[30, 50, 100],
'max_features':['sqrt', 'log2', 10]}
gsv = grid_search.GridSearchCV(clf, params, cv=3,
n_jobs=-1, scoring='f1')
gsv.fit(X_train, y_train)
print metrics.classification_report(y_train, gsv.best_estimator_.predict(X_train))
print metrics.classification_report(y_test, gsv.best_estimator_.predict(X_test))
輸出讓你的模型很好的改善:
precision recall f1-score support
1 1.00 1.00 1.00 141862
2 1.00 1.00 1.00 189778
3 1.00 1.00 1.00 24058
4 1.00 1.00 1.00 1872
5 1.00 1.00 1.00 6268
6 1.00 1.00 1.00 11605
7 1.00 1.00 1.00 13835
avg/total 1.00 1.00 1.00 389278
precision recall f1-score support
1 0.97 0.95 0.96 69978
2 0.95 0.97 0.96 93523
3 0.95 0.96 0.95 11696
4 0.92 0.86 0.89 875
5 0.94 0.78 0.86 3225
6 0.94 0.90 0.92 5762
7 0.97 0.95 0.96 6675
avg/total 0.96 0.96 0.96 191734
這是不是太遙遠的Kaggle leaderboard分數(請注意,Kaggle比賽採用的是更具挑戰性的數據拆分,但!)
如果你想看到更多的改進,那麼你將不得不考慮的不平課程以及如何最好地選擇您的培訓數據。
注意
我用估計的數量較少比我會通常以節省時間,但是在訓練集中表現不錯的機型,所以你可能沒有考慮這一點。
我使用了一小部分max_features
,因爲通常這會減少模型訓練中的偏差。雖然這並非總是如此。
我用f1
得分,因爲我不太瞭解數據集,並且f1
在分類問題上工作得很好。
我試過你的代碼,並且還打印出了n_estimators = 100和max_features = 10的最佳參數(best_params_)。然後,我調整我的代碼以使用這些參數,並且還添加了參數scoring ='f1_weighted'。不幸的是,我仍然得到同樣糟糕的結果。 任何想法? clf = RandomForestClassifier(n_estimators = 100,max_features = 10) scores = cross_validation.cross_val_score(clf,covtype.data,covtype.target,scoring ='f1_weighted') –