使用 Scikits 创建平衡数据集

数据挖掘 Python scikit-学习 阶级失衡
2022-02-14 03:48:01

我有一个经典User-Item dataset,其中每一行(即(user, item))表示用户单击/选择项目的操作。现在,数据集只提供正样本,并没有具体说明用户是否不喜欢某个项目。为了创建一个平衡的数据集,我想创建随机负样本(例如随机选择一组用户从未点击过的项目)。当然,我可以通过编写程序来实现;但是,我在 python Scikits 中发现了这个名为不平衡学习的库,它似乎提供了各种采样技术。有人可以提供一个可以使用这个库(或其他 python 库)来实现这一点的小代码片段吗?

2个回答

如果我理解正确,您想发明新的负样本来获得平衡的数据集,因为您当前的数据集只有正样本。

但是,您提到的库仅对所有类都存在的数据集进行重新采样。根据定义,样本创建过程是特定于数据的,因为可能存在不可能的属性组合等。

如果你想盲目地创建属性值的组合,你可以使用模块中的东西random

  • 要创建整数属性:
    def random_integer(min_val, max_val):
        返回 randint.randint(0, 9))
    
  • 要创建实值属性:
    def random_float(min_val, max_val):
        return random.uniform(min_val, max_val)
    
  • 要创建离散属性:
    def 随机离散(值列表):
        返回随机选择(值列表)
    

然后,通过循环,在循环中生成负样本:

    def generate_negative_sample():
        返回 {'attr1': random_discrete(['a', 'b', 'c']),
                'attr2': random_float(-10., 10.),
                'attr3': random_integer(0, 4)}

    random_samples = [generate_negative_sample() for _ in range(1000)]

简单版

# generate 2d classification dataset

X, y = make_blobs(n_samples=100, centers=3, n_features=2)

卫星分类问题(漩涡状数据)

# generate 2d classification dataset

X, y = make_moons(n_samples=100, noise=0.1)

make_circles 会生成一个二元分类问题,其中包含同心圆的数据集,而且还有一些数据集。 

参考

Scikit 文档

学习不平衡