【问题标题】:How does one interpret the random forest classifier from sci-kit learn?如何解释 scikit learn 中的随机森林分类器?
【发布时间】:2017-05-22 01:49:55
【问题描述】:

我对随机森林的工作原理知之甚少。 通常在分类中,我可以将训练数据拟合到随机森林分类器中并要求预测测试数据。

目前我正在处理提供给我的巨量数据。这是数据集的顶部行,有 1300(大约)行。

survived pclass sex age sibsp parch fare embarked 0 1 1 female 29 0 0 211.3375 S 1 1 1 male 0.9167 1 2 151.55 S 2 0 1 female 2 1 2 151.55 S 3 0 1 male 30 1 2 151.55 S 4 0 1 female 25 1 2 151.55 S 5 1 1 male 48 0 0 26.55 S 6 1 1 female 63 1 0 77.9583 S 7 0 1 male 39 0 0 0 S 8 1 1 female 53 2 0 51.4792 S 9 0 1 male 71 0 0 49.5042 C 10 0 1 male 47 1 0 227.525 C 11 1 1 female 18 1 0 227.525 C 12 1 1 female 24 0 0 69.3 C 13 1 1 female 26 0 0 78.85 S

没有给出测试数据。所以我希望随机森林预测整个数据集的生存率并将其与实际值进行比较(更像是检查准确度分数)。

所以我所做的就是将我的完整数据集分成两部分;一个有特征,另一个预测(幸存)。 特征包含除幸存的所有列,预测包含幸存的列。

dfFeatures = df['survived']
dfTarget = dfCopy.drop('survived', 1)

注意:df 是整个数据集。

这是检查随机森林分数的代码

rfClf = RandomForestClassifier(n_estimators=100, max_features=10)
rfClf = rfClf.fit(dfFeatures, dfTarget)
scoreForRf = rfClf.score(dfFeatures, dfTarget)

我用这样的东西得到分数输出

The accuracy score for random forest is :  0.983193277311

我发现很难理解上面给定代码中的代码背后发生了什么。

它会根据其他特征 (dfFeatures) 预测所有元组的生存率,并将其与测试数据 (dfTarget) 进行比较并给出预测分数,还是它会根据训练随机创建训练和测试数据提供的数据并比较它后面生成的测试数据的准确性?

更准确地说,在计算准确度分数时,它是预测整个数据集还是随机部分数据集的生存率?

【问题讨论】:

  • 如果您手动将数据集分为训练和测试,是的,它是预测训练集中的幸存列并尝试将其与测试集匹配,这就是您的准确度得分。
  • @Arman 如果我不分为训练集和测试集怎么办。不是在幕后随机生成测试集(67-23)吗?
  • 我认为是的,关于描述测试集多少和训练集多少的参数,我不太确定,也许在那种情况下,准确度不是训练准确度得分测试准确度分数
  • @Cyber​​cop 测试/训练拆分实际上是通过子集行而不是列来完成的!后者实际上称为feature selection。我强烈建议阅读this 帖子中关于在同一数据集上使用随机森林的所有部分。
  • @Omid 是的,训练和测试拆分是在行而不是列上完成的。而且我也知道特征选择是为了分割树的一个节点。但这对我的问题有什么帮助?

标签: python machine-learning scikit-learn random-forest ensemble-learning


【解决方案1】:

不知何故,我没有看到您正在尝试将数据集拆分为训练和测试

dfWithTestFeature = df['survived']

dfWithTestFeature 仅包含幸存的列,即标签。

dfWithTrainFeatures = dfCopy.drop('survived', 1)

dfWithTrainFeatures 包含所有特征(pclass、性别、年龄等)。

现在跳转到代码,

rfClf = RandomForestClassifier(n_estimators=100, max_features=10)

上面一行是创建随机森林分类器,n_estimator 是树的深度,这个数越大会导致数据过拟合。

rfClf = rfClf.fit(dfWithTrainFeatures, dfWithTestFeature) 

上面一行是训练过程,.fit() 需要 2 个参数,第一个是特征,第二个是特征的标签(或目标值,即 'survived' 列中的值)。

scoreForRf = rfClf.score(dfWithTrainFeatures, dfWithTestFeature)

.score() 需要 2 个参数,第一个是特征,第二个是标签。 这是为了使用我们使用.fit() 函数创建的模型来预测第一个参数中的特征,而第二个参数将是验证值。

据我所知,您使用相同的数据来训练和测试不好的模型。

更准确地说,在计算准确度分数时,它是预测整个数据集还是随机部分数据集的生存率?

您使用所有数据来测试模型。

我可以使用交叉验证,但问题是我必须使用随机森林吗?随机森林的交叉验证似乎也很慢

当然,您需要使用验证来测试您的模型。创建混淆矩阵,计算精度和召回率,不仅仅取决于准确性。

如果您认为模型运行太慢,请减小 n_esimators 值。

【讨论】:

  • 首先 num_estimators 不是深度,而是随机森林中树的数量。我想要基于火车特征的树来预测幸存值。我已经在 fit 函数中拟合了这些值
  • @cybercop 哦,对不起,你是对的,它是树的编号,如果你想使用你训练的所有数据来验证你的网络,你做对了,它给出了 98.7所有 1300 多个数据的准确率百分比
  • @Om Prakash 感谢您纠正我的语法错误
猜你喜欢
  • 2013-04-26
  • 2015-03-28
  • 2017-08-25
  • 2015-02-20
  • 2015-02-21
  • 2016-06-22
  • 2017-03-26
  • 2015-09-16
  • 2015-09-28
相关资源
最近更新 更多