用遗传算法进行特征选择

曾经的我只知道,这台电脑缺一个好的显卡;现在的我还知道,原来这台电脑还缺一个好的CPU。
——作者

遗传算法介绍

源码

一、算法

1.初始化种群

一个种群有好几条染色体
一条染色体大概长这样:[0,1,1,0,0,1,0,1,1,0,1]
1表示选择这个特征,0表示不选择这个特征
染色体的长度为特征的个数
初始化时0和1随机选,生成一个个染色体

2.评估种群中个体适应度

用交叉验证cross_val_score(个体,y)的结果作为适应度

3.选择

每条染色体的适应度不同,被选择的概率不同
用轮盘赌选择
先生成与染色体个数(种群大小)相同的随机数
然后再一个个看这些随机数落在哪个染色体的范围内
例:
染色体的选择概率:①[0,0.3), ②[0.3,0.6), ③[0.6,0.7), ④[0.7,0.9), ⑤[0.9,1]
生成的随机数:0.2, 0.4, 0.5, 0.78, 0.8
被选中的染色体:①, ②, ②, ④, ④

4.交叉

若第i条与第i+1条染色体发生交叉
随机选择交叉点,然后交叉
例:
第6条与第7条染色体发生交叉
第6条染色体:[1,0,0,1,0]
第7条染色体:[\(\color{red}{0}\),\(\color{red}{1}\),\(\color{red}{0}\),\(\color{red}{1}\),\(\color{red}{1}\)]
随机选择交叉点3
第6条染色体:[1,0,0,\(\color{red}{1}\),\(\color{red}{1}\)]
第7条染色体:[\(\color{red}{0}\),\(\color{red}{1}\),\(\color{red}{0}\),1,0]

5.变异

若第i条染色体发生变异
随机选择一个变异点,然后取反
0变1,1变0

二、效果

没有进行特征选择时,交叉验证的得分是0.6257839721254356

用遗传算法进行特征选择:

前面几条输出:

0
[0, [1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1], 0.6919860627177701]
1
[1, [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0], 0.7265969802555168]
2
[2, [1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0], 0.7225319396051104]
3
[3, [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0], 0.7170731707317073]
4
[4, [1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0], 0.7176538908246226]

最后几条输出:

94
[94, [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0], 0.7746806039488966]
95
[95, [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0], 0.7601626016260162]
96
[96, [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0], 0.7698025551684088]
97
[97, [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0], 0.7507549361207898]
98
[98, [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0], 0.7600464576074332]
99
[99, [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0], 0.7555168408826946]

三、逼逼几句

这个时间复杂度和空间复杂度好好好好高,运行的时候风扇呼呼转,电量哗哗掉
更多:用模拟退火算法进行特征选择


参考:https://github.com/cainsmile/GA_for_Feature_Selection

posted on 2020-04-04 14:52  HolaWorld  阅读(5747)  评论(1编辑  收藏  举报

导航