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

閱讀時間約 5 分鐘

如果你的機器學習模型或是任何統計最後的結果可以轉變成二分法, 假設由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
為什麼會看到廣告
    10會員
    15內容數
    對工程師友善的(目前免費)英文教材 #工程師 #Coding #Python #Django #English #英文 #文法 #語言學習 #程式
    留言0
    查看全部
    發表第一個留言支持創作者!
    寂寞小冬瓜的沙龍 的其他內容
    Django in production is a different beast from its development counterpart. 這句怎麼解呢
    本文獻給根本魯一樣困在學術界不得超脫的博士生同夥,希望即能夠幫助到你。就算沒有,希望至少相濡以沫,共勉之。 論文地獄的高級煩惱
    我們來解析Python官方文件的英文句子吧!怎麼寫美美的code的PEP 8的引文
    筆者兼職成人美語教師的過程中,發現許多學生很努力,卻沒有人提點過一些學習方法,所以將自己外文系的訓練過程記錄下來,希望能夠發揮小小的作用。也請不吝指教!
    「不是不在乎別人的想法,而是用不同的方式在乎」是指「在乎別人的想法,但是不再認為別人應該要尊重或認同我們」
    在學Java的人也許多少人會跟小的一樣不是很理解functional interface到底在幹嘛,也覺得語法很多此一舉。希望能夠在此拋磚引玉
    Django in production is a different beast from its development counterpart. 這句怎麼解呢
    本文獻給根本魯一樣困在學術界不得超脫的博士生同夥,希望即能夠幫助到你。就算沒有,希望至少相濡以沫,共勉之。 論文地獄的高級煩惱
    我們來解析Python官方文件的英文句子吧!怎麼寫美美的code的PEP 8的引文
    筆者兼職成人美語教師的過程中,發現許多學生很努力,卻沒有人提點過一些學習方法,所以將自己外文系的訓練過程記錄下來,希望能夠發揮小小的作用。也請不吝指教!
    「不是不在乎別人的想法,而是用不同的方式在乎」是指「在乎別人的想法,但是不再認為別人應該要尊重或認同我們」
    在學Java的人也許多少人會跟小的一樣不是很理解functional interface到底在幹嘛,也覺得語法很多此一舉。希望能夠在此拋磚引玉
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
          你有遇過這種情況嗎,當你與對方溝通時,不管你說了甚麼,對方都聽不進去,還會一直反駁你,而對方反駁點在你聽來,都是一些荒謬難以置信的事,甚至會認為對方是在故意找碴。
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們在原有的資料表上,將所有在欄位quantity的缺失值填補為0。 題目的原文敘述 測試範例 Example 1: Input:+-----------------+----------+-------+ | nam
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們在原有的資料表上,將欄位grade的資料型別從原本的float變更為int整數型別。 題目的原文敘述 測試範例 Example 1: Input: DataFrame students: +------------
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們以原有的資料表email欄位為比較基準,刪除重複的列 data rows,只保留最早第一次出現的。 題目的原文敘述 Example 1: Input: +-------------+---------+--------
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們回傳student_id為101的這筆資料,並且列出它的"name"和"age"欄位。 題目的原文敘述 測試範例 Example 1: Input: +------------+---------+-----+ |
    Thumbnail
    國家繁榮與否,端看國民人的財力狀況是否雄厚。身上沒錢,所有的人都不會給好臉色。我們之所以一直沒有賺到財富的原因,其實是因為我們從來沒有去追求過。財富就是力量,財富能讓許多事都變可能。
    Thumbnail
    一隻手能做兩隻手才能做到的事嗎? 諾曼.馬龍(Norman Malone)彈的一手好鋼琴,但他到78歲才開了第一場個人演奏會。為什麼?因為他真的只能用一隻手彈琴。 貝多芬從四歲開始就被爸爸逼迫練琴... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
    Thumbnail
    沒錯,今天還是要繼續進行pandas教學,因為pandas對於我們資料的處理來說,真的太重要了,但別放棄,今天將會是pandas的最後一天教學,今天我們就來學習如何對資料庫進行分組,以及我們在分析股票時最重要的時間序列上的處理,那廢話不多說,馬上進行我們今天的教學吧!!
    Thumbnail
    今天我們就來繼續對昨天的資料庫進行更多的操作教學,今天會教如何更改index的欄位、如何更改index或是columns的名稱,以及如何進行資料的合併
    Thumbnail
    在昨天的教學中,我們用了自己創立的DataFrame做了一些基礎的操作教學,今天我們就來點實際的教學,透過真實的csv檔來一步步學習該如何處理吧!!
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
          你有遇過這種情況嗎,當你與對方溝通時,不管你說了甚麼,對方都聽不進去,還會一直反駁你,而對方反駁點在你聽來,都是一些荒謬難以置信的事,甚至會認為對方是在故意找碴。
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們在原有的資料表上,將所有在欄位quantity的缺失值填補為0。 題目的原文敘述 測試範例 Example 1: Input:+-----------------+----------+-------+ | nam
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們在原有的資料表上,將欄位grade的資料型別從原本的float變更為int整數型別。 題目的原文敘述 測試範例 Example 1: Input: DataFrame students: +------------
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們以原有的資料表email欄位為比較基準,刪除重複的列 data rows,只保留最早第一次出現的。 題目的原文敘述 Example 1: Input: +-------------+---------+--------
    Thumbnail
    題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們回傳student_id為101的這筆資料,並且列出它的"name"和"age"欄位。 題目的原文敘述 測試範例 Example 1: Input: +------------+---------+-----+ |
    Thumbnail
    國家繁榮與否,端看國民人的財力狀況是否雄厚。身上沒錢,所有的人都不會給好臉色。我們之所以一直沒有賺到財富的原因,其實是因為我們從來沒有去追求過。財富就是力量,財富能讓許多事都變可能。
    Thumbnail
    一隻手能做兩隻手才能做到的事嗎? 諾曼.馬龍(Norman Malone)彈的一手好鋼琴,但他到78歲才開了第一場個人演奏會。為什麼?因為他真的只能用一隻手彈琴。 貝多芬從四歲開始就被爸爸逼迫練琴... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
    Thumbnail
    沒錯,今天還是要繼續進行pandas教學,因為pandas對於我們資料的處理來說,真的太重要了,但別放棄,今天將會是pandas的最後一天教學,今天我們就來學習如何對資料庫進行分組,以及我們在分析股票時最重要的時間序列上的處理,那廢話不多說,馬上進行我們今天的教學吧!!
    Thumbnail
    今天我們就來繼續對昨天的資料庫進行更多的操作教學,今天會教如何更改index的欄位、如何更改index或是columns的名稱,以及如何進行資料的合併
    Thumbnail
    在昨天的教學中,我們用了自己創立的DataFrame做了一些基礎的操作教學,今天我們就來點實際的教學,透過真實的csv檔來一步步學習該如何處理吧!!