forked from cnchi/HappyML
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathperformance.py
178 lines (137 loc) · 5.18 KB
/
performance.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# -*- coding: utf-8 -*-
"""
Created on Sat Jul 27 11:34:21 2019
@author: 俊男
"""
# In[] Warning setting
import warnings
warnings.filterwarnings('ignore') # "error", "ignore", "always", "default", "module" or "once"
# In[] Root of Mean Square Error (RMSE)
from sklearn.metrics import mean_squared_error
import numpy as np
def rmse(y_real, y_pred):
return np.sqrt(mean_squared_error(y_real, y_pred))
# In[] R2 (coefficient of determination)
from sklearn.metrics import r2_score
def r2(y_real, y_pred):
return r2_score(y_real, y_pred)
# In[] Classification Performance
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import fbeta_score
class ClassificationPerformance:
__y_real = None
__y_pred = None
def __init__(self, y_real, y_pred):
self.__y_real = y_real
self.__y_pred = y_pred
def confusion_matrix(self):
return confusion_matrix(self.__y_real, self.__y_pred)
def accuracy(self):
return accuracy_score(self.__y_real, self.__y_pred)
def recall(self):
return recall_score(self.__y_real, self.__y_pred, average="macro")
def precision(self):
return precision_score(self.__y_real, self.__y_pred, average="macro")
def f_score(self, beta=1):
return fbeta_score(self.__y_real, self.__y_pred, beta=beta, average="macro")
# In[] K-Fold Cross Validation of Classification Performance
from sklearn.model_selection import cross_val_score
class KFoldClassificationPerformance:
__k_fold = None
__x_ary = None
__y_ary = None
__classifier = None
__verbose = None
def __init__(self, x_ary, y_ary, classifier, k_fold=10, verbose=False):
self.__x_ary = x_ary
self.__y_ary = y_ary
self.k_fold = k_fold
self.__classifier = classifier
self.verbose = verbose
@property
def k_fold(self):
return self.__k_fold
@k_fold.setter
def k_fold(self, k_fold):
if k_fold >=2:
self.__k_fold = k_fold
else:
self.__k_fold = 2
@property
def verbose(self):
return self.__verbose
@verbose.setter
def verbose(self, verbose):
if verbose:
self.__verbose = 10
else:
self.__verbose = 0
@property
def classifier(self):
return self.__classifier
def accuracy(self):
results = cross_val_score(estimator=self.classifier, X=self.__x_ary, y=self.__y_ary.values.ravel(), scoring="accuracy", cv=self.k_fold, verbose=self.verbose)
return results.mean()
def recall(self):
def recall_scorer(estimator, X, y):
return recall_score(y, estimator.predict(X), average="macro")
results = cross_val_score(estimator=self.classifier, X=self.__x_ary, y=self.__y_ary.values.ravel(), scoring=recall_scorer, cv=self.k_fold, verbose=self.verbose)
return results.mean()
def precision(self):
def precision_scorer(estimator, X, y):
return precision_score(y, estimator.predict(X), average="macro")
results = cross_val_score(estimator=self.classifier, X=self.__x_ary, y=self.__y_ary.values.ravel(), scoring=precision_scorer, cv=self.k_fold, verbose=self.verbose)
return results.mean()
def f_score(self):
def f1_scorer(estimator, X, y):
return fbeta_score(y, estimator.predict(X), beta=1, average="macro")
results = cross_val_score(estimator=self.classifier, X=self.__x_ary, y=self.__y_ary.values.ravel(), scoring=f1_scorer, cv=self.k_fold, verbose=self.verbose)
return results.mean()
# In[] GridSearch for Searching the Best Hyper-parameters of a function
from sklearn.model_selection import GridSearchCV
class GridSearch:
__validator = None
__estimator = None
__parameters = None
__scorer = None
__k_fold = None
__best_score = None
__best_parameters = None
__best_estimator = None
__verbose = None
def __init__(self, estimator, parameters, scorer=None, k_fold=10, verbose=False):
self.__estimator = estimator
self.__parameters = parameters
self.__scorer = scorer
self.__k_fold = k_fold
self.verbose = verbose
self.__validator = GridSearchCV(estimator=self.__estimator, param_grid=self.__parameters, scoring=self.__scorer, cv=self.__k_fold, verbose=self.verbose)
@property
def verbose(self):
return self.__verbose
@verbose.setter
def verbose(self, verbose):
if verbose:
self.__verbose = 10
else:
self.__verbose = 0
@property
def validator(self):
return self.__validator
@property
def best_score(self):
return self.__best_score
@property
def best_parameters(self):
return self.__best_parameters
@property
def best_estimator(self):
return self.__best_estimator
def fit(self, x_ary, y_ary):
self.validator.fit(x_ary, y_ary.values.ravel())
self.__best_parameters = self.validator.best_params_
self.__best_score = self.validator.best_score_
self.__best_estimator = self.validator.best_estimator_