From 4a7c85fbf527f59bb4799e000550ea231600ec24 Mon Sep 17 00:00:00 2001 From: rheber Date: Fri, 14 Oct 2016 23:13:28 +1100 Subject: [PATCH] F1 score for Haskell --- Haskell/Metrics.hs | 16 +++++++++++++++- Haskell/testMetrics.hs | 6 ++++++ README.md | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Haskell/Metrics.hs b/Haskell/Metrics.hs index 6371b0c..8a532e9 100644 --- a/Haskell/Metrics.hs +++ b/Haskell/Metrics.hs @@ -15,9 +15,10 @@ module Metrics , mapk , auc, fstEqual, auc1, sumRank, sumEl , ce + , f1 ) where -import Data.List (groupBy, sort) +import Data.List ((\\), groupBy, intersect, nub, sort) import Math.Statistics (mean) ae :: Num a => a -> a -> a @@ -88,6 +89,19 @@ ce :: Eq a => [a] -> [a] -> Double ce actual predicted = ((sum [1.0 | (a,p) <- (zip actual predicted), a/=p]) / (fromIntegral (length actual))) +f1 :: Eq a => [a] -> [a] -> Double +f1 actual predicted = + if precision == 0 && recall == 0 + then 0 + else 2 * precision * recall / (precision + recall) + where act = nub actual + pred = nub predicted + tp = fromIntegral $ length $ intersect act pred + fp = fromIntegral $ length $ pred \\ act + fn = fromIntegral $ length $ act \\ pred + precision = if tp == 0 && fp == 0 then 0 else tp / (tp + fp) + recall = if tp == 0 && fn == 0 then 0 else tp / (tp + fn) + levenshtein :: Eq a => [a] -> [a] -> Int levenshtein s t = d !! (length s) !! (length t) diff --git a/Haskell/testMetrics.hs b/Haskell/testMetrics.hs index 486c48f..41b07f8 100644 --- a/Haskell/testMetrics.hs +++ b/Haskell/testMetrics.hs @@ -42,6 +42,11 @@ ceTests = TestList [ testEqual "ce1" 0.0 (ce [1,1,1,0,0,0] [1,1,1,0,0,0]) , testEqual "ce5" 1 (ce ["cat","dog","bird"] ["caat","doog","biird"]) ] +f1Tests = TestList [ testEqual "f1-1" 0.8 (f1 [3,4,5] [3,4]) + , testEqual "f1-2" 0.0 (f1 [7,1] [0]) + , testEqual "f1-3" 0.0 (f1 [7] [1,1]) + ] + levenshteinTests = TestList [ testEqual "levenshtein1" 5 (levenshtein "intention" "execution") , testEqual "levenshtein2" 3 (levenshtein "sitting" "kitten") , testEqual "levenshtein3" 3 (levenshtein "Saturday" "Sunday") @@ -120,6 +125,7 @@ allTests = TestList [ aeTests , apkTests , aucTests , ceTests + , f1Tests , levenshteinTests , llTests , logLossTests diff --git a/README.md b/README.md index 6a382c5..c3aa981 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ EVALUATION METRICS Average Precision at K (APK, AP@K)✓✓✓✓ Area Under the ROC (AUC)✓✓✓✓ Classification Error (CE)✓✓✓✓ -F1 Score (F1) ✓ +F1 Score (F1) ✓✓ Gini ✓ Levenshtein✓ ✓✓ Log Loss (LL)✓✓✓✓