将自定义估算器与 cross_val_score 一起使用失败
Using custom estimator with cross_val_score fails
我正在尝试将 cross_val_score
与自定义估算器结合使用。重要的是,这个估计器接收一个成员变量,稍后可以在 fit
函数中使用。但似乎在 cross_val_score
内部,成员变量已被销毁(或正在创建估算器的新实例)。
这是可以重现错误的最少代码:
from sklearn.model_selection import cross_val_score
from sklearn.base import BaseEstimator
class MyEstimator(BaseEstimator):
def __init__(self, member):
self._member = member
def fit(self, X, y):
if self._member is None:
raise Exception('member is None.')
X = np.array([[1, 1, 1], [2 ,2 , 2]])
y = np.array([1, 2])
score_values = cross_val_score(
MyEstimator('some value'),
X,
y,
cv=2,
scoring='r2'
)
在上面的代码中总是会引发异常。
有办法解决这个问题吗?
Sklearn 在内部克隆估算器,以创建估算器的多个副本。 Reference;使用 clone
函数。
from sklearn.base import clone
t = MyEstimator('some value')
t1 = clone(t)
t._member, t1._member
#
('some value', None)
clone 仅从对象复制构造函数参数值。
解决方案:
使您的构造函数参数和对象属性保持一致,因此以下划线开头或删除所有下划线!
class MyEstimator(BaseEstimator):
def __init__(self, member):
self.member = member
def fit(self, X, y):
if self.member is None:
raise Exception('member is None.')
def predict(self, X):
return [1]
X = np.array([[1, 1, 1], [2 ,2 , 2],[3,3,3]])
y = np.array([1, 2,3])
score_values = cross_val_score(
MyEstimator('some value'),
X,
y,
cv=3,
scoring='r2',error_score='raise'
)
我正在尝试将 cross_val_score
与自定义估算器结合使用。重要的是,这个估计器接收一个成员变量,稍后可以在 fit
函数中使用。但似乎在 cross_val_score
内部,成员变量已被销毁(或正在创建估算器的新实例)。
这是可以重现错误的最少代码:
from sklearn.model_selection import cross_val_score
from sklearn.base import BaseEstimator
class MyEstimator(BaseEstimator):
def __init__(self, member):
self._member = member
def fit(self, X, y):
if self._member is None:
raise Exception('member is None.')
X = np.array([[1, 1, 1], [2 ,2 , 2]])
y = np.array([1, 2])
score_values = cross_val_score(
MyEstimator('some value'),
X,
y,
cv=2,
scoring='r2'
)
在上面的代码中总是会引发异常。 有办法解决这个问题吗?
Sklearn 在内部克隆估算器,以创建估算器的多个副本。 Reference;使用 clone
函数。
from sklearn.base import clone
t = MyEstimator('some value')
t1 = clone(t)
t._member, t1._member
#
('some value', None)
clone 仅从对象复制构造函数参数值。
解决方案:
使您的构造函数参数和对象属性保持一致,因此以下划线开头或删除所有下划线!
class MyEstimator(BaseEstimator):
def __init__(self, member):
self.member = member
def fit(self, X, y):
if self.member is None:
raise Exception('member is None.')
def predict(self, X):
return [1]
X = np.array([[1, 1, 1], [2 ,2 , 2],[3,3,3]])
y = np.array([1, 2,3])
score_values = cross_val_score(
MyEstimator('some value'),
X,
y,
cv=3,
scoring='r2',error_score='raise'
)