Оценщики стека/ансамбля с использованием SKlearn Pipeline и GridSearchCV

Изучая использование конвейеров и GridSearchCV, я попытался объединить регрессор случайного леса с регрессором опорных векторов. По отдельности GridSearchCV поставил оба примерно на 90%, где я сильно застрял. Но поставив SVR перед случайным лесом в пайплайне, он подскочил до 92%.

Я не смог найти ни одного примера этого, поэтому я предполагаю, что это не очень полезно, неправильно или что есть лучший способ сделать это. Был бы признателен за любое руководство.

Я создал быстрый пример, используя набор SKLearn Boston Housing с Lasso и Random forest. Объединение дало увеличение «mean_test_score» примерно с 62 % до 65 %. Соответствующий фрагмент приведен ниже, полный блокнот находится по адресу: http://nbviewer.jupyter.org/gist/Blebg/ce279345456dc706d2deddcfab49a984

class Lasso_t(Lasso): #Give Lasso a transform function

    def transform(self, x):
        return super(Lasso_t, self).predict(x).reshape(-1, 1)


#The pipe creates a Lasso regression prediction that Random Forest gets as a variable
pipe = Pipeline(steps = [
    ('std_scaler', StandardScaler()),
    ('union', FeatureUnion([('reg', Lasso_t(alpha = 0.2)),
                            ('keep_X', FunctionTransformer(lambda x : x))])),
    ('rf', RandomForestRegressor(n_estimators = 100))]) 

params = dict(
    rf__min_samples_leaf = [1,5,10],
    rf__max_features = ['log2','sqrt'])

grid_search = GridSearchCV(pipe, param_grid=params, cv = 5)
grid_search.fit(X,y)
pd.DataFrame(grid_search.cv_results_).sort_values(by = 'rank_test_score').head(3)

person Blebg    schedule 24.03.2017    source источник
comment
Итак, что вы на самом деле хотите сделать?   -  person Vivek Kumar    schedule 25.03.2017
comment
Я хочу объединить два моих регрессора в надежде улучшить показатель регрессии. Интересно, какой лучший способ сделать это, и работает ли то, как я это сделал. В итоге я добавил функции преобразования к оценщикам, что кажется немного неправильным.   -  person Blebg    schedule 25.03.2017
comment
Возможно, вы захотите изучить Stacking. Прогнозирование с помощью одного или нескольких оценщиков и использование выходных данных в качестве входных данных для окончательного оценщика. rasbt.github.io/mlxtend/user_guide/classifier/   -  person Vivek Kumar    schedule 29.03.2017
comment
Благодарю вас! Кажется, это лучший способ сделать это.   -  person Blebg    schedule 29.03.2017


Ответы (1)


Вы можете искать sklearn.ensemble.VotingRegressor, который может сочетать две регрессии модели, взяв их среднее значение.

Вот пример для начала:

from sklearn.datasets        import make_regression
from sklearn.ensemble        import RandomForestRegressor, VotingRegressor
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline        import Pipeline
from sklearn.preprocessing   import StandardScaler
from sklearn.svm             import SVR

# Make fake data     
X, y = make_regression(n_samples=1_000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=42)

pipe = Pipeline([('scl', StandardScaler()),
                 ('vr', VotingRegressor([('svr', SVR()), ('rfr', RandomForestRegressor())]))
                ])

search_space = [{'vr__rfr__min_samples_leaf': [1, 5, 10]}]

gs_cv = GridSearchCV(estimator=pipe,
                     param_grid=search_space,
                     n_jobs=-1)

gs_cv.fit(X_train, y_train)
gs_cv.predict(X_test)
person Brian Spiering    schedule 24.02.2021