大不平衡数据的机器学习模型建议
Machine learning model suggestion for large imbalance data
我有分类问题的数据集。我总共有 50 类。
Class1: 10,000 examples
Class2: 10 examples
Class3: 5 examples
Class4: 35 examples
.
.
.
and so on.
我尝试使用 SVM(线性核和高斯核)训练我的分类器。我对测试数据的准确率分别为 65% 和 72%。现在我正在考虑使用神经网络。您对大型不平衡数据的机器学习模型和算法有什么建议吗?这对我非常有帮助
根据我的经验,处理不平衡 类 最成功的方法是:
改变输入的分布: 20000 个样本(你拥有的样本的近似数量)不是一个大数字,所以你可以简单地改变你的数据集分布通过多次使用频率较低的 类 中的每个样本。根据 类 的数量,您可以将它们的示例数量设置为例如训练集中各有 6000 或 8000 个。在这种情况下,请记住不要更改测试和验证集的分布。
增加训练时间:在神经网络的情况下,当改变输入的分布是不可能的时候我强烈建议你尝试学习网络相当很长一段时间(例如 1000 个纪元)。在这种情况下,您必须记住正则化。我通常使用 dropout 和 l2 weight regulariser,它们的参数是通过随机搜索算法学习的。
减少批量大小: 在神经网络的情况下,减少批量大小可能会提高频率较低的性能 类。
更改损失函数: 使用 MAPE insted of Crossentropy还可以提高频率较低的准确性 类.
受邀测试不同的方法组合,例如随机搜索算法。
你应该提供更多关于数据集特征和class分布的信息,这将有助于其他人给你建议。
无论如何,我认为神经网络不适合这里,因为这个数据集对它来说太小了。
假设 50% 或更多的样本属于 class 1 那么我首先要寻找一个区分 class 1 和非 [=] 的 classifier 16=] 1个样本(二进制class化)。这个 classifier 应该胜过一个朴素的 classifier(基准),后者随机选择一个 classification,其先验对应于训练集 class 分布。
例如,假设有 1,000 个样本,其中 700 个属于 class 1,那么基准 classifier 会将新样本 class 确定为 class 1 700/1,000=0.7 的概率(就像一次不公平的抛硬币)。
一旦您找到了具有良好准确度的 class 化器,下一阶段可以 class 化非 class 1 class 化的样本作为其中一个其他 49 classes,假设这些 classes 更平衡,那么我将从 RF、NB 和 KNN 开始。
再提一个建议:确保每批数据相对平衡。
例如,您可以从第 1 类抽取 4 个案例,从第 2 类抽取 2 个,从第 3 类抽取 1 个,从第 4 类抽取 3 个。或者您可以从 class1 中抽取更多案例,但按案例损失对它们进行排序,并仅使用前几名损失(将其他案例损失乘以 0)。
或尝试焦点损失或加权交叉熵。
我有分类问题的数据集。我总共有 50 类。
Class1: 10,000 examples
Class2: 10 examples
Class3: 5 examples
Class4: 35 examples
.
.
.
and so on.
我尝试使用 SVM(线性核和高斯核)训练我的分类器。我对测试数据的准确率分别为 65% 和 72%。现在我正在考虑使用神经网络。您对大型不平衡数据的机器学习模型和算法有什么建议吗?这对我非常有帮助
根据我的经验,处理不平衡 类 最成功的方法是:
改变输入的分布: 20000 个样本(你拥有的样本的近似数量)不是一个大数字,所以你可以简单地改变你的数据集分布通过多次使用频率较低的 类 中的每个样本。根据 类 的数量,您可以将它们的示例数量设置为例如训练集中各有 6000 或 8000 个。在这种情况下,请记住不要更改测试和验证集的分布。
增加训练时间:在神经网络的情况下,当改变输入的分布是不可能的时候我强烈建议你尝试学习网络相当很长一段时间(例如 1000 个纪元)。在这种情况下,您必须记住正则化。我通常使用 dropout 和 l2 weight regulariser,它们的参数是通过随机搜索算法学习的。
减少批量大小: 在神经网络的情况下,减少批量大小可能会提高频率较低的性能 类。
更改损失函数: 使用 MAPE insted of Crossentropy还可以提高频率较低的准确性 类.
受邀测试不同的方法组合,例如随机搜索算法。
你应该提供更多关于数据集特征和class分布的信息,这将有助于其他人给你建议。 无论如何,我认为神经网络不适合这里,因为这个数据集对它来说太小了。
假设 50% 或更多的样本属于 class 1 那么我首先要寻找一个区分 class 1 和非 [=] 的 classifier 16=] 1个样本(二进制class化)。这个 classifier 应该胜过一个朴素的 classifier(基准),后者随机选择一个 classification,其先验对应于训练集 class 分布。 例如,假设有 1,000 个样本,其中 700 个属于 class 1,那么基准 classifier 会将新样本 class 确定为 class 1 700/1,000=0.7 的概率(就像一次不公平的抛硬币)。
一旦您找到了具有良好准确度的 class 化器,下一阶段可以 class 化非 class 1 class 化的样本作为其中一个其他 49 classes,假设这些 classes 更平衡,那么我将从 RF、NB 和 KNN 开始。
再提一个建议:确保每批数据相对平衡。
例如,您可以从第 1 类抽取 4 个案例,从第 2 类抽取 2 个,从第 3 类抽取 1 个,从第 4 类抽取 3 个。或者您可以从 class1 中抽取更多案例,但按案例损失对它们进行排序,并仅使用前几名损失(将其他案例损失乘以 0)。
或尝试焦点损失或加权交叉熵。