我正在研究一个多类分类用例,数据高度不平衡。通过高度不平衡的数据,我的意思是频率最高的类别和频率最低的类别之间存在巨大差异。因此,如果我继续使用,SMOTE oversampling
那么数据量会大大增加(数据量从 280k 行增加到超过 250 亿行,因为不平衡性太高了)并且实际上不可能将 ML 模型拟合到如此庞大的数据集。同样,我不能使用欠采样,因为这会导致信息丢失。
所以我想compute_class_weight
在创建 ML 模型时使用 from sklearn。
代码:
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
它来使模型更好,从而使指标更好。
两个模型的指标之间的差异很小,但与没有f1_score
模型class_weight
相比,模型的差异较小class_weight
。
我还尝试了以下代码段:
svc_model = LinearSVC(class_weight='balanced')
但f1_score
与没有的模型相比,它仍然更少class_weight
。
以下是我获得的指标:
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
会改善指标,但会恶化指标。为什么会发生这种情况,我该怎么办?如果我不处理不平衡数据可以吗?