【问题标题】:Output of sklearn.ensemble.RandomForestClassifier includes NaN valuessklearn.ensemble.RandomForestClassifier 的输出包括 NaN 值
【发布时间】:2017-01-21 04:10:12
【问题描述】:

我正在使用sklearn.ensemble.RandomForestClassifier 分析数据,我很困惑地看到预测中的 NaN 值在训练集或测试集中没有任何 NaN。

print preds_y[preds_y.isnull().any(axis=1)].shape
print train_y[train_y.isnull().any(axis=1)].shape
print train_features[train_features.isnull().any(axis=1)].shape
print test_features[train_features.isnull().any(axis=1)].shape

> (4830, 1)
> (0, 1)
> (0, 22)
> (0, 22)

这些 NaN 值导致对 sklearn.metrics.classification_report 的调用失败并出现以下错误:

> ValueError: Mix of label input types (string and number)

现在我最感兴趣的是了解为什么随机森林会吐出 NaN。一旦我弄清楚这一点,我就可以相应地过滤结果并查看该方法的执行情况。

提前感谢您的意见。

(很抱歉,如果之前有人问过这个问题。我搜索了它,但我发现的所有结果都与训练数据中的 NaN 有关,这根本不是我的问题。)

编辑 1:为了清楚起见,输出中有许多有效的预测:

print preds_y[~preds_y.isnull().any(axis=1)].shape
print train_y[~train_y.isnull().any(axis=1)].shape

> (11760, 1)
> (39749, 1)

编辑 2:

正如我在下面的评论中所写,原始数据具有数字列和分类列。在调用 fit() 之前,使用 pandas.get_dummies() 将所有分类列转换为数字。我将结果转换回 pandas.DataFrame 并重建原始分类列以提高可读性。两个 pandas.Series —— 预测值和实际值—— 我喂的分类报告()只有一种类型(类别)。

如果随机森林为与原始分类列对应的每个虚拟二进制列预测 0,则预测中的 NaN 似乎会出现。我没想到这种情况会如此频繁地发生——似乎我 30% 的条目未分类——但我不确定在这个问题上还有什么要补充的。

【问题讨论】:

  • 您的数据是什么样的?目标类是否有混合类型?
  • 原始数据有数字列和分类列。在调用 fit() 之前,使用 pandas.get_dummies() 将所有分类列转换为数字。我将结果转换回 pandas.DataFrame 并重建原始分类列以提高可读性。两个 pandas.Series —— 预测值和实际值—— 我喂的分类报告()只有一种类型(类别)。

标签: python scikit-learn classification random-forest


【解决方案1】:

您可以先将所有NaN 替换为零,从而删除它们。 见this link

也许使用df.fillna(0),那么我想你应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多