能否将TransformedTargetRegressor添加到scikit-learn的管道中?

我正在为一些数据设置一个预测分析管道,目前正在进行模型选择。我的目标变量是偏斜的,因此我想通过对数变换来提高我的线性回归估计器的性能。我发现了scikit-learn相对较新的TransformedTargetRegressor,我想我可以将其作为管道的一部分。我附上了我的代码

我的初步尝试是在调用gs.fit()之前对y_train进行变换,将其转换为np.log1p(y_train)。这种方法有效,我可以执行嵌套交叉验证并返回所有估计器的感兴趣指标。然而,我希望能够在之前未见过的数据(验证集)上获取训练模型的R^2和RMSE,我理解为了做到这一点,我需要使用(例如)r2_score函数在y_val, preds上,其中预测需要被转换回真实值,即preds = np.expm1(gs.predict(X_val))

### 创建管道
pipe = Pipeline([
    # 变换器阶段由param_grid填充
    ('transformer', TransformedTargetRegressor(func=np.log1p, inverse_func=np.expm1)),
    ('reg', DummyEstimator())  # 占位估计器
])

### 候选学习算法及其超参数
alphas = [0.001, 0.01, 0.1, 1, 10, 100]
param_grid = [
    {'transformer__regressor': Lasso(),
     'reg': [Lasso()], # 实际估计器
     'reg__alpha': alphas},
    {'transformer__regressor': LassoLars(),
     'reg': [LassoLars()], # 实际估计器
     'reg__alpha': alphas},
    {'transformer__regressor': Ridge(),
     'reg': [Ridge()], # 实际估计器
     'reg__alpha': alphas},
    {'transformer__regressor': ElasticNet(),
     'reg': [ElasticNet()], # 实际估计器
     'reg__alpha': alphas,
     'reg__l1_ratio': [0.25, 0.5, 0.75]}
]

### 创建网格搜索(内部CV)
gs = GridSearchCV(pipe, param_grid=param_grid, cv=5, verbose=2, n_jobs=-1,
                  scoring=scoring, refit='r2', return_train_score=True)

### 拟合
best_model = gs.fit(X_train, y_train)

### 外部CV的评分指标
scoring = ['neg_mean_absolute_error', 'r2', 'explained_variance', 'neg_mean_squared_error']

### 外部CV
linear_cv_results = cross_validate(gs, X_train, y_train_transformed,
                                   scoring=scoring, cv=5, verbose=3, return_train_score=True)

### 计算平均指标
train_r2 = (linear_cv_results['train_r2']).mean()
test_r2 = (linear_cv_results['test_r2']).mean()
train_mae = (-linear_cv_results['train_neg_mean_absolute_error']).mean()
test_mae = (-linear_cv_results['test_neg_mean_absolute_error']).mean()
train_exp_var = (linear_cv_results['train_explained_variance']).mean()
test_exp_var = (linear_cv_results['test_explained_variance']).mean()
train_rmse = (np.sqrt(-linear_cv_results['train_neg_mean_squared_error'])).mean()
test_rmse = (np.sqrt(-linear_cv_results['test_neg_mean_squared_error'])).mean()

显然这段代码片段不起作用,因为显然我不能将TransformedTargetRegressor添加到我的管道中,因为它没有transform方法(我得到了这个TypeErrorTypeError: All intermediate steps should be transformers and implement fit and transform)。

有没有“正确”的方法来做这件事,还是我必须在调用r2_score函数等时临时对y_val进行对数变换?


回答:

不,因为scikit-learn原始的Pipeline不会在步骤中改变yXy中的样本数量。

你的用例有点不清楚。如果reg已经添加到TransformedTargetRegressor中,为什么还需要reg步骤?

查看TransformedTargetRegressor文档,参数regressor接受一个回归器(也可以是一个管道,其中包含对X的一些特征选择操作,最后阶段是一个回归器)。TransformedTargetRegressor的工作原理将是:

fit():
    regressor.fit(X, func(y))
predict():
    inverse_func(regressor.predict(X))

所以没有必要将同一个回归器作为一个新步骤添加。你的模型选择代码现在可以是:

pipe = TransformedTargetRegressor(regressor = DummyEstimator(),
                                  func=np.log1p,
                                  inverse_func=np.expm1)

### 候选学习算法及其超参数
alphas = [0.001, 0.01, 0.1, 1, 10, 100]
param_grid = [
    {'transformer__regressor': Lasso(),
     'transformer__regressor__alpha': alphas},
    {'transformer__regressor': LassoLars(),
     'transformer__regressor__alpha': alphas},
    {'transformer__regressor': Ridge(),
     'transformer__regressor__alpha': alphas},
    {'transformer__regressor': ElasticNet(),
     'transformer__regressor__alpha': alphas,
     'transformer__regressor__l1_ratio': [0.25, 0.5, 0.75]}
]

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注