文章目录
前言
在分类问题中永远存在一个问题:样本不均衡
比如我们的一个二分类数据集,其中1占比3%,0占比97%。这就是一个典型的样本不均衡数据集。但是我们的需求往往都是捕捉到这少数的样本,也就是将少数类尽量多的判断正确。
但是我们的模型默认时样本均衡的,这样就会带来一些问题
首先,模型分类时会更加的倾向于多数类,让多数类更加容易被判对,会牺牲掉少数类来保证多数类的判别效果。 但是这样的模型显然不是我们需要的
其次,模型的评估指标会失去意义,因为即使我们什么都不做,只是将所有的样本都判别为0,那样的准确率也是达到了97%,显然这样是没有意义的
本文中使用的第三方库
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
样本不均衡的解决办法
- 上采样或下采样:缺点增加大量的样本数量,这对SVC这种耗时的模型非常的不友好
- 采用模型自身的样本均衡参数:SVC实例化时的参数class_weight,或者模型训练fit时的参数sample_weight。
需要注意的时:class_weight是一个字典的形式 {标签 : 权重}。一般来说少数类占有较高的权重。sample_weight需要和标签有一样的shape。每一个标签对应一个权重。
实例
创建数据集,包含550个样本,0类500个,1类100个
# 创建一个样本不均衡的数据集
X, y = make_blobs(n_samples=[500, 50],
n_features=2,
cluster_std=3,
random_state=3)
plt.scatter(X