RandomForestClassifi性能差

2024-09-30 22:28:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了以下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] 

Tags: 代码fromimportrepofetchsklearn技术validation
3条回答

你用相同的数据集和相同的估计值得到了90%的结果吗?因为数据集在

first 11,340 records used for training data subset

next 3,780 records used for validation data subset

last 565,892 records used for testing data subset

并且文档声称以下性能,这使您的未挖掘随机森林不那么差:

70% Neural Network (backpropagation)

58% Linear Discriminant Analysis

至于n_estimators等于100,则可以增加到500、1.000甚至更多。检查每一项的结果,并在分数开始稳定时保留数字。在

这个问题可能来自于Weka的默认超参数,而不是Scikit-Learn超参数。您可以调整其中一些选项以提高结果:

  • max_features获取每个树节点上要拆分的功能的数量。在
  • max_depth可能是模型太深而超出了您的训练数据
  • min_samples_splitmin_samples_leafmin_weight_fraction_leaf和{}处理的是样本在树叶之间的重新分配——什么时候保存它们。在

您也可以尝试通过组合它们来处理您的特征,或者通过减小维度。在

您应该看看kaggle脚本,比如here,如果它们描述了如何使用ExtraTreesClassifier获得78%的结果(但是,训练集包含11.340+3780个recor,它们似乎使用了更多的n_estimators

您可以尝试以下方法来改进分数:-在

  1. 在所有可用属性上训练模型。但你能在训练中达到多高的准确度。

  2. 接下来,使用clf.功能重要性

  3. 使用网格搜索CV调整模型的超参数。使用交叉验证和oob_分数(袋外得分)来获得更好的泛化评估。

我通过使用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))

输出:

^{pr2}$

这与Kaggle leaderboard的分数相差不远(请注意,Kaggle竞赛使用的是更具挑战性的数据分割!)在

如果你想看到更多的改进,那么你必须考虑不均衡的课程以及如何最好地选择你的培训数据。在

注意

为了节省时间,我使用了比通常情况下更少的估计量,但是模型在训练集上表现良好,所以您可能不必考虑这一点。在

我使用了少量的max_features,因为这通常会减少模型训练中的偏差。虽然这并不总是真的。在

我使用了f1评分,因为我不太了解数据集,f1往往在分类问题上工作得很好。在

相关问题 更多 >