我有以下不平衡数据集,其中包含1-10级的葡萄酒评分。班级余额如下:
评分/#个样本(%)
由于我无法获取更多数据,因此使用 Scikit-Learning 处理不平衡数据的最佳方法是什么?可以在这种情况下使用SMOTE吗?
谢谢!
答案 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)
结果位于:
从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)
通过这种方法,获得的值如下:
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以更好地拟合所需的预测。
答案 1 :(得分:1)
正如Vivek在他的评论中提到的那样,您不能对没有数据的类做任何事情。就其余类别而言,其中一些样本太少。您可以尝试使用权重(在sklearn中可用)或欠采样,但是我怀疑它们是否可以正常工作。
花费时间来获取这些类的更多数据是一个好主意。如果不可能,则可能有两个分类器:一个用于低数类,另一个用于其他类。您可以使用第三个分类器将给定的实例分为这两个类之一(基本上是分层分类器)