本文利用 SVM 对 UCI 的 IRIS 数据进行了分类预测。
参考博客链接:点击关上链接
试验环境是 Pycharm python3。
试验中呈现的调试问题见最初。
1. 获取数据
首先是数据集,采纳 UCI 的鸢尾花数据集,网址链接:点击关上链接。
![图片]()
编辑
咱们点击 Data Folder,显示如下
![图片]()
编辑
这个 iris.data 就是咱们须要的数据了。点击进去,会在网页中显示数据。数据长这个样子。
![图片]()
编辑
咱们将数据复制下来,保留成一个 txt 文件。
2. 编写代码
在有了数据之后咱们就能够开始咱们的 svm 实现了。
首先咱们建一个 py 文件, 在文件的开始导入咱们接下了要用的包;
from sklearn import svm # svm 函数须要的
import numpy as np # numpy 科学计算库
from sklearn import model_selection
import matplotlib.pyplot as plt # 画图的库
复制代码
再导入数据之前咱们须要先察看数据,对数据做一个解决;
数据每一行一个鸢尾花的察看后果,前四个数据代表鸢尾花的生物属性比方大小等,具体的含意能够查看 UCI 的官方网站的解释。最初一个数据是鸢尾花的类别,共三类。次要是对最初这个类别进行解决。
咱们定义一个函数, 将不同类别与数字绝对应。
def iris_type(s):
it = {b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
return it[s]
复制代码
当初咱们能够导入数据了。
path =’C:/Users/Yesterday/Desktop/irisdata.txt’ # 之前保留的文件门路
data = np.loadtxt(path, # 门路
dtype=float, # 数据类型
delimiter=',', # 数据以什么宰割符号宰割数据
converters={4: iris_type}) # 对某一列数据(第四列)进行某种类型的转换()
复制代码
这时的数据长这样:
![图片]()
编辑
咱们将原始数据分成训练集和测试集:
X, y = np.split(data, (4,), axis=1)
x = X[:, 0:2]
x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, random_state=1, test_size=0.3)
复制代码
np.split 依照列(axis=1) 进行宰割,从第四列开始往后的作 y 数据,之前作为 X 数据。
在 X 中咱们取前两列作为特色(为了前面的可视化)。
用 train_test_split 将数据分为训练集和测试集,测试集占总数据的 30%(test_size=0.3),random_state 是随机数种子(随机数种子:其实就是该组随机数的编号,在须要反复试验的时候,保障失去一组一样的随机数。比方你每次都填 1,其余参数一样的状况下你失去的随机数组是一样的。但填 0 或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系听从以下两个规定:种子不同,产生不同的随机数;种子雷同,即便实例不同也产生雷同的随机数。)
接下来是搭建模型
clf = svm.SVC(kernel=’rbf’, # 核函数
gamma=0.1,
decision_function_shape='ovo', # one vs one 分类问题
C=0.8)
clf.fit(x_train, y_train) # 训练
复制代码
print(clf.score(x_train, y_train)) # 输入训练集的准确率
复制代码
因为准确率体现不直观,咱们能够通过其余形式察看后果。
首先咱们将原始后果与训练集预测后果进行比照。
y_train_hat=clf.predict(x_train)
y_train_1d=y_train.reshape((-1))
comp=zip(y_train_1d,y_train_hat)
print(list(comp))
复制代码
用 zip 把原始后果和预测后果放在一起。显示如下:
![图片]()
编辑
同样的咱们能够用训练好的模型对测试集的数据进行预测的。
print(clf.score(x_test,y_test))
y_test_hat=clf.predict(x_test)
y_test_1d=y_test.reshape((-1))
comp=zip(y_test_1d,y_test_hat)
print(list(comp))
复制代码
还能够通过图像进行可视化
plt.figure()
plt.subplot(121)
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train.reshape((-1)), edgecolors=’k’,s=50)
plt.subplot(122)
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train_hat.reshape((-1)), edgecolors=’k’,s=50)
plt.show()
复制代码
plt.figure() 用于画图,plt.subplot()用于在一个图形窗口中画多副图(121,12 示意子图的要按一行两列排列,最初的 1 示意这是第一幅子图)。plt.scatter()用于画散点图(参数 c 示意要依照 y_train 中的类别对散点进行上色,edgecolor 示意散点的边的色彩,可省略,s 示意散点的大小,可省略)
后果如图:
![图片]()
编辑
左图为训练数据,右图为对训练数据的预测。
本文中的参数并不是最合适的,如果想要好的后果须要进行参数的调整,同时选取的用于训练的参数也能够减少到四个(本文用了前两个)。最合适的参数大家本人挖掘吧。
3. 常见调试问题
试验中可能呈现的调试问题:
1. 在 path 报错,呈现的报错信息为 ”\u202A”,这个因为粘贴复制时复制了特殊字符。解决方案:手动输出 path 门路。
2. 在 loadtxt 报错,提醒 converters 转换谬误(KeyError: b’Iris-setosa’)。本文的代码是正确的不须要批改。然而如果是依照本文提到的参考博客所示,则会呈现报错。解决方案:将 iris_type 函数中字典的 key 值后面都想加上小写字母 b(由 ’Iris-setosa’ 变为 b ’Iris-setosa’)
3. 报错:DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().y = column_or_1d(y, warn=True)。当呈现这个 warning 不影响程序失常运行可不批改。如果想去掉这个 warning 能够通过 reshape 函数将 y 的 shape 扭转。解决办法:y=y.reshape((-1))。- 1 示意主动适应 y 的长度把 y 变成一维的 list。作者:YesterdayxD 链接:https://juejin.cn/post/714306… 起源:稀土掘金著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。