Как вычислить процент предсказанных меток в кадре данных?

#python #pandas

Вопрос:

имея фрейм данных, моя цель состоит в том, чтобы вычислить процент предсказанных меток в соответствии со следующими условиями:

  • Процент ресурсов, имеющих manual_label B@1 вход, например, если значение из col manual_label находится в col baseline_1
  • Процент резорбций, имеющих значение manual_label in B@3 , например, если значение из col manual_label находится в col baseline_1,baseline_2,baseline_3
  • Процент прогнозируемых ресурсов, имеющих значение manual_label in P@1 , например, если значение из col manual_label находится в col label_1
  • Процент прогнозируемых резорбций, имеющих значение manual_label in P@3 , например, если значение из col manual_label находится в col label_1,label_2,label_3

Фрейм данных:

     manual_label  prediction  index  label_1  label_2  label_3 baseline_1 baseline_2 baseline_3
0              1           7      0        7        1        9          1          9          4
1              1           1      1        1        7        4          1          9          4
2              9           4      2        4        1        7          1          9          4
3              3           4      3        4        9        3          1          9          4
4              1           1      4        1        4        7          1          9          4
..           ...         ...    ...      ...      ...      ...        ...        ...        ...
496            1           1    496        1        7        3          1          9          4
497            1           1    497        1        4        7          1          9          4
498            4           7    498        4        7        1          1          9          4
499            4           1    499        7        4        1          1          9          4
500            1           1    500        1        7        4          1          9          4
 

с помощью этого решения

 baseline_p1=0
baseline_p3=0
pred_p1=0
pred_p3=0

rows=final.shape[0]
for i in range(rows):
  gold = final.iloc[i]["manual_label"]
  baseline=[final.iloc[i]["baseline_1"], final.iloc[i]["baseline_2"],final.iloc[i]["baseline_3"]]
  for j in range(len(baseline)):
    baseline[j]=baseline[j].strip()
  predictions=[final.iloc[i]["label_1"], final.iloc[i]["label_2"],final.iloc[i]["label_3"]]
  for j in range(len(predictions)):
    predictions[j]=predictions[j]
  
  if (gold==baseline[0]):
    baseline_p1 =1
  if (gold in baseline):
    baseline_p3 =1
  if (gold==predictions[0]):
    pred_p1 =1
  if (gold in predictions):
    pred_p3 =1

print("Raw counts: B@1={} B@3={} P@1={} P@3={}",baseline_p1,baseline_p3,pred_p1,pred_p3)
print("Percentages: B@1={} B@3={} P@1={} P@3={}",baseline_p1/rows,baseline_p3/rows,pred_p1/rows,pred_p3/rows)
 

Я могу получить только процент от B@1 и B@3 . Для P@1 и P@3 в результате у меня есть 0.0

 Raw counts: B@1={} B@3={} P@1={} P@3={} 171 374 0 0
Percentages: B@1={} B@3={} P@1={} P@3={} 0.3413173652694611 0.7465069860279441 0.0 0.0
 

Как я могу решить эту проблему?

Спасибо

Ответ №1:

Нет необходимости перебирать строки, потому что вместо этого вы можете работать с логическими рядами:

 manual_is_base1 = final.manual_label == final.baseline_1
manual_is_base2 = final.manual_label == final.baseline_2
manual_is_base3 = final.manual_label == final.baseline_3
manual_is_anybase = manual_is_base1 | manual_is_base2 | manual_is_base3

manual_is_pred1 = final.manual_label == final.label_1
manual_is_pred2 = final.manual_label == final.label_2
manual_is_pred3 = final.manual_label == final.label_3
manual_is_anypred = manual_is_pred1 | manual_is_pred2 | manual_is_pred3

baseline_p1 = sum(manual_is_base1)
baseline_p3 = sum(manual_is_anybase)

pred_p1 = sum(manual_is_pred1)
pred_p3 = sum(manual_is_anypred)
 

В любом случае, я думаю, что проблема, с которой вы столкнулись при вычислении pred_p1 , pred_p3 связана не с вашим кодом, а скорее с проблемой в ваших данных. После удаления for j in range(len(baseline)): baseline[j]=baseline[j].strip() из вашего кода я запустил его на фрагменте фрейма данных, который вы опубликовали, и он работал, как и ожидалось.

Тот факт, что у вас есть эти две строки в коде, указывает на то, что базовые значения в ваших данных являются строками, что уже является плохим знаком. Попробуйте выяснить, почему и исправить данные, чтобы панды могли использовать их в качестве числового типа.