【问题标题】:Machine Learning with an Unbalanced Dataset具有不平衡数据集的机器学习
【发布时间】:2018-12-14 16:15:40
【问题描述】:

我有以下不平衡数据集,其中包含从 1 到 10 的葡萄酒评级。班级余额如下:

评分/# 样本 (%)

  • 1 - 0 (0.0%)
  • 2 - 0 (0.0%)
  • 3 - 10 (0.74%)
  • 4 - 53 (3.90%)
  • 5 - 577 (42.5%)
  • 6 - 535 (39.40%)
  • 7 - 167 (12.29%)
  • 8 - 17 (1.25%)
  • 9 - 0 (0.0%)
  • 10 - 0 (0.0%)

由于我无法获得更多数据,对于这种不平衡的数据,使用 Scikit-Learning 预测费率的最佳方法是什么? SMOTE 可以应用于这种情况吗?

谢谢大家!

【问题讨论】:

  • 由于你没有任何关于类(1,2,9,10)的数据,你不能简单地在 scikit 的机器学习中使用它们。至于其他类,这个问题太笼统了。你有没有尝试过什么?表现如何?您正在使用哪些算法?特征类型有哪些?
  • 您的样本总数是多少。例如,其中有多少是 0.74%?
  • 你的训练数据是什么?
  • 如果我是正确的,OP 只是想在值是完整集时预测 1、2、9、10 类中值的分布。我现在正在研究一种统计方法,只需几秒钟。

标签: python machine-learning scikit-learn dataset data-science


【解决方案1】:

预测数据值

研究数据集

我们首先研究数据集的形状,它可能会显示一些特定的分布:

import numpy as np
from matplotlib import pyplot as plt

data = np.array([(1, 0), (2, 0), (3, 0.74), (4, 3.90), (5, 42.5), (6, 39.40),
             (7, 12.29), (8, 1.25), (9, 0), (10, 0)])

x = data[:, 0]
y = data[:, 1] / 100 # We normalise the percentage points

plt.title("Wine ratings percentages")
plt.ylabel("Samples")
plt.xlabel("Ratings")
plt.plot(x, y, '.')
plt.plot(x, y)

结果在:

结果解读

正如从 1-10 评级数据集中可以预期的那样,数据的分布是 Binomial,一个离散的高斯分布。这称为Sampling distribution

预测值

现在我们对数据集的分布有了一个概念。我们现在必须预测每个类的值,假设它是真正的二项式。

二项分布有两个参数:元素的数量n,在这个场景中是 10,以及试验的概率,一次提取,通常称为 p。由于二项式的均值是np,我们可以很容易地得到p = mean/n

mean = np.mean(x)
p = mean/10

这两个值是 n=10p=mean/10=0.010008。我们可以使用这些作为参数来获得这些数据在完整集时所具有的分布。

from scipy.stats import binom

my_binom = binom(10, p)
x_b = np.arange(0, 10+1)
y_b = my_binom.pmf(x_b)

plt.plot(x_b, y_b, '.')
plt.plot(x_b, y_b)

预测值

采用这种方法,得到的值如下:

predictions = [(0, 0.0003405062891601558), (1, 0.004161743534179685),
           (2, 0.02288958943798826), (3, 0.07460310631640629),
           (4, 0.15956775517675784), (5, 0.2340327075925782),
           (6, 0.2383666466220704), (7, 0.1664782928789064),
           (8, 0.07630255090283203), (9, 0.020724149627929712),
           (10, 0.0025329516211914063)]

补充说明

您可以采用这种方法并进一步探索它,尝试确定更具体的分布,或者,如果您有更多与模型其他方面相关的数据,则应用 Bayes Theorem 以更好地拟合所需的预测。

【讨论】:

    【解决方案2】:

    正如 Vivek 在他的评论中提到的,您无法对没有数据的类做任何事情。就其余类而言,其中一些样本太少。您可以尝试类权重(可在 sklearn 中获得)或欠采样,但我怀疑它们是否能正常工作。

    花时间为这些类获取更多数据是个好主意。如果这是不可能的,可能有两个分类器:一个用于低数类,另一个用于其他类。您可以使用第三个分类器将给定实例拆分为这两个类中的任何一个(基本上是分层分类器)

    【讨论】:

    • 最初,我已将 10 点量表转换为 4 点量表以提高准确性。它并没有解决问题,它更像是一种权衡。
    猜你喜欢
    • 2023-03-12
    • 2017-03-26
    • 2020-01-11
    • 2017-09-19
    • 1970-01-01
    • 2018-03-02
    • 2017-11-19
    • 2016-09-19
    • 2017-01-05
    相关资源
    最近更新 更多