-
Notifications
You must be signed in to change notification settings - Fork 0
/
__init__.py
96 lines (78 loc) · 3.48 KB
/
__init__.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
import logging
import numpy as np
from sklearn.base import BaseEstimator, RegressorMixin
from dirichlet.calib.fulldirichlet import FullDirichletCalibrator
from dirichlet.calib.diagdirichlet import DiagonalDirichletCalibrator
from dirichlet.calib.fixeddirichlet import FixedDiagonalDirichletCalibrator
from dirichlet.calib.gendirichlet import GenerativeDirichletCalibrator
class DirichletCalibrator(BaseEstimator, RegressorMixin):
def __init__(self, matrix_type='full', l2=0.0, comp_l2=False,
initializer='identity'):
if matrix_type not in ['full', 'full_gen', 'diagonal', 'fixed_diagonal']:
raise(ValueError)
self.matrix_type = matrix_type
self.l2 = l2
if isinstance(l2, list):
self.l2_grid = l2
else:
self.l2_grid = [l2]
if isinstance(comp_l2, list):
self.comp_l2 = comp_l2
else:
self.comp_l2 = [comp_l2]
self.initializer = initializer
def fit(self, X, y, X_val=None, y_val=None, **kwargs):
if self.matrix_type == 'diagonal':
self.calibrator_ = DiagonalDirichletCalibrator(l2=self.l2,
initializer=self.initializer)
elif self.matrix_type == 'fixed_diagonal':
self.calibrator_ = FixedDiagonalDirichletCalibrator(l2=self.l2,
initializer=self.initializer)
elif self.matrix_type == 'full':
self.calibrator_ = FullDirichletCalibrator(reg_lambda_list=self.l2_grid,
reg_mu_list=self.comp_l2,
initializer=self.initializer)
elif self.matrix_type == 'full_gen':
self.calibrator_ = GenerativeDirichletCalibrator()
else:
raise(ValueError)
_X = np.copy(X)
if len(X.shape) == 1:
_X = np.vstack(((1-_X), _X)).T
_X_val = X_val
if X_val is not None:
_X_val = np.copy(X_val)
if len(X_val.shape) == 1:
_X_val = np.vstack(((1-_X_val), _X_val)).T
self.calibrator_ = self.calibrator_.fit(_X, y, X_val=_X_val,
y_val=y_val, **kwargs)
if hasattr(self.calibrator_, 'l2'):
self.l2 = self.calibrator_.l2
if hasattr(self.calibrator_, 'weights_'):
self.weights_ = self.calibrator_.weights_
if hasattr(self.calibrator_, 'coef_'):
self.coef_ = self.calibrator_.coef_
if hasattr(self.calibrator_, 'intercept_'):
self.intercept_ = self.calibrator_.intercept_
return self
@property
def cannonical_weights(self):
b = self.weights_[:, -1]
W = self.weights_[:,:-1]
col_min = np.min(W,axis=0)
A = W - col_min
softmax = lambda z:np.divide(np.exp(z), np.sum(np.exp(z)))
c = softmax(np.matmul(W, np.log(np.ones(len(b))/len(b))) + b)
return np.hstack((A, c.reshape(-1,1)))
def predict_proba(self, S):
_S = np.copy(S)
if len(S.shape) == 1:
_S = np.vstack(((1-_S), _S)).T
return self.calibrator_.predict_proba(_S)[:,1]
return self.calibrator_.predict_proba(_S)
def predict(self, S):
_S = np.copy(S)
if len(S.shape) == 1:
_S = np.vstack(((1-_S), _S)).T
return self.calibrator_.predict(_S)[:,1]
return self.calibrator_.predict(_S)