繁体   English   中英

EasyEnsembleClassifier 的高召回率、低精度

[英]High recall, low precision with EasyEnsembleClassifier

我有一个包含 450.000 个数据点、12 个特征和标签(0 或 1)的数据集。 我正在使用 python 的 imblearn 库,因为我的数据集不平衡(比率 = 1:50,class 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------
.............

Output:

分类报告

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

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

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

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

您可以尝试其他 集成方法来进行 class 不平衡学习。 SMOTEBoost就是这样一种结合了boosting和数据采样方法的方法,在每次boosting迭代中都需要注入SMOTE技术。

您可能会对这篇文章感兴趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM