在数据不平衡的管道中进行交叉验证的正确方法
Correct way to do cross validation in a pipeline with imbalanced data
对于给定的不平衡数据,我创建了不同的标准化管道和一个热编码
numeric_transformer = Pipeline(steps = [('scaler', StandardScaler())])
categorical_transformer = Pipeline(steps=['ohe', OneHotCategoricalEncoder()])
之后一个柱式变压器将上述管线合二为一
from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer,categorical_features)]
最终流水线如下
smt = SMOTE(random_state=42)
rf = pl1([('preprocessor', preprocessor),('smote',smt),
('classifier', RandomForestClassifier())])
我正在对不平衡数据进行管道拟合,因此我将 SMOTE 技术与预处理和分类器一起包含在内。由于它不平衡,我想检查召回分数。
正确的做法是下面的代码吗?我的召回率约为 0.98,这可能会导致模型过度拟合。如果我犯了任何错误,有什么建议吗?
scores = cross_val_score(rf, X, y, cv=5,scoring="recall")
不平衡设置中的重要问题是确保每个 CV 折叠中都会出现足够的少数 class 成员;因此,似乎建议使用 StratifiedKFold
强制执行,即:
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5)
scores = cross_val_score(rf, X, y, cv=skf, scoring="recall")
然而,事实证明,即使像您一样使用 cross_val_score
(即简单地使用 cv=5
),scikit-learn 也会处理它并确实采用分层 CV;来自 docs:
cv : int, cross-validation generator or an iterable, default=None
None, to use the default 5-fold cross validation,
int, to specify the number of folds in a (Stratified)KFold
.
For int/None inputs, if the estimator is a classifier and y
is either
binary or multiclass, StratifiedKFold
is used. In all other cases,
KFold
is used.
因此,按原样使用您的代码:
scores = cross_val_score(rf, X, y, cv=5, scoring="recall")
确实很好。
对于给定的不平衡数据,我创建了不同的标准化管道和一个热编码
numeric_transformer = Pipeline(steps = [('scaler', StandardScaler())])
categorical_transformer = Pipeline(steps=['ohe', OneHotCategoricalEncoder()])
之后一个柱式变压器将上述管线合二为一
from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer,categorical_features)]
最终流水线如下
smt = SMOTE(random_state=42)
rf = pl1([('preprocessor', preprocessor),('smote',smt),
('classifier', RandomForestClassifier())])
我正在对不平衡数据进行管道拟合,因此我将 SMOTE 技术与预处理和分类器一起包含在内。由于它不平衡,我想检查召回分数。
正确的做法是下面的代码吗?我的召回率约为 0.98,这可能会导致模型过度拟合。如果我犯了任何错误,有什么建议吗?
scores = cross_val_score(rf, X, y, cv=5,scoring="recall")
不平衡设置中的重要问题是确保每个 CV 折叠中都会出现足够的少数 class 成员;因此,似乎建议使用 StratifiedKFold
强制执行,即:
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5)
scores = cross_val_score(rf, X, y, cv=skf, scoring="recall")
然而,事实证明,即使像您一样使用 cross_val_score
(即简单地使用 cv=5
),scikit-learn 也会处理它并确实采用分层 CV;来自 docs:
cv : int, cross-validation generator or an iterable, default=None
None, to use the default 5-fold cross validation,
int, to specify the number of folds in a
(Stratified)KFold
.For int/None inputs, if the estimator is a classifier and
y
is either binary or multiclass,StratifiedKFold
is used. In all other cases,KFold
is used.
因此,按原样使用您的代码:
scores = cross_val_score(rf, X, y, cv=5, scoring="recall")
确实很好。