-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmetrics.py
115 lines (94 loc) · 3.29 KB
/
metrics.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import numpy as np
from math import sqrt
def mean_squared_error(y,y_pred):
'''
Возвращает среднеквадратичную ошибку между величинами
как в sklearn ЭТО НЕ RMSE
'''
m = y_pred.shape[0]
return (1/m)*np.sum((y-y_pred)**2)
def mean_absolute_error(y,y_pred):
'''
Возвращает абсолютную ошибку.
ЗДЕСЬ ТОЖЕ НЕТ КОРНЯ!(ВСЕ ПРАВИЛЬНО)
'''
m = y_pred.shape[0]
# mean = 1/m
# 1/m*np.sum можно заменить np.average, тоже самое!
return (1/m)*np.sum(np.abs(y - y_pred))
def median_absolute_error(y,y_pred):
''' Median!!! '''
# median = среднее число
return np.median(np.abs(y - y_pred))
def mean_squared_log_error(y,y_pred):
''' БЕЗ КОРНЯ, как и в sklearn
'''
# log1p = log(1+x)
# в формуле стоит такой логарифм!
y = np.log1p(y)
y_pred = np.log1p(y_pred)
# Так же реализовано и в sklearn
return mean_squared_error(y,y_pred)
def accuracy_score(y,y_pred):
''' metrics.accuracy_score '''
# Счетчик совпадений
right = 0
# Считаем сколько предсказаний оказалось правильными
for first,second in zip(y,y_pred):
if int(first) == int(second):
right += 1
# Возвращаем процент правильных предсказаний
return right/int(y_pred.shape[0])
def precision_score(y,y_pred):
''' Точность = tp/tp+fp,
где tp - true positive, fp - false positive
Например, целевое значение 0, определенное классификатором как 1 -
- false positive, а целевое значение 1,
определенное как 1 - true positive.
'''
true_positive = 0
false_positive = 0
for real,predicted in zip(y,y_pred):
if int(real) == 1 and int(predicted) == 1:
true_positive += 1
if int(real) == 0 and int(predicted) == 1:
false_positive += 1
# Считаем полноту
return true_positive/(true_positive + false_positive)
def recall_score(y,y_pred):
''' Полнота = tp/(tp+fn), где fn - false negative
'''
true_positive = 0
false_negative = 0
for real,predicted in zip(y,y_pred):
if int(real) == 1 and int(predicted) == 1:
true_positive += 1
if int(real) == 1 and int(predicted) == 0:
false_negative += 1
# Считаем полноту
return true_positive/(true_positive + false_negative)
def f1_score(y,y_pred):
''' F1-мера '''
precision = precision_score(y,y_pred)
recall = recall_score(y,y_pred)
# Считаем F1-меру просто по формуле
return 2 * (precision * recall)/(precision + recall)
def confusion_matrix(y,y_pred):
''' Confusion matrix - works only for binary classification for now! '''
tp = 0
fp = 0
tn = 0
fn = 0
for real,predicted in zip(y,y_pred):
if int(real) == 1 and int(predicted) == 1:
tp += 1
if int(real) == 0 and int(predicted) == 1:
fp += 1
if int(real) == 1 and int(predicted) == 0:
fn += 1
if int(real) == 0 and int(predicted) == 0:
tn += 1
# Forming CM for binary classification!
confusion_matrix = np.array([[tn,fp],[fn,tp]])
# returning
return confusion_matrix