具有不平衡数据集的机器学习

时间:2018-07-06 06:00:19

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

我有以下不平衡数据集,其中包含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吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

预测数据值

研究数据集

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

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)

结果位于:

Wine ratings percentages

结果解释

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

预测值

现在,我们对数据集的分布有了一个想法。现在,我们必须预测每个类的值,并假设它确实是二项式。

二项式分布具有两个参数:元素 n 的数量(在这种情况下为10)以及试验的概率(通常称为 p )。由于二项式的均值为 np ,因此我们可以轻松获得 p =均值/ n

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

两个值分别是 n = 10 p = 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)

Binomial distribution

预测值

通过这种方法,获得的值如下:

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)]

Prediction table

更多笔记

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

答案 1 :(得分:1)

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

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