feat(results): accuracy, recall and precision functions used to calculate measures
fix: read data from another repository
This commit is contained in:
parent
eeabe4696c
commit
b5b4629318
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "examples/doc-classifier-data"]
|
||||||
|
path = examples/doc-classifier-data
|
||||||
|
url = git@github.com:mdibaiee/doc-classifier-data
|
@ -26,6 +26,8 @@ module Main where
|
|||||||
network = session inputs rnetwork labels learning_rate (iterations, epochs)
|
network = session inputs rnetwork labels learning_rate (iterations, epochs)
|
||||||
|
|
||||||
-- run inputs through the trained network
|
-- run inputs through the trained network
|
||||||
|
-- note: here we are using the examples in the training dataset to test the network,
|
||||||
|
-- this is here just to demonstrate the way the library works, you should not do this
|
||||||
results = map (`forward` network) inputs
|
results = map (`forward` network) inputs
|
||||||
|
|
||||||
-- compute the new cost
|
-- compute the new cost
|
||||||
|
1
examples/doc-classifier-data
Submodule
1
examples/doc-classifier-data
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 5b069a54a6a68efee0ef4bb15c1aa56414f12c28
|
@ -6,24 +6,24 @@ module Main
|
|||||||
import Data.List
|
import Data.List
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Debug.Trace
|
import Debug.Trace
|
||||||
|
import Data.List.Split
|
||||||
|
|
||||||
main = do
|
main = do
|
||||||
dataset <- readFile "examples/naivebayes-doc-classifier/data-reuters"
|
dataset <- readFile "examples/doc-classifier-data/data-reuters"
|
||||||
test <- readFile "examples/naivebayes-doc-classifier/data-reuters-test"
|
test <- readFile "examples/doc-classifier-data/data-reuters-test"
|
||||||
|
|
||||||
classes <- map (filter (/= ' ')) . lines <$> readFile "examples/naivebayes-doc-classifier/data-classes"
|
classes <- map (filter (/= ' ')) . lines <$> readFile "examples/doc-classifier-data/data-classes"
|
||||||
|
|
||||||
let intClasses = [0..length classes - 1]
|
let intClasses = [0..length classes - 1]
|
||||||
documents = createDocuments classes dataset
|
documents = createDocuments classes dataset
|
||||||
testDocuments = createDocuments classes test
|
testDocuments = createDocuments classes test
|
||||||
nb = initialize documents
|
nb = initialize documents
|
||||||
|
|
||||||
let testResults (Document text c) =
|
results = map (\(Document text c) -> (c, determine text nb intClasses documents)) testDocuments
|
||||||
let r = determine text nb intClasses documents
|
|
||||||
in trace (classes !! c ++ " ~ " ++ classes !! r) c == r
|
|
||||||
|
|
||||||
let results = map testResults testDocuments
|
let showResults (c, r) = putStrLn (classes !! c ++ " ~ " ++ classes !! r)
|
||||||
|
mapM_ showResults results
|
||||||
|
|
||||||
putStr "Accuracy: "
|
putStrLn $ "Recall: " ++ show (recall results) ++ "%"
|
||||||
putStr . show . round $ (genericLength (filter (==True) results) / genericLength results) * 100
|
putStrLn $ "Precision: " ++ show (precision results) ++ "%"
|
||||||
putStrLn "%"
|
putStrLn $ "Accuracy: " ++ show (accuracy results) ++ "%"
|
||||||
|
@ -50,6 +50,7 @@ executable example-naivebayes-doc-classifier
|
|||||||
, sibe
|
, sibe
|
||||||
, hmatrix
|
, hmatrix
|
||||||
, containers
|
, containers
|
||||||
|
, split
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
||||||
test-suite sibe-test
|
test-suite sibe-test
|
||||||
|
@ -4,7 +4,11 @@ module Sibe.NaiveBayes
|
|||||||
createDocuments,
|
createDocuments,
|
||||||
initialize,
|
initialize,
|
||||||
calculate,
|
calculate,
|
||||||
determine
|
determine,
|
||||||
|
ordNub,
|
||||||
|
accuracy,
|
||||||
|
precision,
|
||||||
|
recall,
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
import Data.List
|
import Data.List
|
||||||
@ -63,3 +67,30 @@ module Sibe.NaiveBayes
|
|||||||
go _ [] = []
|
go _ [] = []
|
||||||
go s (x:xs) = if x `Set.member` s then go s xs
|
go s (x:xs) = if x `Set.member` s then go s xs
|
||||||
else x : go (Set.insert x s) xs
|
else x : go (Set.insert x s) xs
|
||||||
|
|
||||||
|
accuracy :: [(Int, Int)] -> Int
|
||||||
|
accuracy results =
|
||||||
|
let correct = filter (uncurry (==)) results
|
||||||
|
in round $ genericLength correct / genericLength results * 100
|
||||||
|
|
||||||
|
recall :: [(Int, Int)] -> Int
|
||||||
|
recall results =
|
||||||
|
let classes = ordNub (map fst results)
|
||||||
|
s = sum (map rec classes) / genericLength results
|
||||||
|
in round $ s * 100
|
||||||
|
where
|
||||||
|
rec a =
|
||||||
|
let t = genericLength $ filter (\(c, r) -> c == r && c == a) results
|
||||||
|
y = genericLength $ filter (\(c, r) -> c == a) results
|
||||||
|
in t / y
|
||||||
|
|
||||||
|
precision :: [(Int, Int)] -> Int
|
||||||
|
precision results =
|
||||||
|
let classes = ordNub (map fst results)
|
||||||
|
s = sum (map prec classes) / genericLength results
|
||||||
|
in round $ s * 100
|
||||||
|
where
|
||||||
|
prec a =
|
||||||
|
let t = genericLength $ filter (\(c, r) -> c == r && c == a) results
|
||||||
|
y = genericLength $ filter (\(c, r) -> r == a) results
|
||||||
|
in t / y
|
||||||
|
Loading…
Reference in New Issue
Block a user