sklearn.ensemble.RandomForestClassifier的输出包含NaN值

时间:2016-09-13 14:03:18

标签: python scikit-learn classification random-forest

我正在使用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)

现在我最感兴趣的是了解随机森林为何吐出NaNs。一旦我弄明白,我就可以相应地过滤结果,看看该方法的表现如何。

提前感谢您的意见。

(如果之前有人问我,我很抱歉。我搜索了它,但我发现训练数据中的所有结果都与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 - 预测值和实际值 - 我正在喂食classification_report()只有一种类型(类别)。

如果随机森林对与原始分类列对应的每个虚拟二进制列预测为0,则预测中的NaN似乎出现。我没想到会经常发生这种情况 - 似乎有30%的参赛作品没有分类 - 但我不确定在这个问题上还有什么需要补充的。

1 个答案:

答案 0 :(得分:-1)

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

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