本人也是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
部分思路参考: