2021-11-26|閱讀時間 ‧ 約 6 分鐘

只用pandas算precision, recall, accuracy等指標

    如果你的機器學習模型或是任何統計最後的結果可以轉變成二分法, 假設由1和0來代表「是」與「不是」, 可以變成簡單的vector(例如pd.Series)或者dataframe的方式儲存的話, 這個簡單的教學就適用於你 如果你原本計算models的過程非常繁複, model已經算出來了, 可是當初忘了叫他算某個特定的指標, 要補算的時候
    如果用同一組資料同時預測好幾個outcomes你可能就會用dataframe來儲存 以下做法以python的Pandas.DataFrame為例 〈全部的code在最下面〉

    準備
    1. answers = 來自data的, 由0, 1來表示是與不是的pd.DataFrame
    2. predicted = 由model計算並且已經歸類為0, 1的結果

    Accuracy 總正確率 (所有你的model猜對的cases/ 全部的cases)
    1. 把answers和predicted的所有0都recode成-1
    2. 算一個新的dataframe = 兩個dataframes做element-wise乘法
    3. 把新的dataframe的 -1都recode成0
    4. 新的dataframe每個欄位的平均就是每個項目的accuracy

    Precision (你的model猜yes的情況下, 真的在data中是yes的機率)
    1. answers不動, 把predicted的0都換成missing values (e.g. np.nan)
    2. 算一個新的dataframe = 兩個dataframes做element-wise乘法
    3. 新的dataframe每個欄位的平均就是每個項目的precision

    Recall (真的在data是yes的情況下, 你的model猜yes的機率)
    1. predicted不動, 但是answers的0都換成missing values (e.g. np.nan)
    2. 算一個新的dataframe = 兩個dataframes做element-wise乘法
    3. 新的dataframe每個欄位的平均就是每個項目的precision

    F1 (Precision和Recall的調和平均數)
    1. 算出precision和recall
    2. 算出調和平均數

    全部的code在這

    # some toy data, replace with your own data frames import pandas as pd from numpy import nan predicted = pd.DataFrame({ 'a':[1., 1., 1., 1., 0.], 'b':[1., 0., 1., 1., 0.], 'c':[0., 0., 0., 1., 1.] }) answers = pd.DataFrame({ 'a':[1., 1., 1., 1., 1.], 'b':[1., 1., 1., 1., 0.], 'c':[0., 1., 0., 0., 1.] }) def accuracy(predicted:pd.DataFrame, answers:pd.DataFrame) - pd.Series: result_df = predicted.replace(0, -1) * answers.replace(0, -1) result_df.replace(-1, 0, inplace=True) return result_df.mean() def precision(predicted:pd.DataFrame, answers:pd.DataFrame) - pd.Series: result_df = predicted.replace(0, nan) * answers return result_df.mean() def recall(predicted:pd.DataFrame, answers:pd.DataFrame) - pd.Series: result_df = predicted * answers.replace(0, nan) return result_df.mean() def f1(predicted:pd.DataFrame, answers:pd.DataFrame) - pd.Series: p = precision(predicted, answers) r = recall(predicted, answers) f1 = 2 / (p**-1 + r**-1) return f1

    測試結果

    accuracy(predicted, answers) a 0.8 b 0.8 c 0.6 dtype: float64 precision(predicted, answers) a 1.0 b 1.0 c 0.5 dtype: float64 recall(predicted, answers) a 0.80 b 0.75 c 0.50 dtype: float64 f1(predicted, answers) a 0.888889 b 0.857143 c 0.500000 dtype: float64
    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.