具有缩放、降维、多个回归模型的平均预测和网格搜索交叉验证的 Scikit-learn 管道

数据挖掘 scikit-学习 预言 降维 特征缩放 管道
2021-09-25 18:57:56

我想使用 sklearn 管道执行此操作:

( - ) 缩放数据 (StandardScaler)

( - ) 降维 (PCA)

( - ) 使用 GradientBoostingRegressor() 和 GridSearchCV() 进行预测(从网格中获取具有最佳参数的模型)

( - ) 使用 RandomForestRegressor() 和 GridSearchCV() 进行预测(从网格中获取具有最佳参数的模型)

( - ) 取两个预测的平均值

但我不知道如何进行。

我必须(缩放和预测)2 次还是可以缩放然后预测 2 次?

谢谢。

2个回答

您可能会寻找sklearn.ensemble.VotingRegressor两个回归模型的平均值。

这是一个帮助您入门的示例:

from sklearn.datasets        import make_regression
from sklearn.decomposition   import PCA
from sklearn.ensemble        import GradientBoostingRegressor, RandomForestRegressor, VotingRegressor
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline        import Pipeline
from sklearn.preprocessing   import StandardScaler

# 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()),
                 ('pca', PCA()),
                 ('vr', VotingRegressor([('gbr', GradientBoostingRegressor()), ('rfr', RandomForestRegressor())]))
                ])

search_space = [{'vr__gbr__learning_rate':    [.07, .1, .15]}]

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

gs_cv.fit(X_train, y_train)
gs_cv.predict(X_test)

问题似乎是 sklearn 管道本质上是严格线性的,因此您无法在管道中拟合这两个模型。您可以尝试将 GBM 和 RF 集成到一个新的模型对象中使用;为此,请使用FeatureUnion
https
://stats.stackexchange.com/questions/139042/ensemble-of-different-kinds-of-regressors-using-scikit-learn-or-any-other-pytho https://stackoverflow。 com/questions/43010914/stack-ensemble-estimators-using-sklearn-pipeline-and-gridsearchcv
我没有立即看到如何取分数的简单平均值而不是拟合线性模型,但它不应该努力;也许作为自定义转换?然后,与您所描述的还有一个细微的区别:超参数的交叉验证将针对集成进行,因此将寻求集成的最佳结果,而不是两个单独的模型。