子类化 sklearn LinearSVC 以用作 sklearn GridSearchCV 的估计器
Subclassing sklearn LinearSVC for use as estimator with sklearn GridSearchCV
我正在尝试从 sklearn.svm.LinearSVC
创建一个子 class 用作 sklearn.model_selection.GridSearchCV
的估算器。 child class 有一个额外的函数,在这个例子中它不做任何事情。但是,当我 运行 时,我最终遇到了一个我似乎无法调试的错误。如果您 copy-paste 代码和 运行,它应该重现以 ValueError: Input contains NaN, infinity or a value too large for dtype('float64')
结尾的完整错误
一旦我得到他的工作,我希望为方法添加更多功能 transform_this()
。
谁能告诉我哪里出错了?基于 this I first thought it was due to some issues with my data. However, since I've reproduced it using the sklearn built-in dataset it seems not to be the case. Also, I believe I'm subclassing this properly based on the response I got for my previous question . Also, I learnt that the GridSearchCV doesn't seem to initialise the estimator in a different way (somehow it first uses default arguments as I see from )
from sklearn.datasets import load_breast_cancer
from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV
RANDOM_STATE = 123
class LinearSVCSub(LinearSVC):
def __init__(self, penalty='l2', loss='squared_hinge', additional_parameter1=1, additional_parameter2=100,
dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1,
class_weight=None, verbose=0, random_state=None, max_iter=1000):
super(LinearSVCSub, self).__init__(penalty=penalty, loss=loss, dual=dual, tol=tol,
C=C, multi_class=multi_class, fit_intercept=fit_intercept,
intercept_scaling=intercept_scaling, class_weight=class_weight,
verbose=verbose, random_state=random_state, max_iter=max_iter)
self.additional_parameter1 = additional_parameter1
self.additional_parameter2 = additional_parameter2
def fit(self, X, y, sample_weight=None):
X = self.transform_this(X)
super(LinearSVCSub, self).fit(X, y, sample_weight)
def predict(self, X):
X = self.transform_this(X)
super(LinearSVCSub, self).predict(X)
def score(self, X, y, sample_weight=None):
X = self.transform_this(X)
super(LinearSVCSub, self).score(X, y, sample_weight)
def decision_function(self, X):
X = self.transform_this(X)
super(LinearSVCSub, self).decision_function(X)
def transform_this(self, X):
return X
if __name__ == '__main__':
data = load_breast_cancer()
X, y = data.data, data.target
# Parameter tuning with custom LinearSVC
param_grid = {'C': [0.00001, 0.0001, 0.0005],
'dual': (True, False), 'random_state': [RANDOM_STATE],
'additional_parameter1': [0.90, 0.80, 0.60, 0.30],
'additional_parameter2': [20, 30]}
gs_model = GridSearchCV(estimator=LinearSVCSub(), verbose=1, param_grid=param_grid,
scoring='roc_auc', n_jobs=-1)
gs_model.fit(X, y)
你有几个问题:
- 定义的方法没有return语句
- 您选择的数据集与
LinearSVC
不一致
一旦您纠正了那些就可以了:
from sklearn.datasets import make_classification
from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV
RANDOM_STATE = 123
class LinearSVCSub(LinearSVC):
def __init__(self, penalty='l2', loss='squared_hinge', additional_parameter1=1, additional_parameter2=100,
dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1,
class_weight=None, verbose=0, random_state=None, max_iter=100000):
super(LinearSVCSub, self).__init__(penalty=penalty, loss=loss, dual=dual, tol=tol,
C=C, multi_class=multi_class, fit_intercept=fit_intercept,
intercept_scaling=intercept_scaling, class_weight=class_weight,
verbose=verbose, random_state=random_state, max_iter=max_iter)
self.additional_parameter1 = additional_parameter1
self.additional_parameter2 = additional_parameter2
def fit(self, X, y, sample_weight=None):
X = self.transform_this(X)
super(LinearSVCSub, self).fit(X, y, sample_weight)
return self
def predict(self, X):
X = self.transform_this(X)
return super(LinearSVCSub, self).predict(X)
def score(self, X, y, sample_weight=None):
X = self.transform_this(X)
return super(LinearSVCSub, self).score(X, y, sample_weight)
def decision_function(self, X):
X = self.transform_this(X)
return super(LinearSVCSub, self).decision_function(X)
def transform_this(self, X):
return X
X, y = make_classification()
# Parameter tuning with custom LinearSVC
param_grid = {'C': [0.00001, 0.0001, 0.0005],
'dual': (True, False), 'random_state': [RANDOM_STATE],
'additional_parameter1': [0.90, 0.80, 0.60, 0.30],
'additional_parameter2': [20, 30]
}
gs_model = GridSearchCV(estimator=LinearSVCSub(), verbose=1, param_grid=param_grid,
scoring='roc_auc', n_jobs=1)
gs_model.fit(X, y)
Fitting 5 folds for each of 48 candidates, totalling 240 fits
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 240 out of 240 | elapsed: 0.9s finished
GridSearchCV(estimator=LinearSVCSub(), n_jobs=1,
param_grid={'C': [1e-05, 0.0001, 0.0005],
'additional_parameter1': [0.9, 0.8, 0.6, 0.3],
'additional_parameter2': [20, 30],
'dual': (True, False), 'random_state': [123]},
scoring='roc_auc', verbose=1)
gs_model.predict(X)
array([0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1,
1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0,
0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1])
我正在尝试从 sklearn.svm.LinearSVC
创建一个子 class 用作 sklearn.model_selection.GridSearchCV
的估算器。 child class 有一个额外的函数,在这个例子中它不做任何事情。但是,当我 运行 时,我最终遇到了一个我似乎无法调试的错误。如果您 copy-paste 代码和 运行,它应该重现以 ValueError: Input contains NaN, infinity or a value too large for dtype('float64')
一旦我得到他的工作,我希望为方法添加更多功能 transform_this()
。
谁能告诉我哪里出错了?基于 this I first thought it was due to some issues with my data. However, since I've reproduced it using the sklearn built-in dataset it seems not to be the case. Also, I believe I'm subclassing this properly based on the response I got for my previous question
from sklearn.datasets import load_breast_cancer
from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV
RANDOM_STATE = 123
class LinearSVCSub(LinearSVC):
def __init__(self, penalty='l2', loss='squared_hinge', additional_parameter1=1, additional_parameter2=100,
dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1,
class_weight=None, verbose=0, random_state=None, max_iter=1000):
super(LinearSVCSub, self).__init__(penalty=penalty, loss=loss, dual=dual, tol=tol,
C=C, multi_class=multi_class, fit_intercept=fit_intercept,
intercept_scaling=intercept_scaling, class_weight=class_weight,
verbose=verbose, random_state=random_state, max_iter=max_iter)
self.additional_parameter1 = additional_parameter1
self.additional_parameter2 = additional_parameter2
def fit(self, X, y, sample_weight=None):
X = self.transform_this(X)
super(LinearSVCSub, self).fit(X, y, sample_weight)
def predict(self, X):
X = self.transform_this(X)
super(LinearSVCSub, self).predict(X)
def score(self, X, y, sample_weight=None):
X = self.transform_this(X)
super(LinearSVCSub, self).score(X, y, sample_weight)
def decision_function(self, X):
X = self.transform_this(X)
super(LinearSVCSub, self).decision_function(X)
def transform_this(self, X):
return X
if __name__ == '__main__':
data = load_breast_cancer()
X, y = data.data, data.target
# Parameter tuning with custom LinearSVC
param_grid = {'C': [0.00001, 0.0001, 0.0005],
'dual': (True, False), 'random_state': [RANDOM_STATE],
'additional_parameter1': [0.90, 0.80, 0.60, 0.30],
'additional_parameter2': [20, 30]}
gs_model = GridSearchCV(estimator=LinearSVCSub(), verbose=1, param_grid=param_grid,
scoring='roc_auc', n_jobs=-1)
gs_model.fit(X, y)
你有几个问题:
- 定义的方法没有return语句
- 您选择的数据集与
LinearSVC
不一致
一旦您纠正了那些就可以了:
from sklearn.datasets import make_classification
from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV
RANDOM_STATE = 123
class LinearSVCSub(LinearSVC):
def __init__(self, penalty='l2', loss='squared_hinge', additional_parameter1=1, additional_parameter2=100,
dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1,
class_weight=None, verbose=0, random_state=None, max_iter=100000):
super(LinearSVCSub, self).__init__(penalty=penalty, loss=loss, dual=dual, tol=tol,
C=C, multi_class=multi_class, fit_intercept=fit_intercept,
intercept_scaling=intercept_scaling, class_weight=class_weight,
verbose=verbose, random_state=random_state, max_iter=max_iter)
self.additional_parameter1 = additional_parameter1
self.additional_parameter2 = additional_parameter2
def fit(self, X, y, sample_weight=None):
X = self.transform_this(X)
super(LinearSVCSub, self).fit(X, y, sample_weight)
return self
def predict(self, X):
X = self.transform_this(X)
return super(LinearSVCSub, self).predict(X)
def score(self, X, y, sample_weight=None):
X = self.transform_this(X)
return super(LinearSVCSub, self).score(X, y, sample_weight)
def decision_function(self, X):
X = self.transform_this(X)
return super(LinearSVCSub, self).decision_function(X)
def transform_this(self, X):
return X
X, y = make_classification()
# Parameter tuning with custom LinearSVC
param_grid = {'C': [0.00001, 0.0001, 0.0005],
'dual': (True, False), 'random_state': [RANDOM_STATE],
'additional_parameter1': [0.90, 0.80, 0.60, 0.30],
'additional_parameter2': [20, 30]
}
gs_model = GridSearchCV(estimator=LinearSVCSub(), verbose=1, param_grid=param_grid,
scoring='roc_auc', n_jobs=1)
gs_model.fit(X, y)
Fitting 5 folds for each of 48 candidates, totalling 240 fits
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 240 out of 240 | elapsed: 0.9s finished
GridSearchCV(estimator=LinearSVCSub(), n_jobs=1,
param_grid={'C': [1e-05, 0.0001, 0.0005],
'additional_parameter1': [0.9, 0.8, 0.6, 0.3],
'additional_parameter2': [20, 30],
'dual': (True, False), 'random_state': [123]},
scoring='roc_auc', verbose=1)
gs_model.predict(X)
array([0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1,
1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0,
0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1])