【发布时间】: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