支持向量机(SVM): 从理论到实践的指南(2)

葡萄酒数据集经常被用于机器学习、模式识别和统计分类算法的测试中。由于其特征维度较高,非常适合于验证特征选择和降维方法,例如主成分分析(PCA)或线性判别分析(LDA)的效果。同时,由于数据集包含多个分类,它也经常被用作分类算法(如决策树、随机森林、支持向量机等)的标准测试集。

前篇我们讲述了用SVM做鸢尾花二分类识别器,本篇我们用前篇相似的代码,更换一个维度更高的数据进行测试。
葡萄酒分类:葡萄酒数据集是另一个分类问题,但特征数量增至13个。任务是根据化学组份将葡萄酒分为两个不同的类别。

数据示例:用SVM做葡萄酒二分类识别器

问题和数据说明

这里数据截取自wine数据,根据13维的描述数值,识别葡萄酒的类别。由于本文讲述二分类,我们在3种类别中选取两种类别,标签变更为1和-1,整理得到数据data/wine_data.csv
部分数据如下:

labelf1f2f3f4f5f6f7f8f9f10f11f12f13
114.231.712.4315.61272.83.060.282.295.641.043.921065
113.21.782.1411.21002.652.760.261.284.381.053.41050
113.162.362.6718.61012.83.240.32.815.681.033.171185
-113.274.282.26201201.590.690.431.3510.20.591.56835
-113.172.592.37201201.650.680.531.469.30.61.62840
-114.134.12.7424.5962.050.760.561.359.20.611.6560

源码

MindOpt团队开发的代数建模语言MAPL(MindOpt Algebra Programming Language, MindOptAPL,简称为MAPL),可以用来编码上面的问题,并且调用求解器进行求解。
MAPL的V2.4版本上新了向量化建模的语法,可以方便地实现矩阵的转置、矩阵乘法等功能,详情>>
完整代码如下:

clear model;

####################################################
#
#   Vectorization Modeling Example
#   Linear SVM
#
####################################################

option modelname svm_03; #定义存储文件名

# ----------建模--------Start----
# svm_02.mapl

# 1.读取iris的用于构建SVM模型的训练数据
param data_dir = "./data/wine_data-train.csv"; 
param X = read_csv( data_dir, use_col="1,2,3,4,5,6,7,8,9,10,11,12,13",skip=1);
param y = read_csv( data_dir, use_col=0,skip=1);
param dataNum = X.row;
param dataDim = X.col;
print "总共有{}个数据,每个数据有{}维"%dataNum,dataDim;

# 2.LinearSVM问题建模
param C_rho = 0.2;
print "Param C is :{}"%C_rho;

print "Start modeling-------";

var w(dataDim) >= -1 <= 1; # Bounded Model Parameter
var b; #
var eps(dataNum) >= 0;

minimize 1/2 * w' * w + C_rho * sum(eps); #'是转置,目标函数

subto constraint:
        eps >= 1 - (X*w +b).*y; #注意是向量化建模,因此相当于多条维度的约束

# 3.调用求解器求解
print "Start solving-------";
option solver mindopt;
solve;


# 4. 超平面的w取值
print "- Optimal w is:";
print w;
print "- Optimal b is:";
print b;
print "- eps is:";
forall { i in 0..dataNum-1 with eps[i] > 0.001}
    print "  - eps[{}] = {} "%i,eps[i];

param obj_total_loss = 1/2 *  w' * w + C_rho * sum(eps); #'是转置
print "- obj of total loss is : {}"%obj_total_loss;

# 5.验证并分析结果

print "";
print "验证结果:-----";

param correctNum = sum{i in 0..dataNum-1} if((sum{j in 0..dataDim-1}w[j]*X[i, j]) +b )* y[i] > 0 then 1 else 0 end;
param precision = correctNum / dataNum;
print "- Precision for train data is : {:.2f}" % precision;

#
print "";
print "导入测试数据验证效果:-----";

param data_dir_test = "./data/wine_data-test.csv"; 
param X_test = read_csv( data_dir_test, use_col="1,2,3,4,5,6,7,8,9,10,11,12,13",skip=1);
param y_test = read_csv( data_dir_test, use_col=0,skip=1);
param dataNum_test = X_test.row;
param dataDim_test = X_test.col;
print "- 总共有{}个数据,每个数据有{}维"%dataNum_test,dataDim_test;

print "|测试数据ID|实际标签|SVM预测标签是|";
print "|--|--|--|";
forall {i in 0..dataNum_test-1}
print "|{}|{}|{}|"%i,y_test[i], if((sum{j in 0..dataDim_test-1}w[j]*X_test[i, j]) +b ) > 0 then 1 else -1 end;

运行上述代码结果如下:

总共有87个数据,每个数据有13维
Param C is :0.2
Start modeling-------
Start solving-------
Running mindoptampl
wantsol=1
MindOpt Version 1.2.1 (Build date: 20240428)
Copyright (c) 2020-2024 Alibaba Cloud.

Start license validation (current time : 29-APR-2024 17:51:15).
License validation terminated. Time : 0.007s

