Использование пользовательского оценщика с cross_val_score завершается неудачно - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь использовать 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'
        )

В приведенном выше коде исключение всегда возникает.Есть ли способ решить это?

1 Ответ

0 голосов
/ 12 февраля 2019

Склеарн внутренне клонирует оценщик, чтобы создать несколько копий оценщика. Ссылка ;используя функцию clone.

from sklearn.base import clone
t = MyEstimator('some value')
t1 = clone(t)
t._member, t1._member
#
('some value', None)

клон копирует значения параметров конструктора только из объектов.

Решение:

Создайте свой параметр конструктора иАтрибуты объекта согласуются, поэтому начинайте с подчеркивания или удаляйте подчеркивание везде!

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