【发布时间】:2020-08-26 19:41:49
【问题描述】:
我正在研究一个多类分类用例,并且数据高度不平衡。通过高度不平衡的数据,我的意思是频率最高的类别和频率最低的类别之间存在巨大差异。因此,如果我继续使用SMOTE oversampling,那么数据量会大大增加(数据量从 280k 行增加到超过 250 亿行,因为不平衡性太高了)并且实际上不可能将 ML 模型拟合到如此庞大的数据集.同样,我不能使用欠采样,因为这会导致信息丢失。
所以我想在创建 ML 模型时使用来自 sklearn 的 compute_class_weight。
代码:
from sklearn.utils.class_weight import compute_class_weight
class_weight = compute_class_weight(class_weight='balanced',
classes=np.unique(train_df['Label_id']),
y=train_df['Label_id'])
dict_weights = dict(zip(np.unique(train_df['Label_id']), class_weight))
svc_model = LinearSVC(class_weight=dict_weights)
我对测试数据进行了预测,并注意到了accuracy、f1_score、recall 等指标的结果。
我尝试复制相同但不传递class_weight,如下所示:
svc_model = LinearSVC()
但是我得到的结果很奇怪。通过class_weight 后的指标比没有class_weight 的指标差一些。
我希望得到完全相反的结果,因为我正在使用 class_weight 来改进模型,从而改进指标。
两种模型的指标差异很小,但与没有class_weight 的模型相比,f1_score 的模型与class_weight 的模型相比较小。
我也试过下面的sn-p:
svc_model = LinearSVC(class_weight='balanced')
但与没有class_weight 的模型相比,f1_score 仍然更少。
以下是我获得的指标:
LinearSVC w/o class_weight
Accuracy: 89.02, F1 score: 88.92, Precision: 89.17, Recall: 89.02, Misclassification error: 10.98
LinearSVC with class_weight=’balanced’
Accuracy: 87.98, F1 score: 87.89, Precision: 88.3, Recall: 87.98, Misclassification error: 12.02
LinearSVC with class_weight=dict_weights
Accuracy: 87.97, F1 score: 87.87, Precision: 88.34, Recall: 87.97, Misclassification error: 12.03
我认为使用class_weight 会改善指标,但反而会恶化指标。为什么会发生这种情况,我该怎么办?如果我不处理不平衡数据可以吗?
【问题讨论】:
标签: python machine-learning scikit-learn classification imbalanced-data