支持向量机 SVM

这篇博客介绍了如何使用LIBSVM库对UCI的Adult数据集进行处理和分类。数据经过特征转换,将连续和离散特征转化为适合SVM的格式。实验结果显示,使用SVM模型在处理后的数据上获得了约84.97%的分类准确率。
摘要由CSDN通过智能技术生成

支持向量机 SVM

目录

支持向量机 SVM

1 实验数据

2 LIBSVM  简介

3 LIBSVM  在当前实验数据的调用过程

4  实验效果分析


1 实验数据


本数据集来源于 UCI 的 Adult 数据集,并对其进行处理得到的。数据链接为:
http://archive.ics.uci.edu/ml/datasets/Adult。本实验使用 LIBSVM 包对该数据进行分类。
该数据的前 10 条数据为:
39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical,Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse,Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K
38, Private, 215646, HS-grad, 9, Divorced, Handlers-cleaners, Not-in-family,White, Male, 0, 0, 40, United-States, <=50K
53, Private, 234721, 11th, 7, Married-civ-spouse, Handlers-cleaners, Husband,Black, Male, 0, 0, 40, United-States, <=50K
28, Private, 338409, Bachelors, 13, Married-civ-spouse, Prof-specialty, Wife,Black, Female, 0, 0, 40, Cuba, <=50K
37, Private, 284582, Masters, 14, Married-civ-spouse, Exec-managerial, Wife,White, Female, 0, 0, 40, United-States, <=50K
49, Private, 160187, 9th, 5, Married-spouse-absent, Other-service,Not-in-family, Black, Female, 0, 0, 16, Jamaica, <=50K
52, Self-emp-not-inc, 209642, HS-grad, 9, Married-civ-spouse,Exec-managerial, Husband, White, Male, 0, 0, 45, United-States, >50K
31, Private, 45781, Masters, 14, Never-married, Prof-specialty, Not-in-family,White, Female, 14084, 0, 50, United-States, >50K
42, Private, 159449, Bachelors, 13, Married-civ-spouse, Exec-managerial,Husband, White, Male, 5178, 0, 40, United-States, >50K
原始的 Adult 数据集的每条数据有 14 个特征,分别为:age,workclass,fnlwgt(final weight),education,education-num,marital-status,occupation,relationship,race,sex,captital-gain,captital-loss,hours-per-week 和 native-country。其中有
6 个特征是连续值,包括 age,fnlwgt,education-num,captital-gain,captital-loss,hours-per-week;其他 8 个特征是离散值。本数据集首先要做的处理是:将连续特征离散化,将有 M 个类别的离散特征转换为 M 个二进制特征。
本数据集共有 48842 条数据,每条数据从原始特征的 14 个转换成 123 个,并以 2:1 的比例分为训练集和测试集。其中 a9a 是训练集,用来训练分类器模型;a9a-text 是测试集,用来预测模型的分类效果。它共有 2 个类别,标签分别用 1 和-1 表示,标签的含义是一个人一年的薪资是否超过 50K,1 表示超过 50K,-1 表示不超过 50K。
从原始数据做特征变换的数据可以从这里直接下载:
http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html#a9a,下面以此针对每个特征介绍转换方式:
(1)age 属性是连续的,本数据集将 age 属性扩展为 5 维,即第 1-5 维。采用 one-hot方式,具体划分标准如下:
①age<=25,此时数据的第一维为 1;
②26<=age<=32,此时数据的第二维为 1;
③33<=age<=40,此时数据的第三维 1;
④41<=age<=49,此时数据的第四维为 1;
⑤age>=50,此时数据的第五维为 1。
(2)workclass 属性是离散的,其取值有 Private,Self-emp-not-inc,Self-emp-inc,Federal-gov,Local-gov, State-gov, Without-pay, Never-worked,共 8 个取值。
因此,本数据集将 workclass 属性扩展为 8 位,即第 6-13 维。
(3) fnlwgt(final weight)属性为连续属性,本数据集将 fnlwgt 属性扩展为 5 位,即 14-18维。具体的划分原则如下:
①fnlwgt<=110000,此时数据的第 14 维为 1;
②110001<=fnlwgt<=159999,此时数据的第 15 维为 1;
③160000<=fnlwgt<=196335,此时数据的第 16 维为 1;
④196336<=fnlwgt<=259865,此时数据的第 17 维为 1;
⑤fnlwgt>=259866,此时数据的第 18 维为 1。
(4)education 属性为离散属性,其取值主要有 Bachelors,Some-college,11th,HS-grad,Prof-school,Assoc-acdm,Assoc-voc,9th,7th-8th,12th,Masters,1st-4th,10th,Doctorate,5th-6th,Preschool 共 16 个。因此,本数据集中 education占据了 16 维,即 19-34 维。
(5)education-num为连续属性。本数据集将此属性划分为 5 类,占据的维数是 35-39维。具体的划分原则如下:
① education 的值为11th,9th,7th-8th,12th,1st-4th,10th,5th-6th,Preschool时,数据的第 35 维为 1;
②education 的值为 HS-grad 时,数据的第 36 维为 1;
③education 的值为Some-college 时,数据的第 37 维为 1;
④education 的值为Assoc-acdm,Assoc-voc 时,数据的第 38 维为 1;
⑤education 的值为Bachelors,Prof-school,Masters,Doctorate 时,数据的第 39维为 1。
(6)marital-status 为离散属性,其取值有 Married-civ-spouse,Divorced,Never-married,Separated,Widowed,Married-spouse-absent,Married-AF-spouse共 7 个。因此,本数据集为它分配的维数为 40-46 维。
(7) occupation 属性为离散属性,其取值有 Tech-support,Craft-repair,Other-service,Sales,Exec-managerial,Prof-specialty,Handlers-cleaners,Machine-op-inspct,Adm-clerical,Farming-fishing,Transport-moving,Priv-house-serv,Protective-serv,Armed-Forces 共 14 个。因此本数据集为它分配的维数为 47-60 维。
(8) relationship 属性为离散属性,其取值有 Wife,Own-child,Husband,Not-in-family,Other-relative,Unmarrie 共 6 个。因此本数据集为它分配的维数为 61-66 维。
(9) race 属性为离散属性,其取值有 White,Asian-Pac-Islander,Amer-Indian-Eskimo,Other,Black 共 5 个。因此本数据集为它分配的维数为 67-71 维。
(10)sex 属性为离散属性,其取值有 Female,Male 共 2 个。因此本数据集为它分配的维数为 72-73 维。
(11)captital-gain 属性为连续属性,本数据集将此属性划分为 2 类,为它分配的维数为74-75。具体的划分原则如下:
①captital-gain=0 时,数据的第 74 维为 1;
②captital-gain≠0 时,数据的第 75 维为 1。
(12)captital-loss属性为连续属性,本数据集将此属性划分为 2 类,为它分配的维数为76-77。具体的划分原则如下:
①captital-loss=0 时,数据的第 76 维为 1;
②captital-loss≠0 时,数据的第 77 维为 1。
(13)hours-per-week 属性为连续属性,本数据集将此属性划分为 5 类,为它分配的维数为 78-82。具体的划分原则如下:
①hours-per-week <=34 时,数据的第 78 维为 1;
②35<=hours-per-week <=39 时,数据的第 79 维为 1;
③hours-per-week=40,数据的第 80 维为 1;
④41<=hours-per-week <=47,数据的第 81 维为 1;
⑤hours-per-week >=48,数据的第 82 维为 1。
(14)native-country属性为离散属性,其取值有 United-States,Cambodia,England,Puerto-Rico,Canada,Germany,Outlying-US(Guam-USVI-etc),India,Japan,Greece,South,China,Cuba,Iran,Honduras,Philippines,Italy,Poland,Jamaica,Vietnam,Mexico,Portugal,Ireland,France,Dominican-Republic,Laos,Ecuador,Taiwan,
Haiti,Columbia,Hungary,Guatemala,Nicaragua,Scotland,Thailand,Yugoslavia,El-Salvador,Trinadad&Tobago,Peru,Hong,Holand-Netherlands共 41 个。因此本数据集为它分配的维数为 83-123 维。
至此,数据集的转换完成。


