在支持向量机中,
C
C
是负责惩罚错误分类数据的超参数。
解决数据类别不平衡的一个方法就是使用基于类别增加权重的CC值
Cj=C∗wj
C
j
=
C
∗
w
j
其中,
C
C
是误分类的惩罚项,wjwj是与类别
j
j
的出现频率成反比的权重参数,CjCj 就是类别
j
j
对应的 加权CC值
主要思路就是增大误分类 少数类别 带来的影响,保证 少数类别 的分类正确性,避免被多数类别掩盖
在scikit-learn 中,使用 svc 方法时,可以通过设置参数
class_weight=’balanced’
实现上述加权功能
参数‘balanced’ 会自动按照以下公式计算权值:
wj=nknj
w
j
=
n
k
n
j
其中,
wj
w
j
为类别
j
j
对应权值,nn 为数据总数,
k
k
为类别数量,即数据有kk 个种类,
nj
n
j
是类别
j
j
<script type="math/tex" id="MathJax-Element-17">j</script> 的数据个数
0.导入库
from sklearn.svm
import SVC
from sklearn
import datasets
from sklearn.preprocessing
import StandardScaler
import numpy
as np
1、加载Iris Flower 数据集
iris = datasets.load_iris()
X = iris.data[:
100,:]
y = iris.target[:
100]
2.不均衡化数据集
X = X[
40:,:]
y = y[
40:]
y = np.where((y ==
0),
0,
1)
y
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
可以看到,有60个数据,10个为类别0,50个为类别1
3.特征标准化
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
4.使用加权类别训练SVM分类器
svc = SVC(kernel=
'linear', class_weight=
'balanced', C=
1.0, random_state=
0)
model = svc.fit(X_std, y)
翻译自Chris Albon 博客 原文地址