我正在处理一个多类分类用例,数据高度不平衡。所谓高度不平衡的数据,我是指频率最高的类和频率最低的类之间存在着巨大的差异。因此,如果我继续使用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的模型相比,使用class_weight的模型的f1_score更小。
我还尝试了下面的代码片段:
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会改进度量标准,但它却在恶化度量标准。为什么会发生这种情况?我应该怎么做?如果我不处理不平衡数据,可以吗?
发布于 2020-05-11 21:56:26
并不总是保证如果你使用class_weight,性能会一直提高。当我们处理随机系统时,总是会有一些不确定性。
您可以尝试使用class_weight = 'auto'。这里有一个讨论:https://github.com/scikit-learn/scikit-learn/issues/4324
最后,您似乎使用线性支持向量机的默认超参数,这意味着C=1和;我建议尝试使用超参数,如果可能的话,甚至进行网格搜索来测试,如果class_weight仍然降低了性能,请尝试数据归一化。
发布于 2020-05-11 22:39:17
我如何看待这个问题
我对您的问题的理解是,您的类权重方法实际上正在改进您的模型,但您(可能)没有看到这一点。原因如下:
假设您有10个POS和1k个NEG样本,并且您有两个模型: M-1正确预测所有NEG样本(假阴性率= 0),但仅正确预测10个POS样本中的2个。M-2正确地预测了700个NEG和8个POS样本。从异常检测的角度来看,第二个模型可能是首选的,而第一个模型(显然陷入了不平衡问题)具有更高的f1分数。
类权重将尝试解决您的不平衡问题,将您的模型从M-1转换到M-2。因此,您的f1分数可能会略有下降。但是你可能有一个质量更好的模型。
你如何验证我的观点?
你可以通过查看混淆矩阵来检查我的观点,看看f1分数是否由于你的主修类更多的错误分类而降低,以及你的辅修类现在是否有更多真正的积极因素。此外,您还可以专门针对不平衡类测试其他指标。我知道Cohen's Kappa,也许你会看到,类的权重实际上增加了Kappa分数。
还有一件事:做一些自举或交叉验证,f1分数的变化可能是由于数据的可变性而没有任何意义
https://stackoverflow.com/questions/61726765
复制相似问题