![Python机器学习算法: 原理、实现与案例](https://wfqqreader-1252317822.image.myqcloud.com/cover/317/27563317/b_27563317.jpg)
2.4 项目实战
最后,我们分别来做一个Logistic回归和一个Softmax回归的实战项目:使用Logistic回归和Softmax回归分别来鉴别红酒的种类,如表2-1所示。
表2-1 红酒数据集(https://archive.ics.uci.edu/ml/datasets/wine)
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-T45_33077.jpg?sign=1739306863-ZxAV2MJ6YaO8j3zaVCOIPBWJi9GVuVWF-0-414b1949ec3c8da35a09d826b253954f)
数据集总共有178条数据,其中每一行包含一个红酒样本的类标记以及13个特征,这些特征是酒精度、苹果酸浓度等化学指标。红酒的种类有3种,Softmax回归可以处理多元分类问题,而Logistic回归只能处理二元分类问题,因此在做Logistic回归项目时,我们从数据集中去掉其中的一类红酒样本,使用剩下的两类红酒样本作为训练数据。
读者可使用任意方式将红酒数据集文件letter-recognition.data下载到本地。此文件所在的URL为:https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data。
2.4.1 Logistic回归
1. 准备数据
首先,调用Numpy的genfromtxt函数加载数据集:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P46_33078.jpg?sign=1739306863-TCgy5xWhOaV8sIVXaiJaMJn7YSNBd3Kq-0-1d9c8f21bd894f1dbf958b6642a0789a)
在这个项目中,我们使用Logistic回归鉴别第1类和第2类红酒,因此将数据集中第3类红酒样本去除:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P47_33080.jpg?sign=1739306863-1c6EvjOPhBvw02PCAxJ6SlBdpx7YBc3M-0-f6a8df53de774cf03798758e89781ca4)
另外,目前y中的类标记为1和2,转换为算法所使用的0和1:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P48_33081.jpg?sign=1739306863-M5k4aqrpvvNzmBrEoJ5OFgc4LeqVEEIi-0-de335f50611e314cff8c09ebe5c222ac)
至此,数据准备完毕。
2. 模型训练与测试
LogisticRegression的超参数有:
(1)梯度下降最大迭代次数n_iter
(2)学习率eta
(3)损失降低阈值tol(tol不为None时,开启早期停止法)
先以超参数(n_iter=2000,eta=0.01,tol=0.0001)创建模型:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P48_33082.jpg?sign=1739306863-GcwzbshvCvIwFYyShIicSz48tSe9ORIx-0-75f1b7584e74fa52e4cbdc9e58373ef8)
然后,调用sklearn中的train_test_split函数将数据集切分为训练集和测试集(比例为7:3):
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P48_33083.jpg?sign=1739306863-F6FukENrQ9xfHhH3ZvkuzhqDVutYK8vq-0-8bbb8624e673b097eb5f237883d70dc3)
在第1章中曾讨论过,应用梯度下降算法时,应保证各特征值相差不大。观察下面的数据集特征均值及方差:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P49_33084.jpg?sign=1739306863-tGvkiTt162vqg8OvF0tTNGpP1EXPfBBL-0-8967ede3a58fc133a697c2fc6355f3a8)
发现其中一些特征值差别较大,因此调用sklearn中的StandardScaler函数对各特征值进行缩放:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P49_33085.jpg?sign=1739306863-Vw1eRmwS8iR4QEu2M0mUV6QDpjNNwvOR-0-5850f2c416c5cbda9804af2f1f3e8804)
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P50_33086.jpg?sign=1739306863-yZTZMv0ewIbd3jGCsnnDAMu5Z8dioC9B-0-8f264345e0d473a19668554cbd5ef302)
接下来,训练模型:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P50_33087.jpg?sign=1739306863-3Ah8DPqNgwaN1eTZwPvWXGFZIIssme1B-0-56e588b8ad5c542a1be4e056fbe3db7d)
经过700多次迭代后算法收敛。图2-3所示为训练过程中的损失(loss)曲线。
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P51_11667.jpg?sign=1739306863-ggoOl2pPNBdrnfiN04w8NGwKFjY8QG1S-0-4cf7a17e3f0f5e451c041df505c89fba)
图2-3
使用已训练好的模型对测试集中的实例进行预测,并调用sklearn中的accuracy_score函数计算预测的准确率:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P51_33088.jpg?sign=1739306863-b02smsYwg8SX5LXdNl6h7Jv8wh2OuXpp-0-a8bc5585cd59995ccfb21f2bcff8fe69)
单次测试一下,预测的准确率为100%,再进行多次(50次)反复测试,观察平均的预测准确率:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P51_33089.jpg?sign=1739306863-8SFa2WybpYMeQFi4hNOA7H9O3BgxmwEO-0-6900728b2f010148d5f35f0abf8d595e)
50次测试平均的预测准确率为98.05%,这表明几乎只有一个实例被预测错误,结果令人满意。读者还可以尝试使用其他超参数的组合创建模型,但该分类问题比较简单,性能提升空间不大。
至此,Logistic回归项目就完成了。
2.4.2 Softmax回归
1. 准备数据
除了无须去掉第3类红酒样本外,Softmax回归项目的数据准备工作与Logistic回归项目的数据准备工作完全相同。
首先,调用Numpy的genfromtxt函数加载数据集:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P52_33091.jpg?sign=1739306863-Iy9mOronlXwjxkhObN7KMClhCR2jKbrN-0-8e57dffa045b5f8a41a6bd0565755136)
然后,将目前y中的类标记为(1,2,3),转换为算法所使用的(0,1,2):
1. >>> y -= 1
至此,数据准备完毕。
2. 模型训练与测试
Softmax回归项目中的模型训练与测试过程与之前Logistic回归项目中的完全相同,以下叙述中某些细节不再重复。
SoftmaxRegression的超参数与LogisticRegression相同:
(1)梯度下降最大迭代次数n_iter
(2)学习率eta
(3)损失降低阈值tol(tol不为None时,开启早期停止法)
我们依然使用超参数(n_iter=2000,tol=0.01,eta=0.0001)创建模型:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P53_33092.jpg?sign=1739306863-RGj2X2oZAGGk49ORSdTQiWSrM89HH9cP-0-2da42452d495cf9690e3b860186a26fc)
将数据集切分为训练集和测试集(比例为7:3):
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P53_33093.jpg?sign=1739306863-XizV09bfQcQ8Xg2gORQPMF35GnxOp1Pu-0-b92edf16f2bfd320c8ef8efef608a285)
对各特征值进行缩放:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P53_33094.jpg?sign=1739306863-p5fbMPH0jyWAjmaOrzneQ3nEdhtYEQQD-0-db22a7cd02108c1213e6c8259b0b96ad)
训练模型:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P53_33095.jpg?sign=1739306863-vZ30nvnvnQKnrq4PGiWRT9FNzBTikyty-0-d977e236fc0ed9f51f6d9d3d31c23552)
使用已训练好的模型对测试集进行预测,并计算预测的准确率:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P53_33096.jpg?sign=1739306863-sqs6TXJFea0rjjWvYrND5xzkzPNhqD5z-0-15cba4c3878f67fc4522204f6c2db6a3)
单次测试一下,预测的准确率为98.15%,同样,再进行多次(50次)反复测试,观察平均的预测准确率:
![](https://epubservercos.yuewen.com/889FA0/15825992205221106/epubprivate/OEBPS/Images/Figure-P54_33098.jpg?sign=1739306863-Gk5R1ZImRTQ9n9cRpbR0jN8CD7GlhtRA-0-3cfbf008f81d39b64e427725d9e26df1)
50次测试平均的预测准确率为98.04%,与之前的Logistic回归性能几乎相同。
至此,Softmax回归项目也完成了。