提高高度不平衡数据集的准确性

数据挖掘 机器学习模型 不平衡学习
2022-03-12 14:24:01

我需要一些建议来提高我的模型准确性。

训练数据形状为:(166573, 14)

训练数据

它具有所有 int 和 float 列。我已经删除了claim_daysaway列,因为大多数值都是 NaN 并将 Nan 值替换为层列的平均值。

X_train = train.drop(['outcome','testindex','claims_daysaway'], axis=1)
y_train = train['outcome']

在此处输入图像描述

由于值的比例不同,我使用 StandScaler() 来标准化值。

在此处输入图像描述

该数据集高度不平衡。

train['结果'].value_counts()

0    159730 
1      6843

我尝试过 SMOTE 进行过采样。

from imblearn.over_sampling import SMOTE
smt = SMOTE()
X_train, y_train = smt.fit_sample(X_train, y_train)
pd.value_counts(pd.Series(y_train))

1    159730
0    159730

最后,我使用XGBClassifier拟合模型,但是当在 testdata 上尝试这个模型并提交它时,它只给出了 60% 的 roc_auc_score。

请建议如何更好地处理不平衡的数据集。

1个回答

我不太清楚您所说的“使用 AUC 达到 60% 的准确率”是什么意思。准确度和 AUC 是两个不同的指标……我的回答好像您指的是分类准确度,因为那是在您的标题和帖子的第一句话中。

首先,不要使用准确性来评估不平衡数据的性能

您的数据集的不平衡率为 6843/159730,约为 1/23。这意味着,如果您制作一个仅预测多数类别的虚拟分类器,您将获得 96% 的准确率。对于不平衡的数据有更好的选择,例如f1 分数或任何宏观平均指标(您可以阅读这篇文章的更多信息)。

其次,我不确定你在做什么,但无论如何,你不应该评估 oversampled dataset

至于提高性能的想法,我没有很多,因为你做的大部分事情都是正确的。基于树的算法(例如 XGBoost)非常适合处理不平衡的数据。您已经对数据进行过采样,这很有帮助。其他一些想法是:

  • 尝试不同的过采样器、欠采样器或过采样和欠采样技术的组合。
  • 搜索以优化 XGBoost 的超参数。我无法通过您提供的信息来判断,但也许您过拟合了。
  • 尝试不同的算法(catboost、lightgbm 等),或者这些模型的集合(堆叠模型等)。