sklearn管道中具有GridSearchCV,缩放,PCA和早期停止功能的XGBoost

双赢:

我想将XGBoost模型与输入缩放和PCA减少的功能空间结合起来。此外,应使用交叉验证来调整模型的超参数以及PCA中使用的组件数量。为防止模型过拟合,应添加早期停止功能。

为了结合各个步骤,我决定使用sklearn的Pipeline功能。

刚开始,我在确保PCA也应用于验证集方面遇到一些问题。但是我认为使用XGB__eval_set可以达成协议。

该代码实际上在运行时没有任何错误,但是似乎可以永远运行(在某些时候,所有内核的CPU使用率均降至零,但进程继续运行数小时;在某些时候不得不终止会话)。

from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from xgboost import XGBRegressor   

# Train / Test split
X_train, X_test, y_train, y_test = train_test_split(X_with_features, y, test_size=0.2, random_state=123)

# Train / Validation split
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=123)

# Pipeline
pipe = Pipeline(steps=[("Scale", StandardScaler()),
                       ("PCA", PCA()),
                       ("XGB", XGBRegressor())])

# Hyper-parameter grid (Test only)
grid_param_pipe = {'PCA__n_components': [5],
                   'XGB__n_estimators': [1000],
                   'XGB__max_depth': [3],
                   'XGB__reg_alpha': [0.1],
                   'XGB__reg_lambda': [0.1]}

# Grid object
grid_search_pipe = GridSearchCV(estimator=pipe,
                                param_grid=grid_param_pipe,
                                scoring="neg_mean_squared_error",
                                cv=5,
                                n_jobs=5,
                                verbose=3)

# Run CV
grid_search_pipe.fit(X_train, y_train, XGB__early_stopping_rounds=10, XGB__eval_metric="rmse", XGB__eval_set=[[X_val, y_val]])
森田哥:

问题在于该fit方法需要在外部创建一个评估集,但是我们无法在管道进行转换之前创建一个评估集。

这有点棘手,但是我们的想法是为xgboost回归器/分类器创建一个薄包装器,为内部的评估集做准备。

from sklearn.base import BaseEstimator
from sklearn.model_selection import train_test_split
from xgboost import XGBRegressor, XGBClassifier

class XGBoostWithEarlyStop(BaseEstimator):
    def __init__(self, early_stopping_rounds=5, test_size=0.1, 
                 eval_metric='mae', **estimator_params):
        self.early_stopping_rounds = early_stopping_rounds
        self.test_size = test_size
        self.eval_metric=eval_metric='mae'        
        if self.estimator is not None:
            self.set_params(**estimator_params)

    def set_params(self, **params):
        return self.estimator.set_params(**params)

    def get_params(self, **params):
        return self.estimator.get_params()

    def fit(self, X, y):
        x_train, x_val, y_train, y_val = train_test_split(X, y, test_size=self.test_size)
        self.estimator.fit(x_train, y_train, 
                           early_stopping_rounds=self.early_stopping_rounds, 
                           eval_metric=self.eval_metric, eval_set=[(x_val, y_val)])
        return self

    def predict(self, X):
        return self.estimator.predict(X)

class XGBoostRegressorWithEarlyStop(XGBoostWithEarlyStop):
    def __init__(self, *args, **kwargs):
        self.estimator = XGBRegressor()
        super(XGBoostRegressorWithEarlyStop, self).__init__(*args, **kwargs)

class XGBoostClassifierWithEarlyStop(XGBoostWithEarlyStop):
    def __init__(self, *args, **kwargs):
        self.estimator = XGBClassifier()
        super(XGBoostClassifierWithEarlyStop, self).__init__(*args, **kwargs)

下面是一个测试。

from sklearn.datasets import load_diabetes
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV

x, y = load_diabetes(return_X_y=True)
print(x.shape, y.shape)
# (442, 10) (442,)

pipe = Pipeline([
    ('pca', PCA(5)),
    ('xgb', XGBoostRegressorWithEarlyStop())
])

param_grid = {
    'pca__n_components': [3, 5, 7],
    'xgb__n_estimators': [10, 20, 30, 50]
}

grid = GridSearchCV(pipe, param_grid, scoring='neg_mean_absolute_error')
grid.fit(x, y)
print(grid.best_params_)

如果向开发人员请求功能请求,最简单的扩展是允许XGBRegressor在未提供时在内部创建评估集。这样,就不需要扩展scikit-learn了(我想)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用sklearn的minmaxScalar缩放NumPy数组中具有多个功能的特定功能

sklearn中的GridSearchCV和管道是否存在拟合差异?

sklearn:在管道中应用相同的缩放来训练和预测

具有多个转换和估计器的 Sklearn 管道

带管道的sklearn GridSearchCV

结合Sklearn管道中的功能

仅在 HTML 和 CSS 中具有自动缩放功能的图像网格

在稀疏矩阵中具有缩放和均值归一化功能

sklearn GridSearchCV:ValueError:每个样本X具有21个功能;期待19

具有缩放和冗余功能的 Azure 网站

sklearn - 如何从传递给 GridSearchCV 的管道内部检索 PCA 组件和解释方差

带有管道和GridSearchCV的StandardScaler

具有自定义回归函数的管道和GridSearchCV-传递参数?

GridSearchCV-XGBoost-提前停止

在单个管道中使用sklearn线性回归和PCA

Sklearn将fit()参数传递给管道中的xgboost

使用Keras和sklearn GridSearchCV交叉验证提前停止

在具有管道功能的向量中应用is.na()函数

PCA是否具有分类功能?

管道和GridSearchCV,以及针对XGBoost和RandomForest的多类挑战

具有多个输入/输出的 sklearn 管道

Evolution是否具有“缩放文本”功能?

具有全屏缩放功能的 ImageView

带有 XGBoost 的 Sklearn GridSearchCV - 可能不使用参数 cv

具有自定义评估功能的Python中xgboost的异常行为

R中具有多个输出的管道和If语句

sklearn 中 GridSearchCV 的说明

具有n_components ='mle'和svd_solver ='full'的sklearn PCA会导致数学域错误

具有功能的管道的参数化