我在分类问题上遇到了麻烦 .
我有两个标签训练数据中有近40万个向量,我想训练MLP将数据分为两类 . 但是,数据集是如此不 balancer . 95%的人有标签1,其他人有标签0.准确性随着训练的进展而增加,并在达到95%后停止 . 我想这是因为网络预测所有向量的标签为1 .
到目前为止,我尝试删除0.5个概率的图层 . 但是,结果是一样的 . 有没有办法提高准确性?
我认为处理不 balancer 数据的最佳方法是为您的 class 使用权重 . 例如,您可以对类进行加权,使每个类的权重总和相等 .
import pandas as pd df = pd.DataFrame({'x': range(7), 'y': [0] * 2 + [1] * 5}) df['weight'] = df['y'].map(len(df)/2/df['y'].value_counts()) print(df) print(df.groupby('y')['weight'].agg({'samples': len, 'weight': sum}))
输出:
x y weight 0 0 0 1.75 1 1 0 1.75 2 2 1 0.70 3 3 1 0.70 4 4 1 0.70 5 5 1 0.70 6 6 1 0.70 samples weight y 0 2.0 3.5 1 5.0 3.5
您可以在示例子集上尝试另一个分类器 . SVM可以很好地处理小数据,所以你可以假设只有10k的例子,在类中有5/1的比例 .
您也可能以某种方式对小类进行过采样,并对另一个进行欠采样 .
你也可以简单地给你的课增重 .
还要考虑适当的指标 . 你注意到你输出的预测只有一个标签,这很好 . 然而,使用准确性并不容易看出 .
关于不 balancer 数据集的一些好主意:
https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
切记不要更改测试集 .
这是一种常见情况:网络学习常数并且无法摆脱这种局部最小值 .
当数据非常不 balancer 时(如您的情况),一种可能的解决方案是weighted cross entropy损失函数 . 例如,在tensorflow中,应用内置的tf.nn.weighted_cross_entropy_with_logits函数 . 在this post中也有一个很好的讨论这个想法 .
但我应该说,获得更多数据以 balancer 两个类(如果可能的话)将始终有所帮助 .
3 回答
我认为处理不 balancer 数据的最佳方法是为您的 class 使用权重 . 例如,您可以对类进行加权,使每个类的权重总和相等 .
输出:
您可以在示例子集上尝试另一个分类器 . SVM可以很好地处理小数据,所以你可以假设只有10k的例子,在类中有5/1的比例 .
您也可能以某种方式对小类进行过采样,并对另一个进行欠采样 .
你也可以简单地给你的课增重 .
还要考虑适当的指标 . 你注意到你输出的预测只有一个标签,这很好 . 然而,使用准确性并不容易看出 .
关于不 balancer 数据集的一些好主意:
https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
切记不要更改测试集 .
这是一种常见情况:网络学习常数并且无法摆脱这种局部最小值 .
当数据非常不 balancer 时(如您的情况),一种可能的解决方案是weighted cross entropy损失函数 . 例如,在tensorflow中,应用内置的tf.nn.weighted_cross_entropy_with_logits函数 . 在this post中也有一个很好的讨论这个想法 .
但我应该说,获得更多数据以 balancer 两个类(如果可能的话)将始终有所帮助 .