带有熊猫数据框输入的 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_true
和 y_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