鸢尾花lris数据集的SVM线性分类

Anconda初步使用–鸢尾花lris数据集的SVM线性分类

壹. Python3.7、Anaconda、jupyter、spyder的下载与安装。

(1). 下载
一般只需要下载Anconda就行,它会自带一个默认的python/jupyter/spyder软件,如果没有后面连个软件可以安装Anconda之后再另行安装,建议国内镜像源下载。
本人的百度网盘资源
提取码:c2cs
(2). 安装
双击安装文件即可安装。
在这里插入图片描述
安装完成后
在这里插入图片描述

贰. 创建虚拟环境exam1,并在虚拟环境下安装numpy、pandas、sklearn包。

  1. 开始–>打开 Aconda Navigator。
    在这里插入图片描述

  2. 创建环境(也可以使用命令 conda create -n exam1 python=3.7
    在这里插入图片描述
    3. 安装需要的包,这里由于网络环境的原因经常会下载失败,建议使用国内镜像源。开始–>进入命令行窗口
    在这里插入图片描述
    4. 使用命令conda info -econda env list查看当前已有的aconada环境
    在这里插入图片描述

    1. 使用命令conda activate exam1切换环境,conda list列出已安装的包
      在这里插入图片描述
  3. 使用命令conda install -n exam1 pandas;conda install -n exam1 numpy;pip install sklearn -i "https://pypi.doubanio.com/simple";pip install matplotlib -i "https://pypi.douban.com/simple".
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

叁.对鸢尾花数据集的SVM线性分类

SVM介绍
SVM是一个二类分类器,它的目标是找到一个超平面,使用两类数据离超平面越远越好,从而对新的数据分类更准确,即使分类器更加健壮。

使用环境:jupyter notebook

  1. 原始数据的制作
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

iris = datasets.load_iris()
X = iris.data
y = iris.target

X = X [y<2,:2] # 只取y<2的类别,也就是0 1 并且只取前两个特征
y = y[y<2] # 只取y<2的类别

# 分别画出类别 0 和 1 的点
plt.scatter(X[y==0,0],X[y==0,1],color='red')
plt.scatter(X[y==1,0],X[y==1,1],color='blue')
plt.show()

运行结果——未经标准化的原始数据点分布:
在这里插入图片描述
2.训练模型

# 标准化
standardScaler = StandardScaler()
standardScaler.fit(X)

# 计算训练数据的均值和方差
X_standard = standardScaler.transform(X) # 再用 scaler 中的均值和方差来转换 X ,使 X 标准化
svc = LinearSVC(C=1e9) # 线性 SVM 分类器
svc.fit(X_standard,y) # 训练svm

结果
在这里插入图片描述
3.训练好之后,绘制决策边界:代码中再导入一个ListedColormap包

from matplotlib.colors import ListedColormap # 导入 ListedColormap 包


def plot_decision_boundary(model, axis): 
	x0, x1 = np.meshgrid( np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
                         np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
                        )    
	X_new = np.c_[x0.ravel(), x1.ravel()] 
	y_predict = model.predict(X_new) 
	zz = y_predict.reshape(x0.shape) 
	custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9']) 
	plt.contourf(x0, x1, zz, cmap=custom_cmap) #绘制决策边界     
    
plot_decision_boundary(svc,axis=[-3,3,-3,3]) # x,y轴都在-3到3之间 
# 绘制原始数据
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='red') 
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='blue') 
plt.show()

运行结果:
在这里插入图片描述
4. CC是控制正则项的重要程度,这里我们在实例化一个svc,并传入较小的CC。

svc2 = LinearSVC(C=0.01)
svc2.fit(X_standard,y)
plot_decision_boundary(svc2,axis=[-3,3,-3,3]) # x,y轴都在-3到3之间
# 绘制原始数据
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='red')
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='blue')
plt.show()

运行结果:
在这里插入图片描述
可以很明显的看到和第一个决策边界的不同,在这个决策边界汇总,有一个红点时分类错误的。CC越小容错空间越大。可以通过svc.coef_来获取学习到的权重系数,svc.intercept_获取偏差。

使用多项式特征和核函数

  1. 处理非线性数据。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

X, y = datasets.make_moons() #使用生成的数据
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

结果:
在这里插入图片描述
2.增加噪声点

X,y = datasets.make_moons(noise=0.15,random_state=777)
#随机生成噪声点,random_state是随机种子,noise是方差 
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

结果
在这里插入图片描述
3. 通过多项式特征的SVM来对它进行分类

from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline

def PolynomialSVC(degree,C=1.0):
    return Pipeline([ ("poly",PolynomialFeatures(degree=degree)),#生成多项式
                     ("std_scaler",StandardScaler()),#标准化
                     ("linearSVC",LinearSVC(C=C))#最后生成svm
                    ])
poly_svc = PolynomialSVC(degree=3)
poly_svc.fit(X,y)
plot_decision_boundary(poly_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

运行结果:
在这里插入图片描述
使用核技巧对数据进行处理,使其维度提升,使原本线性不可分的数据,在高维空间变成线性可分的。再用线性SVM来进行处理。

from sklearn.svm import SVC

def PolynomialKernelSVC(degree,C=1.0):
    return Pipeline([ ("std_scaler",StandardScaler()),
                     ("kernelSVC",SVC(kernel="poly")) # poly代表多项式特征
                    ])
poly_kernel_svc = PolynomialKernelSVC(degree=3)
poly_kernel_svc.fit(X,y)
plot_decision_boundary(poly_kernel_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

运行结果:
在这里插入图片描述
可以看到这种方式也生成了一个非线性的边界。这里的SVC(kernel=“poly”)有个参数是kernel,就是核函数。

参考文档
Anconda的介绍以及安装教程
Anconda命令行的使用
支持向量机趣味讲解
鸢尾花

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值