带有熊猫数据框输入的 sklearn 分类报告产生:“TypeError:并非所有参数都在字符串格式化期间转换”

Posted

技术标签:

【中文标题】带有熊猫数据框输入的 sklearn 分类报告产生:“TypeError:并非所有参数都在字符串格式化期间转换”【英文标题】:sklearn classification_report with input from pandas dataframe produces: "TypeError: not all arguments converted during string formatting" 【发布时间】:2017-08-16 08:47:51 【问题描述】:

我正在尝试使用 Pandas 数据框中的数据运行 sklearn.metrics.classification_report。 数据框 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

我现在正在尝试打印分类报告

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("未知标签类型:%r" % ys)

TypeError:字符串格式化期间并非所有参数都转换

我一直在尝试改用sklearn.metrics.classification_report(df_joined[label].values, df_joined['Pred'].values),但它会产生同样的错误。

有人知道这是从哪里来的吗?

【问题讨论】:

我猜这是因为 y_truey_pred 中的唯一值不匹配(y_true 中有 NaN's 或一些看不见的值)。因此,它会在遇到不存在的值时引发错误,因此无法为其分配有效标签。尝试打印出两个数组中的唯一值以检查它确实是这种情况。 我已尝试将数据框剪切为 [0:10] 值并打印出来。 'df_joined [标签] = [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.56767 31.56767 31.56767 31.3999 30.38091 29.80005 30.301 30.93984 31.30669 31.74146 32.21558]'他们应该匹配但是我得到了同样的错误。 也将它们作为值放入函数中会导致相同的错误 '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.3999,30.38091,213999,30.301,30.93984,31.3069,31.746,32.21558])“有任何特殊的格式? span> 您当然应该使用'Label' 而不是label?不过,我认为这不是问题所在。 不,不幸的是问题似乎不存在。代码嵌入在一个函数中,我将标签作为变量传递,在本例中为“标签”。 【参考方案1】:

我相信 classification_report 量化了您对数据点的标签分类/预测的程度,而不是其实际值。标签不能是浮点数,sklearn documentation 和sklearn user guide 中的所有示例都使用整数作为标签。

参数也暗示了这一点,因为传递一维数组的替代方法是仅用于标签的特定数组构造。

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))

您可以在Model evaluation: quantifying the quality of predictions 中阅读有关 sklearn 不同模型评估工具的更多信息,并选择一个适合评估您的分类器的工具。

【讨论】:

好的,非常感谢。由于我是 sklearn 的新手,我想我一直在以一种不打算使用的方式尝试这份报告。当传递 int 值时,它工作得很好。【参考方案2】:

如果将它们作为list 类型取出会怎样?

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

【讨论】:

以上是关于带有熊猫数据框输入的 sklearn 分类报告产生:“TypeError:并非所有参数都在字符串格式化期间转换”的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框上使用 sklearn TFIdfVectorizer

带有多索引熊猫数据框的条形图

熊猫适用于数据框产生'<内置方法值......'

带有 MultilabelBinarizer 的 sklearn ColumnTransformer

大熊猫上的sklearn train_test_split 按多列分层

在熊猫数据框中使用 np.isclose 报告最接近的值