zoukankan      html  css  js  c++  java
  • 用遗传算法进行特征选择

    曾经的我只知道,这台电脑缺一个好的显卡;现在的我还知道,原来这台电脑还缺一个好的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

  • 相关阅读:
    调戏木马病毒的正确姿势——下
    调戏木马病毒的正确姿势——上
    可恢复的安全rm
    关于System.Convert那些事
    ORA-00600: internal error code, arguments: [kkqtSetOp.1]
    PL/SQL个人学习笔记
    苹果iOS手机后门的”诊断功能论“不攻自破
    畅谈HTML开发
    Triangle
    Java中的equals()和hashCode()
  • 原文地址:https://www.cnblogs.com/holaworld/p/12631851.html
Copyright © 2011-2022 走看看