EasyEnsembleClassifier 具有高召回率、低精度

问题描述

我有一个包含 450.000 个数据点、12 个特征和标签(0 或 1)的数据集。我正在使用 python 的 imblearn 库,因为我的数据集是不平衡的(比率 = 1:50,第 1 类是少数)。我使用 EasyEnsembleClassifier 作为分类器。我的问题是;我的召回率很高,但准确率很低,如下图所示(90% 召回率,8% 准确率,14% f1 分数)。

这是我的代码

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from dask_ml.preprocessing import RobustScaler
from imblearn.ensemble import EasyEnsembleClassifier
from sklearn.metrics import classification_report,f1_score,accuracy_score,precision_score,confusion_matrix
from sklearn import metrics

df = read_csv(...)
X = df[['features...']]
y = df['label']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
scaler = RobustScaler()
X_train = scaler.fit_transform(X_train)
clf = EasyEnsembleClassifier(n_estimators=50,n_jobs=-1,sampling_strategy = 1.0)

clf.fit(X_train,y_train)
X_test = scaler.transform(X_test)
y_pred = clf.predict(X_test)

------code for report------
.............

输出

Classification Report

我尝试了不同的缩放器,即 MinMaxScaler、StandardScaler。我尝试更改测试列车分流比,EasyEnsembleClassifier 的不同参数。我也尝试过来自同一个库的 BalancedRandomForestClassifier 但结果是一样的。改变分类器参数中的估计器数量也不会改变结果。

这个结果的原因是什么?如何在不损害召回率的情况下提高精度?看起来我在代码中做错了什么,或者我遗漏了一个重要的概念。

编辑: 我仍然无法弄清楚我的问题的真正原因,但由于没有人回答我的问题,因此这里有一些关于这种奇怪模型可能是什么原因的想法,以防其他人遇到类似问题;

  • 很可能我的数据集标签很差。模型可能无法区分类别,因为它们非常相似。我将尝试生成一些合成数据来再次训练我的模型。
  • 我没有对此进行测试,但某些功能可能会损害模型。我需要目视检查以找出特征之间是否存在相关性并删除其中一些特征,但我高度怀疑这是问题所在,因为提升分类器应该通过对每个特征进行加权来自动处理这个问题。
  • 在我的情况下,还有 12 个功能可能还不够。我可能需要更多。虽然我的数据集生成更多特征并不容易,但我会考虑。
  • 最后,欠采样可能不适合我的数据集。如果我感到绝望,我会尝试使用过采样技术或 SMOTE。

解决方法

您可以尝试使用其他 ensemble methods 进行类不平衡学习。 SMOTEBoost 就是这样一种结合 boosting 和数据采样方法的方法,本质上在每次 boosting 迭代中都注入了 SMOTE 技术。

This 文章可能对您感兴趣。