通过遗传算法来优化特征工程

ai_cover.jpeg

了解数据集

这里数据集是根据breast cancer检查报告来推测样本是否患有 breast cancer 。569 个样本,每个样本有 30 项指标供参考,我们学习出一个模型根据输入样本给出一个分类,也就是 2 分类问题,也就是样本是否患有 breath cancer。

基本思路

其实这里遗传算法解决问题是模型参数空间内搜索到一组最优参数来作为 LR 模型参数,问题和方法都比较简单,主要是打开大家的思路。数据每个样本有 30 特征,其实这些特征可能有些特征间是相关的,或者有些特征对最终结果并没有多大帮助,甚至有可能对预测结果起到反作用。

初始化种群

  • chromesome 可以看成个体,每一个样本都是对样本一个特征选择方案
  • population 是由一定数量的个体组成,我们接下来就是通过不断循环、选择、交叉和变异这个过程不断去优化种群,也就是优化方案。
def initilization_of_population(size,n_feat):
    population = []
    for i in range(size):
        chromosome = np.ones(n_feat,dtype=np.bool)
        chromosome[:int(0.3*n_feat)]=False
        np.random.shuffle(chromosome)
        population.append(chromosome)
    return population

所谓群体就是解集,种群则由经过基因(gene)编码的一定数目的个体(individual)组成,所谓个体就是这里颜色体(chromosome)。这里 n_feat 需要和数据特征维数保持一致,

有关上面代码出现语法给出点解释

temp = np.ones(10,dtype=bool)
temp[:int(0.3*10)] = False
print(temp)
np.random.shuffle(temp)
print(temp)
[False False False  True  True  True  True  True  True  True]
[ True  True  True  True False False  True  True False  True]

评估种群个体适应度

这个函数有点类似机器学习中目标函数,遗传算法中每一条染色体,对应着遗传算法的一个解决方案,用适应性函数(fitness function)来衡量这个解决方案的优劣

def fitness_score(population):
    scores = []
    for chromosome in population:
        # 
        logmodel.fit(X_train.iloc[:,chromosome],y_train)
        predictions = logmodel.predict(X_test.iloc[:,chromosome])
        scores.append(accuracy_score(y_test,predictions))
    scores, population = np.array(scores), np.array(population) 
    inds = np.argsort(scores)
    return list(scores[inds][::-1]), list(population[inds,:][::-1])

这里个体主要从样本众多特征中选择一些特征进行分析,然后经过特征筛选的样本投入到logistic 分类器进行训练,从而得到一个分类器,用这个分类器进行预测的结果和真实值进行对比来评估每个个体。

选择

选择这里比较简单,通常不会仅选取最优的个体,而是进行随机选取只不过选取不适应环境个体概率会小一些

def selection(pop_after_fit,n_parents):
    population_nextgen = []
    for i in range(n_parents):
        population_nextgen.append(pop_after_fit[i])
    return population_nextgen

交叉

在生物学中,就是基因重组,这里就是用个体某一个片段与其他个体同一个位置片段进行对调产生新的个体。

def crossover(pop_after_sel):
    population_nextgen=pop_after_sel
    for i in range(len(pop_after_sel)):
        child=pop_after_sel[i]
        child[3:7]=pop_after_sel[(i+1)%len(pop_after_sel)][3:7]
        population_nextgen.append(child)
    return population_nextgen

变异

这里所谓变异还是比较好理解,也就是将个体(染色体)某一个位置进行取反,也就是如果原来 True 变异后为 False 反之亦然

def mutation(pop_after_cross,mutation_rate):
    population_nextgen = []
    for i in range(0,len(pop_after_cross)):
        chromosome = pop_after_cross[i]
        for j in range(len(chromosome)):
            if random.random() < mutation_rate:
                chromosome[j]= not chromosome[j]
        population_nextgen.append(chromosome)
    #print(population_nextgen)
    return population_nextgen

迭代过程

迭代过程也是进化的过程,种群通过一次次迭代不断进化,优化参数

def generations(size,n_feat,n_parents,mutation_rate,n_gen,X_train,
                                   X_test, y_train, y_test):
    best_chromo= []
    best_score= []
    # 初始化迭代
    population_nextgen=initilization_of_population(size,n_feat)
    for i in range(n_gen):
        # 200 
        scores, pop_after_fit = fitness_score(population_nextgen)
        print(scores[:2])
        # 200 -> 100
        pop_after_sel = selection(pop_after_fit,n_parents)
        # 100 -> 200
        pop_after_cross = crossover(pop_after_sel)
        # 200 -> 200
        population_nextgen = mutation(pop_after_cross,mutation_rate)
        
        best_chromo.append(pop_after_fit[0])
        best_score.append(scores[0])
    return best_chromo,best_score

运行代码

chromo,score=generations(size=200,n_feat=30,n_parents=100,mutation_rate=0.10,
                     n_gen=38,X_train=X_train,X_test=X_test,y_train=y_train,y_test=y_test)
logmodel.fit(X_train.iloc[:,chromo[-1]],y_train)
predictions = logmodel.predict(X_test.iloc[:,chromo[-1]])
print("Accuracy score after genetic algorithm is= "+str(accuracy_score(y_test,predictions)))
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容