ValueError:pos_label = 1不是有效的标签:array(['neg','pos'],dtype ='<U3')

Mr.*_*ard 7 python precision machine-learning precision-recall

尝试获取召回分数时,我收到此错误。

X_test = test_pos_vec + test_neg_vec
Y_test = ["pos"] * len(test_pos_vec) + ["neg"] * len(test_neg_vec)

recall_average = recall_score(Y_test, y_predict, average="binary")

print(recall_average)
Run Code Online (Sandbox Code Playgroud)

这会给我:

    C:\Users\anca_elena.moisa\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\metrics\classification.py:1030: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  if pos_label not in present_labels:
Traceback (most recent call last):
  File "G:/PyCharmProjects/NB/accuracy/script.py", line 812, in <module>
    main()
  File "G:/PyCharmProjects/NB/accuracy/script.py", line 91, in main
    evaluate_model(model, train_pos_vec, train_neg_vec, test_pos_vec, test_neg_vec, False)
  File "G:/PyCharmProjects/NB/accuracy/script.py", line 648, in evaluate_model
    recall_average = recall_score(Y_test, y_predict, average="binary")
  File "C:\Users\anca_elena.moisa\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\metrics\classification.py", line 1359, in recall_score
    sample_weight=sample_weight)
  File "C:\Users\anca_elena.moisa\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\metrics\classification.py", line 1036, in precision_recall_fscore_support
    (pos_label, present_labels))
ValueError: pos_label=1 is not a valid label: array(['neg', 'pos'],
      dtype='<U3')
Run Code Online (Sandbox Code Playgroud)

我试图以这种方式将“ pos”转换为1,将“ neg”转换为0:

for i in range(len(Y_test)):
     if 'neg' in Y_test[i]:
         Y_test[i] = 0
     else:
         Y_test[i] = 1
Run Code Online (Sandbox Code Playgroud)

但这给了我另一个错误:

    C:\Users\anca_elena.moisa\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\metrics\classification.py:181: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  score = y_true == y_pred
Traceback (most recent call last):
  File "G:/PyCharmProjects/NB/accuracy/script.py", line 812, in <module>
    main()
  File "G:/PyCharmProjects/NB/accuracy/script.py", line 91, in main
    evaluate_model(model, train_pos_vec, train_neg_vec, test_pos_vec, test_neg_vec, False)
  File "G:/PyCharmProjects/NB/accuracy/script.py", line 648, in evaluate_model
    recall_average = recall_score(Y_test, y_predict, average="binary")
  File "C:\Users\anca_elena.moisa\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\metrics\classification.py", line 1359, in recall_score
    sample_weight=sample_weight)
  File "C:\Users\anca_elena.moisa\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\metrics\classification.py", line 1026, in precision_recall_fscore_support
    present_labels = unique_labels(y_true, y_pred)
  File "C:\Users\anca_elena.moisa\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\utils\multiclass.py", line 103, in unique_labels
    raise ValueError("Mix of label input types (string and number)")
ValueError: Mix of label input types (string and number)
Run Code Online (Sandbox Code Playgroud)

我想做的是获取指标:准确性,准确性,召回率,f_measure。使用average='weighted',我得到相同的结果:准确性=召回率。我猜这是不正确的,因此我更改了average='binary',但出现了这些错误。有任何想法吗?

小智 6

recall_average = recall_score(Y_test, y_predict, average="binary", pos_label="neg")
Run Code Online (Sandbox Code Playgroud)

使用"neg""pos"作为pos_label,此错误不会再次出现。

  • 因为召回率和精度有两个分数 i) 就 -ve 值而言 ii) 就 +ve 值而言 所以您需要在 pos_label 中传递这些值之一,以便函数可以根据该 pos 标签返回分数 (2认同)

Ign*_*rre 6

当你面对这个错误就意味着你的价值target变量都没有预期的一个recall_score(),它默认是为阳性病例1负的情况下0 [这也适用于precision_score()]

从你提到的错误:

pos_label=1 is not a valid label: array(['neg', 'pos']
Run Code Online (Sandbox Code Playgroud)

很明显,你的积极情景的价值是pos而不是1消极的neg而不是0

然后你必须选择解决这个不匹配的问题:

  • 更改中的默认值recall_score()以考虑pos出现以下情况时的积极情况:
recall_average = recall_score(Y_test, y_predict, average="binary", pos_label='pos') 
Run Code Online (Sandbox Code Playgroud)
  • 将数据集中目标变量的值更改为10
Y_test = Y_test.map({'pos': 1, 'neg': 0}).astype(int)
Run Code Online (Sandbox Code Playgroud)