sklearn库svm法可视化(iris数据集)

本人也是SVM初学者,菜鸡一个,摸索了好久SVM二维(特征)分类预测边界的可视化。

对于三维的可视化,其实也能实现,等有空再进行总结!

学的东西取之于CSDN,那就回馈于CSDN。

当然,转载请注明出处,谢谢!!!

----------------------------------------------------分割线----------------------------------------------------------------

# 使用sklearn中的svm函数进行训练,另外其本身就是基于libsvm编写的。
import scipy.spatial
import pandas as pd
from sklearn import datasets
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn import preprocessing

#数据的标签列使str,为了统一数据类型,我们可以将其转换为float格式 注意标签前面加上“b”
def iris_type(s):
    it = {b"setosa":0,b"versicolor":1,b"virginica":2}
    return it[s]
#设置数据txt路径,并利用loadtxt函数进行导入
path = "G:\数据\iris_.txt"
data = np.loadtxt(path,dtype=float,delimiter=",",converters={4:iris_type})
# print(data)
# 划分数据,其中的4指的是标签列
X,y = np.split(data,(4,),axis=1) #X指具体的数据,y指labels
X = X[:,:2] #因为,可视化只能做出二维的,所以需要指定较为重要的前两项特征,可以参考主成分分析等。
#作图 根据类别指定颜色

# print(y)
# print(X[np.where(y==1)[0],0])
# 这里同样是为了显示图例,采用三行代码替代下面的两行代码。摸索了一晚上,哈哈哈哈
# cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
# plt.scatter(X[:,0],X[:,1],c=y,cmap=cm_dark)
# 需要注意一点是,我们在np.where()的后面添加了一个[0],目的是
plt.scatter(X[np.where(y==0)[0],0],X[np.where(y==0)[0],1],c="g",label="setosa")
plt.scatter(X[np.where(y==1)[0],0],X[np.where(y==1)[0],1],c="r",label="versicolor")
plt.scatter(X[np.where(y==2)[0],0],X[np.where(y==2)[0],1],c="b",label="virginica")


plt.legend()
plt.title('the relationship between sepal and target classes')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.show()
# print(X)
#进行数据的缩放,可以根据情况使用
# x = preprocessing.MaxAbsScaler().fit(X)
# X = x.transform(X)
# print(X)
#进行数据集训练集及测试集的划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,random_state=1)
#训练svm分类器,此时可以根据libsvm测得的C和gamma
clf = svm.SVC(C=2048,kernel='rbf',decision_function_shape='ovo',gamma=0.0078125)
clf.fit(X_train, y_train.ravel())

# 显示测试的精度
print (clf.score(X_train, y_train))  # 精度

print (clf.score(X_test, y_test))

#
# 绘制图像
# to create the grid , so that we can plot the images on it
x_min, x_max = X_train[:, 0].min() - 1 , X_train[:, 0].max() + 1
y_min, y_max = X_train[:, 1].min() - 1 , X_train[:, 1].max() + 1
xx, yy = np.mgrid[x_min:x_max:200j,y_min:y_max:200j]  #这是一个好的方法,用mgrid,处理数据大的情况更快
grid_test = np.stack((xx.flat, yy.flat), axis=1)
# 指定字体
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 绘图
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
grid_hat = clf.predict(grid_test).reshape(xx.shape)
plt.pcolormesh(xx, yy, grid_hat, cmap=cm_light)

# plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', s=50, cmap=cm_dark)  # 样本
# plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test,s=80,edgecolors='k', cmap=cm_dark,marker="*")  # 圈中测试集样本
#这里为了有图例显示,摒弃了上面两行代码
plt.scatter(X[np.where(y==0)[0],0],X[np.where(y==0)[0],1],c="g",label="setosa")
plt.scatter(X[np.where(y==1)[0],0],X[np.where(y==1)[0],1],c="r",label="versicolor")
plt.scatter(X[np.where(y==2)[0],0],X[np.where(y==2)[0],1],c="b",label="virginica")

plt.scatter(X_test[np.where(y_test==0)[0],0],X_test[np.where(y_test==0)[0],1],c="g",s=80,edgecolors='k',label="setosa_test",marker="*")
plt.scatter(X_test[np.where(y_test==1)[0],0],X_test[np.where(y_test==1)[0],1],c="r",s=80,edgecolors='k',label="versicolor_test",marker="*")
plt.scatter(X_test[np.where(y_test==2)[0],0],X_test[np.where(y_test==2)[0],1],c="b",s=80,edgecolors='k',label="virginica_test",marker="*")
plt.xlabel(u'花萼长度', fontsize=13)
plt.ylabel(u'花萼宽度', fontsize=13)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.title(u'鸢尾花SVM二特征分类', fontsize=15)
plt.legend()
plt.show()

结果呈现:

可视化结果:

 

 

iris数据集:

链接:https://pan.baidu.com/s/1yFC7h5s5KbwgeqY_7iIJFA 
提取码:yaya 
 

部分思路参考:

https://towardsdatascience.com/support-vector-machines-svm-clearly-explained-a-python-tutorial-for-classification-problems-29c539f3ad8icon-default.png?t=M276https://towardsdatascience.com/support-vector-machines-svm-clearly-explained-a-python-tutorial-for-classification-problems-29c539f3ad8

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值