SVM:处理样本不平衡问题
对于软间隔数据来说,需要松弛系数和松弛系数的参数c来平衡“最大边际”与”被分错样本数量“的平衡
硬间隔:决策边界由两个标签不一致的支持向量来决定和最小化损失函数(最大化决策边际)
软间隔 : 软间隔的支持向量可以分布在任意位置
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import svm
from sklearn.datasets import make_circles, make_moons, make_blobs,make_classification
n_samples = 100
datasets = [
make_moons(n_samples=n_samples, noise=0.2, random_state=0),
make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1),
make_blobs(n_samples=n_samples, centers=2, random_state=5),
make_classification(n_samples=n_samples,n_features = 2,n_informative=2,n_redundant=0, random_state=5)
]
Kernel = ["linear"]
#四个数据集分别是什么样子呢?
for X,Y in datasets:
plt.figure(figsize=(5,4))
plt.scatter(X[:,0],X[:,1],c=Y,s=50,cmap="rainbow")
nrows=len(datasets)
ncols=len(Kernel) + 1
fig, axes = plt.subplots(nrows, ncols,figsize=(10,16))
#第一层循环:在不同的数据集中循环
for ds_cnt, (X,Y) in enumerate(datasets):
#在图像中的第一列,放置原数据的分布
ax = axes[ds_cnt, 0]
if ds_cnt == 0:
ax.set_title("Input data")
ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.cm.Paired,edgecolors='k')
ax.set_xticks(())
ax.set_yticks(())
#第二层循环:在不同的核函数中循环
#从图像的第二列开始,一个个填充分类结果
for est_idx, kernel in enumerate(Kernel):
#定义子图位置
ax = axes[ds_cnt, est_idx + 1]
#建模
clf = svm.SVC(kernel=kernel, gamma=2).fit(X, Y)
score = clf.score(X, Y)
#绘制图像本身分布的散点图
ax.scatter(X[:, 0], X[:, 1], c=Y
,zorder=10
,cmap=plt.cm.Paired,edgecolors='k')
#绘制支持向量
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100,
facecolors='none', zorder=10, edgecolors='white')
#绘制决策边界
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
#np.mgrid,合并了我们之前使用的np.linspace和np.meshgrid的用法
#一次性使用最大值和最小值来生成网格
#表示为[起始值:结束值:步长]
#如果步长是复数,则其整数部分就是起始值和结束值之间创建的点的数量,并且结束值被包含在内
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
#np.c_,类似于np.vstack的功能
Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()]).reshape(XX.shape)
#填充等高线不同区域的颜色
ax.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
#绘制等高线
ax.contour(XX, YY, Z, colors=['k', 'k', 'k'], linestyles=['--', '-', '--'],
levels=[-1, 0, 1])
#设定坐标轴为不显示
ax.set_xticks(())
ax.set_yticks(())
#将标题放在第一行的顶上
if ds_cnt == 0:
ax.set_title(kernel)
#为每张图添加分类的分数
ax.text(0.95, 0.06, ('%.2f' % score).lstrip('0')
, size=15
, bbox=dict(boxstyle='round', alpha=0.8, facecolor='white')
#为分数添加一个白色的格子作为底色
, transform=ax.transAxes #确定文字所对应的坐标轴,就是ax子图的坐标轴本身
, horizontalalignment='right' #位于坐标轴的什么方向
)
plt.tight_layout()
plt.show()
# 决策边界上的支持向量对应的是平衡最优解对应的支持向量
# 所有的支持向量决定决策边界的位置
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCxIY5UM-1664858958229)(output_0_0.png)]](https://i-blog.csdnimg.cn/blog_migrate/77074573023f1e05e507247a9b6813bd.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0e9ANlrx-1664858958230)(output_0_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/424a08ddfc2818c7b2d4628afed01074.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKF1hd0Y-1664858958231)(output_0_2.png)]](https://i-blog.csdnimg.cn/blog_migrate/120d8e981e1ca713a540a613d3f23b02.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfqjVeb8-1664858958231)(output_0_3.png)]](https://i-blog.csdnimg.cn/blog_migrate/1f92d3c55bb6adc810392df5726a0c3b.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cuy1nxif-1664858958231)(output_0_4.png)]](https://i-blog.csdnimg.cn/blog_migrate/3774a8488395fd282b8328022ce052ba.png)
1.通过参数class_weight来处理样本不均衡问题
导入需要的库和模块
# 解决样本不均衡问题,svm中使用class_weight,sample_weight
# class_weight ,提升少数类权重使得算法意识到样本是不平衡的
# samplee_weight,对样本的加权重,使决策边界的变形非常明显
# 但是SVM中分类判断依据决策边界决定,决策边界又由参数c来决定,所以解决样本不均衡问题由参数c实现
import numpy as np
import m

本文介绍如何使用SVM处理样本不平衡问题,包括通过调整class_weight参数、利用混淆矩阵评估模型性能的方法。此外,还详细讲解了如何绘制ROC曲线以评估分类器性能,并寻找最佳阈值。
最低0.47元/天 解锁文章
6524

被折叠的 条评论
为什么被折叠?



