【发布时间】:2022-01-18 12:42:16
【问题描述】:
亲爱的同事们,我创建了一个 scikit 学习管道来训练和调整不同的 HistBoostRegressor。
from scipy.stats import loguniform
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import VarianceThreshold
from sklearn.multioutput import MultiOutputRegressor
from sklearn.model_selection import RandomizedSearchCV
class loguniform_int:
"""Integer valued version of the log-uniform distribution"""
def __init__(self, a, b):
self._distribution = loguniform(a, b)
def rvs(self, *args, **kwargs):
"""Random variable sample"""
return self._distribution.rvs(*args, **kwargs).astype(int)
data_train, data_test, target_train, target_test = train_test_split(
df.drop(columns=TARGETS),
df[target_dict],
random_state=42)
pipeline_hist_boost_mimo_inside = Pipeline([('scaler', StandardScaler()),
('variance_selector', VarianceThreshold(threshold=0.03)),
('estimator', MultiOutputRegressor(HistGradientBoostingRegressor(loss='poisson')))])
parameters = {
'estimator__estimator__l2_regularization': loguniform(1e-6, 1e3),
'estimator__estimator__learning_rate': loguniform(0.001, 10),
'estimator__estimator__max_leaf_nodes': loguniform_int(2, 256),
'estimator__estimator__max_leaf_nodes': loguniform_int(2, 256),
'estimator__estimator__min_samples_leaf': loguniform_int(1, 100),
'estimator__estimator__max_bins': loguniform_int(2, 255),
}
random_grid_inside = RandomizedSearchCV(estimator=pipeline_hist_boost_mimo_inside, param_distributions=parameters, random_state=0, n_iter=50,
n_jobs=-1, refit=True, cv=3, verbose=True,
pre_dispatch='2*n_jobs',
return_train_score=True)
results_inside_train = random_grid_inside.fit(data_train, target_train)
但是现在我想知道是否可以将不同的功能名称传递给步骤 pipeline_hist_boost_mimo_inside["estimator"]。
我注意到在多输出回归器的文档中,我们有一个参数调用 feature_names:
feature_names_in_ndarray of shape (n_features_in_,) 特征名称 在适合期间看到。仅在基础估计器公开此类时才定义 适合时的属性。
1.0 版中的新功能。
我还在 scikit learn 列选择器中找到了一些文档,其中包含以下参数:
patternstr, default=None 包含此正则表达式模式的列的名称 将包括在内。如果为 None,则不会选择基于列的选择 在模式上。
问题是这种模式将取决于我适合的目标。
有没有办法优雅地做到这一点?
编辑:数据集示例:
feat1, feat2, feat3.... target1, target2, target3....
1 47 0.65 0 0.5 0.6
多输出回归器将为每对(feat1、feat2、feat3 和 targetn)拟合直方图回归器。在下表的示例中,我将有一个管道,其中估算器步骤将包含 3 个估算器的列表作为具有 3 个目标。
问题是例如如何将feat1 和feat2 传递给target1,而将feat1 和feat3 传递给target2。
【问题讨论】:
-
您能更详细地解释一下
pass different feature names是什么意思吗?第一印象是您可以使用转换器来删除您不想要的功能,例如 DropFeatures,或者您可以创建自定义转换器来选择您想要的功能。 -
嗨米格尔。由于我的 y_train 包含 12 个不同的目标,dropfeatures 可以根据不同的目标名称工作吗?
-
所以您正在寻找一个像
column_selector或DropFeatures一样工作但应用于目标变量的转换器?如果你的任务是回归HistGradientBoostingRegressor为什么你的目标只有 12 个不同的值? -
嗨 Miguel,我的目标有数千个不同的值。我的意思是我有 12 个不同的目标,这就是我使用多输出回归器的原因。
-
很抱歉还没有完全理解它,但是您有一个维度为 (n_samples, 12) 的目标变量矩阵,并且您想要选择 12 个特征中的一些,例如一个较低维度的矩阵 (m , 7),在使用
MultiOutputRegressor运行模型之前?你能举一个你的目标变量的例子吗?
标签: python scikit-learn regression pipeline