Как объединить оценки регрессии с FeatureUnion в Scikit-learn? - PullRequest
0 голосов
/ 02 марта 2020

В основном я следовал этому руководству, чтобы построить «объединение средств восстановления»: https://stats.stackexchange.com/questions/139042/ensemble-of-different-kinds-of-regressors-using-scikit-learn-or-any-other-pytho

Я хочу построить оценщик, который отдельно обучает регрессионную модель кернального гребня и линейный гребень модель регрессии на обучающем множестве, и для каждого входного вектора она предсказывает два результата из модели регрессии кернального гребня и модели линейной регрессии гребня и линейно объединяет эти два результата в качестве конечного результата

Итак, во-первых, я построил два трансформаторы:

from sklearn.base import TransformerMixin
from sklearn.pipeline import Pipeline, FeatureUnion
import sklearn.linear_model as lr
import sklearn.kernel_ridge as kr

class LRRt(lr.Ridge,TransformerMixin):
    def transform(self, X, *_):
        return self.predict(X)

class KRRt(kr.KernelRidge,TransformerMixin):
    def transform(self, X, *_):
        return self.predict(X)

А затем объедините их вместе и сформируйте новую модель:

def builder():

    model_set = FeatureUnion(
        [
            ('lrr', LRRt()),
            ('krr', KRRt())
        ],
    )

    model = Pipeline(steps=[
        ('model_set', model_set),
        ('linear_layer', lr.LinearRegression())
    ])

    return model

model = builder()
model.fit(x_train,y_train)

Но когда я пытался соответствовать модели, я получил сообщение об ошибке, сказав, что модель LinearRegression ( который является последним слоем в конвейере) ожидаемый двумерный массив, вместо него получен одномерный массив. Поэтому я проверил вывод "model_set":

model_set = FeatureUnion(
        [
            ('lrr', LRRt()),
            ('krr', KRRt())
        ],
    )

model_set.fit(x_train,y_train)
model_set.transform(x_test).shape

Количество строк моих тестовых данных составляет 5509, что означает, что форма вывода model_set должна быть (5509,2), но реальная форма это вывод (11018,). По всей видимости, FeatureUnion объединяет результаты двух моделей в одномерный массив, из-за чего слой LinearRegression не может работать.

Но вопрос в том, как мы могли сделать шаг «изменения формы» в конвейере до шага линейной регрессии? Все вещи в конвейере должны быть Transformer, и нет никакого трансформатора, способного сделать что-то вроде np.reshape

...