将自定义估算器与cross_val_score结合使用失败

时间:2019-02-11 17:35:33

标签: python scikit-learn cross-validation

我正在尝试将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'
        )

在上面的代码中,总是引发Exception。 有办法解决吗?

1 个答案:

答案 0 :(得分:0)

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'
        )