def _fit_multiclass(self, X, y, verbose=False):
"""Fit the calibrated model in multiclass setting
Parameters
----------
X : array-like, shape (n_samples, n_features)
Training data.
y : array-like, shape (n_samples,)
Target values.
Returns
-------
self : object
Returns an instance of self.
"""
class_list = np.unique(y)
num_classes = len(class_list)
y_mod = np.zeros(len(y))
for i in range(num_classes):
y_mod[y==class_list[i]]=i
y_mod = y_mod.astype(int)
if ((type(self.cv)==str) and (self.cv=='prefit')):
self.uncalibrated_classifier = self.base_estimator
y_pred = self.uncalibrated_classifier.predict_proba(X)
else:
y_pred = np.zeros((len(y_mod),num_classes))
if sklearn.__version__ < '0.18':
skf = StratifiedKFold(y_mod, n_folds=self.cv,shuffle=True)
else:
skf = StratifiedKFold(n_splits=self.cv, shuffle=True).split(X, y)
for idx, (train_idx, test_idx) in enumerate(skf):
if verbose:
print("training fold {} of {}".format(idx+1, self.cv))
X_train = np.array(X)[train_idx,:]
X_test = np.array(X)[test_idx,:]
y_train = np.array(y_mod)[train_idx]
# We could also copy the model first and then fit it
this_estimator = clone(self.base_estimator)
this_estimator.fit(X_train,y_train)
y_pred[test_idx,:] = this_estimator.predict_proba(X_test)
if verbose:
print("Training Full Model")
self.uncalibrated_classifier = clone(self.base_estimator)
self.uncalibrated_classifier.fit(X, y_mod)
# calibrating function
if verbose:
print("Determining Calibration Function")
if self.method=='logistic':
self.calib_func, self.cf_list = prob_calibration_function_multiclass(y_mod, self.pre_transform(y_pred), verbose=verbose, **self.calib_kwargs)
if self.method=='ridge':
self.calib_func, self.cf_list = prob_calibration_function_multiclass(y_mod, self.pre_transform(y_pred), verbose=verbose, method='ridge', **self.calib_kwargs)
# training full model
return self
评论列表
文章目录