Model summary.
 - Num. variables     : 101
 - Num. constraints   : 87
 - Num. nonzeros      : 1305
 - Bound range        : [1.0e+00,1.0e+00]
 - Quad. bound range  : [1.0e+00,1.0e+00]
 - Objective range    : [2.0e-01,2.0e-01]
 - Quad. obj. range   : [1.0e+00,1.0e+00]
 - Matrix range       : [1.7e-01,1.7e+03]

Presolver started.
Presolver terminated. Time : 0.001s

Interior point method started.
 Iter         PrimObj         DualObj PrimFea DualFea  GapFea      Mu   Time
    0 +3.80399778e-01 -7.55707692e-01 1.9e-02 1.1e-02 1.1e+00 4.6e-03   0.02s
    1 +1.79640739e-01 -2.13996063e-01 8.2e-03 5.0e-03 3.9e-01 1.5e-03   0.03s
    2 +1.17952681e-01 -1.13914883e-01 5.2e-03 2.0e-02 2.3e-01 7.1e-04   0.03s
    3 +3.61389193e-02 -2.62084850e-02 1.5e-03 5.8e-03 6.2e-02 2.0e-04   0.04s
    4 +3.41691834e-02 -2.09031242e-02 1.4e-03 5.1e-03 5.5e-02 1.9e-04   0.04s
    5 +3.40036247e-02 +5.83432924e-02 1.3e-03 2.2e-02 4.6e-02 2.3e-04   0.04s
    6 +8.36408587e-02 -4.76077416e-01 8.4e-04 7.9e-02 5.6e-01 2.1e-04   0.04s
    7 +1.25803855e-01 +1.83665783e-01 5.0e-04 1.8e-02 5.8e-02 2.9e-04   0.05s
    8 +2.08232448e-01 +3.51342692e-01 1.1e-04 1.7e-02 1.4e-01 9.2e-05   0.05s
    9 +2.24640702e-01 +3.15349667e-01 5.2e-05 1.6e-02 9.1e-02 5.4e-05   0.05s
   10 +2.38702568e-01 +2.37176375e-01 1.4e-07 3.5e-04 2.6e-03 1.3e-05   0.05s
   11 +2.36599665e-01 +2.36546454e-01 4.5e-10 2.0e-06 6.0e-05 3.0e-07   0.05s
   12 +2.36550609e-01 +2.36550442e-01 1.2e-12 5.5e-09 1.8e-07 9.2e-10   0.06s
   13 +2.36550464e-01 +2.36550464e-01 1.5e-16 1.3e-11 4.3e-11 3.5e-14   0.06s
Terminated.
 - Method             : Interior point method.
 - Primal objective   : 2.3655046415330E-01
 - Dual objective     : 2.3655046419623E-01
 - Num. threads       : 4
 - Num. iterations    : 13
 - Solver details     : Solver terminated with a primal/dual optimal status.

Interior point method terminated. Time : 0.046s


OPTIMAL; objective 0.24
0 simplex iterations

Completed.
- Optimal w is:
[[ 0.04857],
 [ 0.01247],
 [ 0.05512],
 [-0.13231],
 [ 0.02318],
 [ 0.27035],
 [ 0.46883],
 [-0.01722],
 [ 0.13966],
 [-0.17157],
 [ 0.06461],
 [ 0.32124],
 [ 0.00143]]
- Optimal b is:
-3.307435311971387
- eps is:
- obj of total loss is : 0.23655046415329972

验证结果:-----
- Precision for train data is : 1.00

导入测试数据验证效果:-----
- 总共有20个数据,每个数据有13维
|测试数据ID|实际标签|SVM预测标签是|
|--|--|--|
|0|1|1|
|1|1|1|
|2|1|1|
|3|1|1|
|4|1|1|
|5|1|1|
|6|1|1|
|7|1|1|
|8|1|1|
|9|1|1|
|10|-1|-1|
|11|-1|-1|
|12|-1|-1|
|13|-1|-1|
|14|-1|-1|
|15|-1|-1|
|16|-1|-1|
|17|-1|-1|
|18|-1|-1|
|19|-1|-1|

结果解析

运行结果如下:


总共有87个数据,每个数据有13维 Param C is :0.2
……

  • Optimal w is: [[ 0.04857], [ 0.01247], [ 0.05512], [-0.13231], [ 0.02318], [ 0.27035], [ 0.46883], [-0.01722], [ 0.13966], [-0.17157], [ 0.06461], [ 0.32124], [ 0.00143]]
  • Optimal b is: -3.3074353121126
  • eps is:
  • obj of total loss is : 0.23655046414945333

验证结果:-----

  • Precision for train data is : 1.00

导入测试数据验证效果:-----

  • 总共有20个数据,每个数据有13维
测试数据ID实际标签SVM预测标签是
011
111
211
311
411
511
611
711
811
911
10-1-1
11-1-1
12-1-1
13-1-1
14-1-1
15-1-1
16-1-1
17-1-1
18-1-1
19-1-1

可以看到,我们使用通用MindOpt求解器,也能实现SVM“训练”葡萄酒的分类器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值