数据挖掘实验:关于SVM的数据分类算法(Python实现)

目录

前言

一、思路

二、实现代码

1.安装sklearn库

2.引入库

3.具体代码

 三、实验结果

总结


前言

本文是有关SVM(支持向量机)的数据分类算法,使用python实现,基于sklearn库。


一、思路

支持向量机是一种二分类模型,它使用一个超平面分割数据,适用于高维数据的处理。

老师给的数据是690维的带标签的高维数据,标签为0和1,分别代表正负标签。首先需要处理一下数据集,将训练集、测试集的数据和标签分别存在列表中。然后导入sklearn库,调用其中svm函数,定义模型,训练、测试,计算一些反映结果的指标(recall、precision)。定义模型时有很多不同的参数,可以调整参数使其达到最佳效果。


二、实现代码

1.安装sklearn库

 pip install -U scikit-learn

2.引入库

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm

3.具体代码

def train():#训练数据集
    dataMat=[];labelMat=[]
    fr1=open("SVM实验数据/train_sample.txt")
    fr2=open("SVM实验数据/train_sample_label.txt")
    for line in fr1.readlines():
        currLineListFloat = []
        line = line.split(" ")
        line=line[0:-1]
        for i in line:  # 逐行将字符串数据转化为浮点数
            currLineListFloat.append(float(i))
        dataMat.append(currLineListFloat)#数组矩阵
    for line in fr2.readlines():
        line=line.strip("\n")
        for i in line:  # 逐行将字符串数据转化为浮点数
            labelMat.append(float(i))
    return dataMat,labelMat


def test():#测试数据集
    dataMat=[];labelMat=[]
    fr1=open("SVM实验数据/test_sample.txt")
    fr2=open("SVM实验数据/test_sample_label.txt")
    for line in fr1.readlines():
        currLineListFloat = []
        line = line.split(" ")
        line=line[0:-1]
        for i in line:  # 逐行将字符串数据转化为浮点数
            currLineListFloat.append(float(i))
        dataMat.append(currLineListFloat)#数组矩阵
    for line in fr2.readlines():
        line=line.strip("\n")
        for i in line:  # 逐行将字符串数据转化为浮点数
            labelMat.append(float(i))
    return dataMat,labelMat


import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='poly',degree=4)
'''gamma:内核系数
c:错误项的惩罚参数
kernel:核函数

degree:多项式poly函数的阶数
'''
# 训练
x_train,y_train=train()
predictor.fit(x_train, y_train)
# 预测
x_test,y_test=test()
result = predictor.predict(x_test)
# 评估
tp=0
fp=0
p=0
for i in range(0,len(y_test)):
    if y_test[i]==1:
        p=p+1
        if result[i]==1:
            tp=tp+1
    elif result[i]==1:
            fp=fp+1

print("recall:",100*tp/p,"%")
print("precision:",100*tp/(tp+fp),"%")

 三、实验结果

本实验最终输出的结果只有recall和precision的值,下图为调整不同的参数,本次实验主要调整了c的值、核函数kernel、gamma的值、degree的值,就不一一展示。

predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='poly',degree=4)
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='linear')
​predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='poly',degree=4)

输出(例):

结果分析:

c是错误项的惩罚系数。c的值越大,查全率越大。根据查找的资料,c的值越大,在训练集中的准确率越高,泛化能力降低,也就是对测试数据的分类准确率降低。

Kernel是算法中采用的核函数类型。实验中,核函数分别采用了‘rbf’:径像核函数/高斯核、‘linear’:线性核函数、‘poly’:多项式核函数,得到了不同的查全率。其中,使用‘poly’的查全率最高。

当gamma的值为‘auto’时,tp和fp的值都为0,即所有的预测结果都是0(负样本)。

degree是指多项式核函数的阶数n,只对多项式核函数有用,默认值为3。阶数变大时,查全率也变大。


总结

本实验中,代码并不难,调用svm函数后,实验就变得比较简单。对于本实验中的代码,可以多思考搭建模型时的参数设置,分析各个参数的含义,也可调整参数值探究其对分类结果的影响等等。

  • 10
    点赞
  • 206
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值