【发布时间】:2022-01-21 01:18:13
【问题描述】:
我正在 Python 中使用数据框 df 处理 pandas。我正在执行分类任务并且有两个不平衡的类df['White'] 和df['Non-white']。为此,我构建了一个同时包含 SMOTE 和 RandomUnderSampling 的管道。
这是我的管道的样子:
model = Pipeline([
('preprocessor', preprocessor),
('smote', over),
('random_under_sampler', under),
('classification', knn)
])
这些是确切的步骤:
Pipeline(steps=[('preprocessor',
ColumnTransformer(remainder='passthrough',
transformers=[('knnimputer', KNNImputer(),
['policePrecinct']),
('onehotencoder-1',
OneHotEncoder(), ['gender']),
('standardscaler',
StandardScaler(),
['long', 'lat']),
('onehotencoder-2',
OneHotEncoder(),
['neighborhood',
'problem'])])),
('smote', SMOTE()),
('random_under_sampler', RandomUnderSampler()),
('classification', KNeighborsClassifier())])
我想评估 SMOTE 和 RandomUnderSampling 中的不同 sampling_strategy。调整参数时,我可以直接在 GridSearch 中执行此操作吗?现在,我写了以下for loop。此循环不起作用 (ValueError: too many values to unpack (expected 2))。
strategy_sm = [0.1, 0.3, 0.5]
strategy_un = [0.15, 0.30, 0.50]
best_strat = []
for k, n in strategy_sm, strategy_un:
over = SMOTE(sampling_strategy=k)
under = RandomUnderSampler(sampling_strategy=n)
model = Pipeline([
('preprocessor', preprocessor),
('smote', over),
('random_under_sampler', under),
('classification', knn)
])
mode.fit(X_train, y_train)
best_strat.append[(model.score(X_train, y_train))]
我对 Python 不是很精通,我怀疑有更好的方法来做到这一点。另外,我想要for loop(如果这确实是这样做的方法),以可视化sampling_strategy 组合的差异性能。有什么想法吗?
【问题讨论】:
-
您确定要在像这样在同一管道中过采样后进行欠采样吗?您的代码不会独立评估管道中的 SMOTE 和 RandomUnderSampling。
-
我正在关注这个guide,其中提到:关于 SMOTE 的原始论文建议将 SMOTE 与多数类的随机欠采样结合起来。 我已经检查过了,他们确实建议这。不幸的是,如果您不单独插入两个采样器,您会遇到各种问题
-
听起来不错。我的评论主要是关于措辞,我认为是想独立评估。
-
我现在明白了。是的,不单独评估它们是有意义的。我曾试图将它们组合成一个管道。但我不断收到
TypeError: All intermediate steps of the chain should be estimators that implement fit and transform or fit_resample。我认为有必要制作一个具有过采样和欠采样的平坦管道,因为存在歧义,因为不平衡学习管道定义了 fit/transform 和 fit_resample。 -
您可能需要使用 imblearn 管道,因为采样器接口可能不符合 scikit-learn 管道的预期
标签: python pandas machine-learning scikit-learn