如何在 SKLearn 的 Stacking 中使用 SMOTE?

数据挖掘 分类 scikit-学习 打击 管道 堆叠
2022-02-25 02:45:52

我有一个数据集X,y并将它们拆分为训练和测试数据。 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, stratify = y, random_state=10). 为了处理不平衡的数据,我想使用 SMOTE,然后使用分类算法。但是,我将使用 Stacking 作为我的分类方法。我会很感激知道什么时候应该使用 SMOTE?我应该在定义较低级别的分类器还是在较高级别的分类器中使用它们?

level0 = list()
oversample = SMOTE()
RF = RandomForestClassifier(random_state=13)
pipe1 = Pipeline(steps=[('OverSampling', oversample ), ('Classifier', RF)])
level0.append(pipe1 )

DT = DecisionTreeClassifier( random_state=0)
pipe2 = Pipeline(steps=[('OverSampling', oversample ), ('Classifier', DT)])
level0.append(pipe2)



level1 = LogisticRegression
model = StackingClassifier(estimators=level0, final_estimator=level1, cv=10, passthrough = True)
model.fit(X_train, y_train)
model.predict(X_test)

或者我应该使用以下代码?

level0 = list()
oversample = SMOTE()
RF = RandomForestClassifier(random_state=13)
level0.append(RF)

DT = DecisionTreeClassifier( random_state=0)
level0.append(DT)

level1 = LogisticRegression
model = StackingClassifier(estimators=level0, final_estimator=level1, cv=10, passthrough = True)

pipe1 = Pipeline(steps=[('OverSampling', oversample ), ('Classifier', model)])

pipe1.fit(X_train, y_train)
pipe1.predict(X_test)

另一个问题,我们在训练步骤中使用 SMOTE 以获得更好的模型。但是在流水线中,第一步是使用SMOTE,我认为在对测试数据的预测中,首先是对测试数据进行过采样,然后再应用分类模型?这是正确的吗?我不知道应该如何使用 SMOTE 进行最终预测。如果有人能解释它并修改我的代码,我将不胜感激。

1个回答

第一个问题,是否将 SMOTE 用于堆叠分类器的第一个或第二个。一般来说,SMOTE 应该在任何分类之前完成,因为 SMOTE 给少数类增加了成功学习的可能性。第一个分类器应该被赋予最有用的特征。另一种方法是寻找经验证据。双向训练模型并选择表现更好的排序。

第二个问题,SMOTE 只在训练数据集上完成。在预测期间,仅预测存在的数据。如果你使用imblearn 的 Pipeline,这会自动处理。