我正在使用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值导致对报告的调用失败,并出现以下错误:
> ValueError: Mix of label input types (string and number)
现在,我最感兴趣的是,为什么随机森林会吐鼻涕。一旦我知道了这一点,我就可以相应地过滤结果,并查看该方法的执行情况。
提前感谢您的投入。
)如果以前有人问过这个问题,我很抱歉。我搜索了它,但我在培训数据中发现的所有结果都与NaNs有关,这根本不是我的问题。)
编辑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,那么预测中的NaNs就会出现。我没有料到这种情况会如此频繁--我的参赛作品中有30%似乎没有被分类--但我不确定在这个问题上还有什么要补充的。
发布于 2018-08-18 10:15:11
首先,可以通过将所有NaN
替换为零来删除它们。见此链接。
也许使用df.fillna(0)
,那么我想你应该会没事的。
https://stackoverflow.com/questions/39472040
复制相似问题