我编写了以下Python代码,用于在UCI ML repo上使用Forest CoverType数据集运行RandomForestClassifier(使用默认参数设置)。然而,结果非常差,精度约为60%,而这种技术应该能够达到90%以上(例如Weka)。我已经尝试将n_estimators增加到100,但这并没有带来太大的改善。
关于我在scikit-learn中使用这种技术可以做些什么来获得更好结果的任何想法,或者这可能是导致这种糟糕表现的原因?
from sklearn.datasets import fetch_covtype
from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation
covtype = fetch_covtype()
clf = RandomForestClassifier()
scores = cross_validation.cross_val_score(clf, covtype.data, covtype.target)
print scores
[ 0.5483831 0.58210057 0.61055001]
答案 0 :(得分:1)
我使用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
在分类问题上往往效果很好。
答案 1 :(得分:0)
您可以尝试以下方法来提高您的分数: -
在您可用的所有属性上训练模型。它将过度训练,但它会让你知道你可以在训练集上达到多少准确度。
接下来使用clf.feature_importances _
使用网格搜索CV调整模型的超参数。使用交叉验证和oob_score(超出行李分数)来更好地估计泛化。
答案 2 :(得分:0)
您是否使用相同的数据集和相同的估算器得到90%?因为数据集在
之间分割用于训练数据子集的前11,340条记录
接下来用于验证数据子集的3,780条记录
用于测试数据子集的最后565,892条记录
并且文档声称具有以下性能,这使得未经调整的随机林不会那么差:
70%神经网络(反向传播)
58%线性判别分析
至于sbatch --mail-user=<your-email-address> --mail-type=START --dependency=afterany:<your-job-id> --wrap "echo OK"
等于100,你可以增加到500,1.000甚至更多。检查每个结果,并在分数开始稳定时保留数字。
问题可能来自Weka的默认超参数与Scikit-Learn相比。您可以调整其中一些以改善结果:
n_estimators
了解每个树节点上要拆分的要素数。max_features
也许这个模型过于深入了解你的训练数据max_depth
,min_samples_split
,min_samples_leaf
和min_weight_fraction_leaf
处理样本在树叶间的重新分区 - 何时保留或不保留。您也可以尝试通过组合它们,或通过缩小尺寸来处理您的功能。
您应该查看像here这样的kaggle脚本,如果他们描述如何使用max_leaf_nodes
获得78%(但是,训练集包含11.340 + 3780个回复 - 他们似乎使用了ExtraTreesClassifier
虽然