写在前面——虽然本人一直对机器学习感兴趣,但是一直没有动手实践,每次都是看一点入门就放弃了。现在因为课题需要,刚好可以边实践边学习。前面写了一个基于R语言的SVM练习,后来发现还是python好用啊。网上关于鸢(yuan)尾花的各种机器学习例子很多,但大部分都是浅浅一层。我最近在学习超参数优化跟交叉验证,所以就把它们揉在了一起。如有错误,还望大家批评指正。
数据来源:Iris数据集,下载地址为:http://archive.ics.uci.edu/ml/datasets/Iris,
Iris.data中有5个属性,包括4个预测属性(萼片长度、萼片宽度、花瓣长度、花瓣宽度)和1个类别属性(Iris-setosa、Iris-versicolor、Iris-virginica三种类别)。
1. 最普通的SVM
这里没什么要说的,网上一大堆。放两个给大家参考一下。
https://www.cnblogs.com/luyaoblog/p/6775342.html
https://blog.csdn.net/qq_45769063/article/details/106628800
from sklearn import svm
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.utils import shuffle
from sklearn.model_selection import RepeatedKFold
# 将label与数字对应,简化数据集
def Iris_label(s):
it = {
b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
return it[s]
# 载入数据
path = 'iris.data'
data = np.loadtxt(path, dtype=float, delimiter=',', converters={
4: Iris_label})
# print(data.shape) output:(150, 5)
# print(data.dtype) output:float64
# 在第4列之后进行切割,切割成2份
# axis=1表示竖着切
x, y = np.split(data, indices_or_sections=(4,), axis=1)
x = x[:, 0:2]
# 打乱数据集,使结果更加准确
x, y = shuffle(x, y, random_state=123)
# print(x, y)
# 划分训练集与测试集
# random_state相当于随机数种子,方便复现结果
train_data, test_data, train_label, test_label = train_test_split(x, y, random_state=1, train_size=0.7, test_size=0.3)
# 训练
classifier = svm.SVC(C=1, kernel='rbf', gamma=10)
classifier.fit(train_data, train_label.ravel())
# ravel()把标签集转换为list
# print(train_label.shape) output:(105, 1)
# print(train_label.ravel().shape) output:(105,)
# 计算准确率
print("train:", classifier.score(train_data, train_label)