我有一个非常不平衡的数据集(5000个正样本,300000个负样本)。 我正在使用sklearn RandomForestClassifier来尝试预测正类的概率。我有多年的数据,并且我构建的一个特征是前一年的类别,因此我将数据集的最后一年保留下来进行测试,以及在我训练的年份中使用的测试集。
我尝试了以下方法(和结果):
使用SMOTE和SMOTEENN过采样(奇怪的分数分布,参见第一张图片,正类和负类的预测概率都相同,即模型对大多数正类预测出很低的概率)
对数据进行降采样,使其平衡(测试集的召回率约为0.80,但由于未平衡的跨年测试集中负样本总数太多,召回率仅为0.07,参见第二张图片)
保持不平衡(再次出现奇怪的得分分布,精确度提高到约0.60,而测试集和跨年测试集的召回率下降至0.05和0.10)
尝试XGBoost算法(跨年测试集上的召回率略有提高,为0.11)
接下来应该尝试什么?我想优化F1值,因为在我的情况下假阳性和假阴性都同样糟糕。我想将k-fold交叉验证纳入其中,并且已经了解到应该在过采样之前进行交叉验证。 a)我该怎么做,这是有帮助的吗? b)我该如何将其纳入类似于以下的流程中:
我尝试了以下方法(和结果):
使用SMOTE和SMOTEENN过采样(奇怪的分数分布,参见第一张图片,正类和负类的预测概率都相同,即模型对大多数正类预测出很低的概率)
对数据进行降采样,使其平衡(测试集的召回率约为0.80,但由于未平衡的跨年测试集中负样本总数太多,召回率仅为0.07,参见第二张图片)
保持不平衡(再次出现奇怪的得分分布,精确度提高到约0.60,而测试集和跨年测试集的召回率下降至0.05和0.10)
尝试XGBoost算法(跨年测试集上的召回率略有提高,为0.11)
接下来应该尝试什么?我想优化F1值,因为在我的情况下假阳性和假阴性都同样糟糕。我想将k-fold交叉验证纳入其中,并且已经了解到应该在过采样之前进行交叉验证。 a)我该怎么做,这是有帮助的吗? b)我该如何将其纳入类似于以下的流程中:
from imblearn.pipeline import make_pipeline, Pipeline
clf_rf = RandomForestClassifier(n_estimators=25, random_state=1)
smote_enn = SMOTEENN(smote = sm)
kf = StratifiedKFold(n_splits=5)
pipeline = make_pipeline(??)
pipeline.fit(X_train, ytrain)
ypred = pipeline.predict(Xtest)
ypredooy = pipeline.predict(Xtestooy)