[英]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 可能是什么原因的想法,以防其他人遇到类似的问题;
您可以尝试其他 集成方法来进行 class 不平衡学习。 SMOTEBoost就是这样一种结合了boosting和数据采样方法的方法,在每次boosting迭代中都需要注入SMOTE技术。
您可能会对这篇文章感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.