Как создать линейную модель Scikit-Learn с известными коэффициентами без ее подгонки - PullRequest
2 голосов
/ 29 апреля 2020

Фон

Я тестирую различные сохраненные модели в рамках эксперимента, но одна из моделей основана на написанном мной алгоритме, а не на подгонке модели sklearn.

Однако моя пользовательская модель по-прежнему является линейной, поэтому я хочу создать экземпляр LinearModel и установить атрибуты coef_ и intercept_ для значений из моего алгоритма пользовательского подбора, чтобы я мог использовать его для прогнозов .

То, что я пробовал до сих пор:

from sklearn.linear_model import LinearRegression

my_intercepts = np.ones(2)
my_coefficients = np.random.randn(2, 3)

new_model = LinearRegression()
new_model.intercept_ = my_intercepts
new_model.coef_ = my_coefficients

Кажется, что все работает нормально для предсказания:

X_test = np.random.randn(5, 3)

new_model.predict(X_test)

Он проходит этот тест:

from sklearn.utils.validation import check_is_fitted

check_is_fitted(new_model)

Вопрос

Этот метод подходит? Это похоже на взлом, и я подозреваю, что есть «правильный» способ сделать это.

1 Ответ

0 голосов
/ 30 апреля 2020

Хотя простая техника в вопросе работает, опасность состоит в том, что вы можете позже вызвать метод подгонки объекта и переписать ваши коэффициенты.

Несколько более «правильный» способ сделать это, если модель будет использоваться только для прогнозирования, будет наследоваться от класса sklearn и перегружать метод fit следующим образом:

class LinearPredictionModel(LinearRegression):
    """
    This model is for prediction only.  It has no fit method.
    You can initialize it with fixed values for coefficients 
    and intercepts.  

    Parameters
    ----------
    coef, intercept : arrays
        See attribute descriptions below.

    Attributes
    ----------
    coef_ : array of shape (n_features, ) or (n_targets, n_features)
        Coefficients of the linear model.  If there are multiple targets
        (y 2D), this is a 2D array of shape (n_targets, n_features), 
        whereas if there is only one target, this is a 1D array of 
        length n_features.
    intercept_ : float or array of shape of (n_targets,)
        Independent term in the linear model.
    """

    def __init__(self, coef=None, intercept=None):
        if coef is not None:
            coef = np.array(coef)
            if intercept is None:
                intercept = np.zeros(coef.shape[0])
            else:
                intercept = np.array(intercept)
            assert coef.shape[0] == intercept.shape[0]
        else:
            if intercept is not None:
                raise ValueError("Provide coef only or both coef and intercept")
        self.intercept_ = intercept
        self.coef_ = coef

    def fit(self, X, y):
        """This model does not have a fit method."""
        raise NotImplementedError("model is only for prediction")

Затем создайте экземпляр модели следующим образом:

new_model = LinearPredictionModel(coef=my_coefficients, intercept=my_intercepts)

Я думаю, что единственный «правильный» способ сделать это - полностью реализовать новый класс с моим пользовательским алгоритмом в методе fit. Но для простых нужд тестирования коэффициентов в среде scikit-learn этот метод работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...