2 LIBSVM  简介


LIBSVM 是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的 SVM 模式识别与回归的软件包,它是一个开源库,能够对 SVM 模型进行训练、给出预测,并利用数据集对预测结果进行测试。LIBSVM 还提供了针对径向基函数和许多其他类型的核函数的支持。
LIBSVM 的下载链接如下:
http://www.csie.ntu.edu.tw/~cjlin/libsvm/
本实验中所用的 LIBSVM 的版本为 3.22。

3 LIBSVM  在当前实验数据的调用过程

(1)确定本机的 python 版本
打开 IDLE(python GUI)或者 Python(command line),输入:

import sys
sys.version
① 如果你的 python 是 32 位的,将会出现如下字符:


即显示 python 版本号和位数。
② 如果你的 python 是 64 位的,将会出现如下字符:


(2)目前的最新版是 2015 年 12 月的 Version3.21,官网提供 zig 和 tar.gz 的压缩文件,
下载链接为:
http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/~cjlin/libsvm+zip 或者
http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/~cjlin/libsvm+tar.gz
若新版本存在兼容性等问题,也可以下载以前的版本:
http://www.csie.ntu.edu.tw/~cjlin/libsvm/oldfiles/,本示例使用的是 3.22 版。
(3)以 Windows 系统为例,将 zip 包下载并解压到方便的路径,如 C:\libsvm-3.22。
(4)调用 LIBSVM 来训练分类器模型
在 IDLE(python GUI)中输入:

import os

os.chdir('C;\llibsvm-3.22\python')

from svmutil import *

y,x=svm_read_problem('a9a.txt')

m=svm_train(y,x,'-c 5')


其中,svm_read_problem()函数读取 LIBSVM 格式的数据集。svm_train() 表示训练分类器模型,其中第一个参数和第二个参数表示训练集数据,第三个参数表示所使用的损失函数。
这里,libsvm 提供了参数选项,其官网的解释为:
-s svm_type : set type of SVM (default 0)
0 -- C-SVC
1 -- nu-SVC
2 -- one-class SVM
3 -- epsilon-SVR
4 -- nu-SVR
-t kernel_type : set type of kernel function (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates: whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight: set the parameter C of class i to weight*C, for C-SVC (default 1)
The k in the -g option means the number of attributes in the input data.
调用 LIBSVM 来测试分类器模型的好坏
在 IDLE(python GUI)中输入:

test_y,test_x=svm_read_problem('a9a.t')

p_labe,p_acc,p_val=svm_predict(test_y,test_x)


其中,svm_predict()函数表示用得到的分类模型来预测在测试集上的分类效果。

4  实验效果分析

由上面结果可知,利用 LIBSVM 和 a9a 的训练集训练得到的分类器模型在 a9a 的
测试集上的分类的准确率约为 84.97%。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值