Вычислить частоту совпадения и точность сгруппированных кадров данных - PullRequest
0 голосов
/ 18 марта 2020

У меня есть 4 кадра данных, и я хотел бы сравнить и вычислить точность совпадения.

DATA_LABELS = {'DATA_LABELS': ['1', '2', '3', '3', '4', '3', '3', '1', '2', '4']}
EQ_LABELS =     {'EQ_LABELS': ['1', '1', '1', '1', '1', '0', '0', '0', '0', '0']}
EQ_NUM =           {'EQ_NUM': ['1', '1', '1', '2', '2', '1', '1', '2', '2', '2']}
pred =               {'pred': ['1', '2', '1', '3', '4', '3', '2', '1', '3', '4']}

данные сгруппированы по EQ_LABELS и EQ_NUM, например:

, когда EQ_LABELS = 1 и EQ_NUM = 1, соответствующие DATA_LABELS и pred - это ['1', '2', '3'] и ['1', '2', '1'], поэтому total = 3 и Correct (равно) = 2, pred_proba (точность) = 0,67

для остальных:

  EQ_LABELS EQ_NUM total Correct pred_proba
    1       1      3      2      0.67
    1       2      2      2      1.00
    0       1      2      1      0.50
    0       2      3      2      0.67

, и я хочу получить два новых кадра данных в качестве вывода, например

y_true  =  {'y_true': ['1', '1', '0', '0']}
y_pred =   {'y_pred': ['0.67', '1', '0.5', '0.67']}

1 Ответ

0 голосов
/ 18 марта 2020

Попробуйте это:

#Using your data definitions
DATA_LABELS = {'DATA_LABELS': ['1', '2', '3', '3', '4', '3', '3', '1', '2', '4']}
EQ_LABELS =     {'EQ_LABELS': ['1', '1', '1', '1', '1', '0', '0', '0', '0', '0']}
EQ_NUM =           {'EQ_NUM': ['1', '1', '1', '2', '2', '1', '1', '2', '2', '2']}
pred =               {'pred': ['1', '2', '1', '3', '4', '3', '2', '1', '3', '4']}

#Creating combined dataframe
df = pd.concat([pd.DataFrame(i) for i in [DATA_LABELS, EQ_LABELS, EQ_NUM, pred]], axis=1)

#Creating boolean matrix then grouping and taking the mean
(df['DATA_LABELS'] == df['pred']).groupby([df['EQ_LABELS'],df['EQ_NUM']])\
                                 .mean()\
                                 .rename('pred_proba')\
                                 .reset_index()

Вывод:

  EQ_LABELS EQ_NUM  pred_proba
0         0      1    0.500000
1         0      2    0.666667
2         1      1    0.666667
3         1      2    1.000000

И, возвращая словари:

y_true = df_out[['EQ_LABELS']].rename(columns={'EQ_LABELS':'y_true'}).to_dict(orient='list')
y_pred = df_out[['pred_proba']].rename(columns={'pred_proba':'y_pred'}).to_dict(orient='list')
print(y_true)
print(y_pred)

Вывод:

{'y_true': ['0', '0', '1', '1']}
{'y_pred': [0.5, 0.6666666666666666, 0.6666666666666666, 1.0]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...