sklearn分类报告使用pandas数据框作为输入时出现错误:"TypeError:not all arguments converted during string formatting"。

3

我想使用sklearn.metrics.classification_report函数来处理Pandas数据框架中的数据。

数据框架df_joined看起来像这样,并且有100行:

Timestamp    Label       Pred
2016-10-05   29.75  30.781430
2016-10-06   30.35  31.379146
2016-10-07   31.59  31.174824
2017-02-13   29.63  29.875497
2017-02-14   29.60  29.923161
2017-02-15   30.22  30.257284
2017-02-16   30.12  30.374257
2017-02-17   30.09  30.357196
2017-02-20   31.03  30.971070
2017-02-21   31.05  30.930189

我现在正在尝试通过以下方式打印classification_report:

print 'Classification Report:', '\n', sklearn.metrics.classification_report(df_joined[label],df_joined['Pred'] )

我遇到了一个错误:

文件 "\Python\WinPython-32bit-2.7.10.3\python-2.7.10\lib\site-packages\sklearn\utils\multiclass.py", 第106行, 在 unique_labels 方法中 raise ValueError("Unknown label type: %r" % ys)

TypeError: not all arguments converted during string formatting

我尝试使用 sklearn.metrics.classification_report(df_joined[label].values, df_joined['Pred'].values),但它产生了相同的错误。

有人知道这个错误的原因吗?


我猜这是因为y_truey_pred中的唯一值不匹配(可能是y_true中有NaN或一些未知的值)。因此,在遇到不存在的值时,它会抛出错误,因此无法为其分配有效的标签。尝试打印出两个数组中的唯一值以检查是否确实是这种情况。 - Nickil Maveli
我尝试将数据框切割到[0:10]的值并打印它们。´df_joined [Label] = [29.75 30.35 31.59 30.71 30.2 29.66 29.71 30.32 30.77 31.36]´ ´df_joined ['Pred'] = [30.90649 31.56767 31.36999 30.38091 29.80005 30.301 30.93984 31.30669 31.74146 32.21558]´,所以它们应该匹配,但我仍然得到相同的错误。 - Markus W
同时将它们作为函数结果中的值也会导致相同的错误。'print 'Classification Report:', '\n', sklearn.metrics.classification_report([ 29.75, 30.35, 31.59, 30.71, 30.2, 29.66, 29.71, 30.32, 30.77, 31.36],[ 30.90649, 31.56767, 31.36999, 30.38091, 29.80005, 30.301, 30.93984, 31.30669, 31.74146, 32.21558])' 是否需要进行特殊格式化处理? - Markus W
你应该使用'Label'而不是label,这样更好。虽然我不认为这是问题所在。 - Henry
不幸的是,问题似乎不在那里。代码嵌入在一个函数中,在这个函数中我将标签作为变量传递,而在这种情况下它是“Label”。 - Markus W
你的sklearn是哪个版本? - Dennis Golomazov
2个回答

5
我认为classification_report量化了您对数据点的标签进行分类/预测的效果,而不是其实际值。标签不能是浮点数,在sklearn文档sklearn用户指南中的所有示例都使用整数作为标签。
参数也暗示了这一点,因为除了传递1-d数组之外,还有一个特定的标签数组构造用于替代。
sklearn.metrics.classification_report(y_true, y_pred, labels=None,target_names=None, sample_weight=None, digits=2)

y_true : 1d array-like, or label indicator array / sparse matrix

    Ground truth (correct) target values.

y_pred : 1d array-like, or label indicator array / sparse matrix

    Estimated targets as returned by a classifier.

...

如果您的数据是整数标签,那么您传递的确切数据框格式就可以正常工作:
# Does not raise an error 
classification_report(df_joined['Label'].astype(int), df_joined['Pred'].astype(int))

你可以在模型评估:量化预测质量中了解更多关于sklearn不同模型评估工具的内容,并选择一个适合评估你的分类器的工具。

好的,非常感谢。由于我是sklearn的新手,我认为我一直在尝试以不正确的方式使用此报告。当传递int值时,它可以完美地工作。 - Markus W

2

如果将它们作为list类型拿出来会发生什么?

例如:

print '分类报告:', '\n', sklearn.metrics.classification_report(df_joined['Label'].tolist(),df_joined['Pred'].tolist() )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接