SVM鸢尾花分类

最近学习了SVM支持向量机模型,并用uci上的数据集做了简单的鸢尾花分类。

svm数学原理在这里插入图片描述
在这里插入图片描述
代码

from sklearn import svm
import numpy as np
from sklearn import model_selection
import matplotlib.pyplot as plt

#导入数据集
path = "/Users/lkr/Documents/deep_learning/SVM/iris.data" #文件路径

#因为数据集最后一列是花的种类,要将string类型转换成float类型,定义一个转换函数,每个花的种类是一个数字分别是0,1,2
def iris_type(s):
    it = {b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
    return it[s]

#转换数据 (路径, 数据类型float, 以逗号分割, 将最后一列数据用上述函数进行转换)
data = np.loadtxt(path, dtype=float, delimiter=",", converters={4: iris_type})

#老规矩将数据分为训练集和测试集
X, y = np.split(data, (4,), axis=1) #第五列为y,之前是X
y=y.reshape((-1)) #将y变成一维list,否则会报warning
x = X[:, 0:2] #x数据是将X再次划分,0,1 这两列为x特征
# 30%作为测试集, 随机种子数设为1
x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, random_state=1, test_size=0.3)


#上面将数据集处理好后,下面进行模型搭建

#核函数
"""
其中kernel表示用什么核函数,这里用最常用的rbf
gamma是核函数rbf的参数,设置为0.1
decision_function_shape是选择one vs one,属于svm多分类问题中的一对一分类
C是C-SVM惩罚参数C
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,
这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
"""
clf = svm.SVC(kernel='rbf', gamma=0.1, decision_function_shape='ovo', C=0.8)

#训练
clf.fit(x_train, y_train)
#打印训练的准确率
print(clf.score(x_train, y_train))

#打印测试的准确率
print(clf.score(x_test, y_test))

#将原始结果和预测结果放在一起对比,更加直观反映
y_train_hat=clf.predict(x_train) #y预测结果
y_train_1d=y_train.reshape((-1)) #数据集中y的原本结果
comp=zip(y_train_1d,y_train_hat) #二者放一起
print(list(comp))

#可视化
#参数c表示要按照y_train中的类别对散点进行上色,edgecolor表示散点的边的颜色,s表示散点的大小
plt.figure(dpi=80, figsize=(15,8))

plt.subplot(121)
plt.title('Training data', fontsize=20)
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train.reshape((-1)), edgecolors='k',s=50)
plt.xlabel('sepal length', fontsize = 14)
plt.ylabel('sepal width', fontsize = 14)

plt.subplot(122)
plt.title('Training data prediction', fontsize=20)
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train_hat.reshape((-1)), edgecolors='k',s=50)
plt.xlabel('Calyx length', fontsize = 14)
plt.ylabel('Calyx width', fontsize = 14)
plt.show()

源码和文件下载地址
https://github.com/kr-li/SVM

  • 2
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
SVM(支持向量机)是一种常用的机器学习算法,常用于分类问题。尾花分类是一个经典的机器学习问题,旨在根据尾花的四个特征(萼片长度、萼片宽度、花瓣长度和花瓣宽度)来预测尾花的种类。 SVM尾花分类通常在Python环境中实现。可以使用scikit-learn库来实现该机器学习模型。首先,导入必要的库和数据集,然后加载尾花数据集。接下来,将数据集分为训练集和测试集,以便评估模型的性能。 在数据预处理阶段中,通常对特征进行标准化处理,使得特征的均值为0,标准差为1。这样可以更好地让模型适应不同尺度的特征。 接下来,使用SVM分类器来训练模型。为了找到最佳的分类超平面,SVM使用支持向量。支持向量是离分类超平面最近的样本点,在训练阶段通过特征进行选择。 训练完模型后,可以使用测试集来评估模型的性能。常用的评估指标包括准确率、精确率、召回率和F1得分。通过这些指标,我们可以判断模型的分类性能如何。 最后,可以使用训练好的模型对新的未知尾花进行分类预测。通过提供尾花的特征值,模型可以预测其所属的种类。 综上所述,SVM尾花分类问题中是一种有效的机器学习模型。它在Python环境下很容易实现,通过训练和测试阶段可以评估模型性能。通过预测未知尾花的种类,SVM在实际应用中具有较高的可行性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值