如何用sklearn的make_blobs生成400:50分布的不平衡样本数据?
生成不平衡样本的解决方案
嗨,这问题很好解决!make_blobs其实支持直接指定每个类别的样本数量,不用自己手动拆分数据。你只需要把n_samples参数从整数改成一个列表,列表里的每个元素对应每个中心的样本数就行。
具体代码修改
原来的代码是:
from sklearn.datasets.samples_generator import make_blobs X, y = make_blobs(n_samples=450, centers=2, cluster_std=[10.0, 2], random_state=22, n_features=2)
现在改成这样,就能生成400个第一类样本(对应FeatureA)和50个第二类样本(对应FeatureB):
from sklearn.datasets.samples_generator import make_blobs # 用列表指定每个类别的样本数:[第一类数量, 第二类数量] X, y = make_blobs(n_samples=[400, 50], centers=2, cluster_std=[10.0, 2], random_state=22, n_features=2)
验证样本数量是否正确
你可以加一行代码确认类别分布:
import numpy as np print(np.bincount(y)) # 输出应该是 [400 50]
原理说明
当n_samples是整数时,make_blobs会把总样本数均匀分配给每个centers;而当你传入一个和centers数量一致的列表时,它会严格按照列表里的数值为每个中心生成对应数量的样本,完美满足你要的不平衡特征需求。
另外提一句:如果你的scikit-learn版本比较新,samples_generator模块已经被整合到sklearn.datasets里了,所以导入语句可以改成:
from sklearn.datasets import make_blobs
两种导入方式都能工作,看你用的版本就行。
内容的提问来源于stack exchange,提问作者Ashish Agarwal
相关产品推荐
相关产品推荐

