前言
自从上两篇博客详细讲解了Python遗传和进化算法工具箱及其在带约束的单目标函数值优化中的应用以及利用遗传算法求解有向图的最短路径之后,我经过不断学习工具箱的官方文档以及对源码的研究,更加掌握如何利用遗传算法求解更多有趣的问题了。
与前面的文章不同,本篇采用差分进化算法来优化SVM中的参数C和Gamma。(用遗传算法也可以,下面会给出效果比较)
首先简单回顾一下Python高性能实用型遗传和进化算法工具箱的用法。对于一个优化问题,需要做两个步骤便可进行求解:Step1:自定义问题类;Step2:编写执行脚本调用Geatpy进化算法模板对问题进行求解。在上一篇博客曾“详细”介绍过具体的用法:https://blog.csdn.net/weixin_37790882/article/details/84034956,但完整的中文教程可以参考官方文档。
下面切入主题:
首先简单描述一下SVM的使用。本文采用Python的sklearn库来跑SVM算法。sklearn中SVM的算法库分为两类,一类是分类的算法库,包括:SVC、NuSVC和LinearSVC 3个类。另一类是回归算法库,包括:SVR、NuSVR和LinearSVR 3个类。相关的类都包裹在sklearn.svm模块之中。
正文
本文重点讲解利用SVC这个类来对iris数据集的数据进行分类。iris数据集的数据格式如下:
前4列是特征数据,第5列是标签数据。整个数据集一共有3种标签:Iris-setosa、Iris-versicolor、Iris-virginica。
采用SVC对数据进行分类的一般步骤为:
Step1:读取训练集的特征数据,并保存在一个Numpy array类型“矩阵”中,使得每一列代表一个特征,每一行代表一组数据,并对数据进行标准化处理。
Step2:读取训练集的标签数据,保存在一个Numpy array类型的行向量中。
Step3:寻找最优参数C和Gamma。
Step4:使用最优参数实例化SVC类的对象(即创建分类器对象),并调用它的成员函数fit()利用训练集的数据来拟合分类器模型。
Step5:用与Step1和Step2同样的方法读取测试集的特征数据和标签数据,并对特征数据进行标准化处理。
Step6:用Step4中训练好的分类器对标准化后的特征数据进行预测,预测出每组特征数据对应的标签。
Step7:把预测出的标签数据和读取到的测试集标签数据进行对比,计算正确率。
在上面的步骤中,寻找最优参数C和Gamma是一个关键步骤,一般采用固定步长的网格搜索策略以及交叉验证来寻找最优参数。而本文采用差分进化算法来寻找该最优参数,差分进化算法基本流程和一般的进化算法相差无几,这里就不赘述了,权威又易懂的参考文献如下:
Price, K.V., Storn, R.N. and Lampinen, J.A.. Differential Evolution: A Practical Approach to Global Optimization. : Springer, 2005.
1)首先把模型写到自定义问题类中,代码如下:
# -*- coding: utf-8 -*-
"""MyProblem.py"""
import numpy as np
import geatpy as ea