Machine learning 在数据不平衡的管道中进行交叉验证的正确方法

Machine learning 在数据不平衡的管道中进行交叉验证的正确方法,machine-learning,scikit-learn,cross-validation,imbalanced-data,smote,Machine Learning,Scikit Learn,Cross Validation,Imbalanced Data,Smote,对于给定的不平衡数据,我创建了一个不同的标准化管道&一个热编码 numeric\u transformer=Pipeline(步骤=[('scaler',StandardScaler())] categorical_transformer=管道(步骤=['ohe',OneHotCategoricalEncoder()) 之后,柱形变压器将上述管道保持在一个 来自sklearn.compose的 预处理器=列转换器( 变形金刚=[ ('num',数字变压器,数字特征), ('cat',分类变压器

对于给定的不平衡数据,我创建了一个不同的标准化管道&一个热编码

numeric\u transformer=Pipeline(步骤=[('scaler',StandardScaler())]
categorical_transformer=管道(步骤=['ohe',OneHotCategoricalEncoder())
之后,柱形变压器将上述管道保持在一个

来自sklearn.compose的

预处理器=列转换器(
变形金刚=[
('num',数字变压器,数字特征),
('cat',分类变压器,分类特征)]
最终管道如下所示

smt=SMOT(随机状态=42)
rf=pl1([(‘预处理器’、预处理器)、(‘SMOT’、smt),
('classifier',RandomForestClassifier())])
我正在对不平衡的数据进行管道拟合,因此我将SMOTE技术与预处理和分类器结合在一起。由于它是不平衡的,我想检查召回分数

正确的方法是否如下面的代码所示?我得到的召回率约为0.98,这可能会导致模型过度拟合。如果我犯了任何错误,有什么建议吗

scores=cross\u val\u scores(rf、X、y、cv=5,scoring=“recall”)

不平衡设置中的重要问题是确保每个CV折叠中都有足够的少数群体成员;因此,似乎建议使用
分层折叠,即:

从sklearn.model_选择导入分层折叠
skf=层状褶皱(n_分裂=5)
分数=交叉分数(rf、X、y、cv=skf,score=“回忆”)
然而,事实证明,即使像您一样使用
交叉评分
(即简单地使用
cv=5
),scikit learn也会注意到这一点,并使用分层的cv;从:

cv:int,交叉验证生成器或iterable,默认值=None

  • 无,要使用默认的5倍交叉验证

  • int,指定
    (分层)KFold
    中的折叠数

对于int/None输入,如果估计器是分类器,
y
是 二进制或多类,使用分层折叠。在所有其他情况下, 使用了
KFold

因此,按原样使用代码:

scores=cross\u val\u scores(rf、X、y、cv=5,scoring=“recall”)

确实很好。

您在CV程序中正确地应用了管道。“我的召回率约为0.98,这可能会导致模型过度匹配”完全不可理解。谢谢,我怀疑管道中选择交叉验证的过程是否错误。这也是我第一次在管道上实现。
cross\val\u score
StratifiedKFold的默认交叉验证策略不是吗(假设问题是单输出)?@BenReiniger heck,你说得对!我错过了:(你想自己发布这个答案吗(我会要求OP接受你的答案)?否则我会更新我的-你的电话。。。