【发布时间】:2021-06-16 23:15:31
【问题描述】:
我有一个包含 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------
.............
输出:
我尝试了不同的缩放器,即 MinMaxScaler、StandardScaler。我尝试改变测试列车的分割比率,EasyEnsembleClassifier 的不同参数。我也尝试过来自同一个库的 BalancedRandomForestClassifier,但结果是一样的。更改分类器参数中的估计器数量也不会改变结果。
这个结果的原因是什么?在不损害召回率的情况下,我可以做些什么来提高精度?看起来我在代码中做错了什么,或者我错过了一个重要的概念。
编辑: 我仍然无法弄清楚我的问题的真正原因,但由于没有人回答我的问题,这里有一些想法,如果其他人遇到类似问题,这个奇怪模型的原因可能是什么;
- 很可能我的数据集标记不佳。模型可能无法区分类,因为它们非常相似。我将尝试生成一些合成数据来再次训练我的模型。
- 我没有对此进行测试,但某些功能可能会损害模型。我需要目视检查特征之间是否存在相关性并删除其中一些,但我高度怀疑这是问题所在,因为增强分类器应该通过加权每个特征来自动处理这个问题。
- 在我的情况下,12 个功能可能还不够。我可能需要更多。虽然我的数据集生成更多特征并不容易,但我会考虑一下。
- 最后可能欠采样不适合我的数据集。如果我感到足够绝望,我会尝试过采样技术或 SMOTE。
【问题讨论】:
标签: python machine-learning imblearn