用遺傳算法進行特征選擇


曾經的我只知道,這台電腦缺一個好的顯卡;現在的我還知道,原來這台電腦還缺一個好的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM