葡萄酒数据集经常被用于机器学习、模式识别和统计分类算法的测试中。由于其特征维度较高,非常适合于验证特征选择和降维方法,例如主成分分析(PCA)或线性判别分析(LDA)的效果。同时,由于数据集包含多个分类,它也经常被用作分类算法(如决策树、随机森林、支持向量机等)的标准测试集。
前篇我们讲述了用SVM做鸢尾花二分类识别器,本篇我们用前篇相似的代码,更换一个维度更高的数据进行测试。
葡萄酒分类:葡萄酒数据集是另一个分类问题,但特征数量增至13个。任务是根据化学组份将葡萄酒分为两个不同的类别。
数据示例:用SVM做葡萄酒二分类识别器
问题和数据说明
这里数据截取自wine数据,根据13维的描述数值,识别葡萄酒的类别。由于本文讲述二分类,我们在3种类别中选取两种类别,标签变更为1和-1,整理得到数据data/wine_data.csv。
部分数据如下:
label |
f1 |
f2 |
f3 |
f4 |
f5 |
f6 |
f7 |
f8 |
f9 |
f10 |
f11 |
f12 |
f13 |
1 |
14.23 |
1.71 |
2.43 |
15.6 |
127 |
2.8 |
3.06 |
0.28 |
2.29 |
5.64 |
1.04 |
3.92 |
1065 |
1 |
13.2 |
1.78 |
2.14 |
11.2 |
100 |
2.65 |
2.76 |
0.26 |
1.28 |
4.38 |
1.05 |
3.4 |
1050 |
1 |
13.16 |
2.36 |
2.67 |
18.6 |
101 |
2.8 |
3.24 |
0.3 |
2.81 |
5.68 |
1.03 |
3.17 |
1185 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
-1 |
13.27 |
4.28 |
2.26 |
20 |
120 |
1.59 |
0.69 |
0.43 |
1.35 |
10.2 |
0.59 |
1.56 |
835 |
-1 |
13.17 |
2.59 |
2.37 |
20 |
120 |
1.65 |
0.68 |
0.53 |
1.46 |
9.3 |
0.6 |
1.62 |
840 |
-1 |
14.13 |
4.1 |
2.74 |
24.5 |
96 |
2.05 |
0.76 |
0.56 |
1.35 |
9.2 |
0.61 |
1.6 |
560 |
源码
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预测标签是 |
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 |
可以看到,我们使用通用MindOpt求解器,也能实现SVM“训练”葡萄酒的分类器。