我编写了以下Python代码,用于在uciml repo(使用默认参数设置)的Forest CoverType数据集上运行RandomForestClassifier。然而,结果非常差,准确度在60%左右,而该技术应能达到90%以上(例如Weka)。我已经尝试过将n_估计量增加到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]
你用相同的数据集和相同的估计值得到了90%的结果吗?因为数据集在
并且文档声称以下性能,这使您的未挖掘随机森林不那么差:
至于
n_estimators
等于100,则可以增加到500、1.000甚至更多。检查每一项的结果,并在分数开始稳定时保留数字。在这个问题可能来自于Weka的默认超参数,而不是Scikit-Learn超参数。您可以调整其中一些选项以提高结果:
max_features
获取每个树节点上要拆分的功能的数量。在max_depth
可能是模型太深而超出了您的训练数据min_samples_split
、min_samples_leaf
、min_weight_fraction_leaf
和{您也可以尝试通过组合它们来处理您的特征,或者通过减小维度。在
您应该看看kaggle脚本,比如here,如果它们描述了如何使用
ExtraTreesClassifier
获得78%的结果(但是,训练集包含11.340+3780个recor,它们似乎使用了更多的n_estimators
您可以尝试以下方法来改进分数:-在
在所有可用属性上训练模型。但你能在训练中达到多高的准确度。
接下来,使用clf.功能重要性
使用网格搜索CV调整模型的超参数。使用交叉验证和oob_分数(袋外得分)来获得更好的泛化评估。
我通过使用
GridSearchCV
对您的模型进行了很好的改进输出:
^{pr2}$这与Kaggle leaderboard的分数相差不远(请注意,Kaggle竞赛使用的是更具挑战性的数据分割!)在
如果你想看到更多的改进,那么你必须考虑不均衡的课程以及如何最好地选择你的培训数据。在
注意
为了节省时间,我使用了比通常情况下更少的估计量,但是模型在训练集上表现良好,所以您可能不必考虑这一点。在
我使用了少量的
max_features
,因为这通常会减少模型训练中的偏差。虽然这并不总是真的。在我使用了
f1
评分,因为我不太了解数据集,f1
往往在分类问题上工作得很好。在相关问题 更多 >
编程相关推荐