![](/img/trans.png)
[英]How to do these in weka: cross validation + imbalanced data + feature selection
[英]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 左右,这可能导致 model 过拟合。 如果我犯了任何错误,有什么建议吗?
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; 来自文档:
cv: int,交叉验证生成器或可迭代对象,默认=None
无,使用默认的 5 折交叉验证,
int,指定
(Stratified)KFold
中的折叠数。对于 int/None 输入,如果估计器是分类器并且
y
是二元或多类,则使用StratifiedKFold
。 在所有其他情况下,使用KFold
。
因此,按原样使用您的代码:
scores = cross_val_score(rf, X, y, cv=5, scoring="recall")
确实很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.