rogeroyer / feature_selection_GAAlgorithm

基于遗传算法的特征选择
MIT License
120 stars 48 forks source link

AUC值异常 #1

Open chenjian120918 opened 6 years ago

chenjian120918 commented 6 years ago

您好,我尝试着使用了你的代码,为什么我直接AUC一直等于1呢,算法也是迭代100次,谢谢

rogeroyer commented 6 years ago

请问你是每一个个体的auc都为1吗?你看一下每次选出来的特征子集是不是所有特征(不包含主键和标签)的子集呢?

chenjian120918 commented 6 years ago

谢楼主提醒,我愚蠢地把标签页加进去训练了,现在有另外一个问题就是遗传进化的时候得到的feature_name的列表为0了导致训练出错,请问一下楼主修改那句代码,保证feature_name不能为空列表,谢谢

rogeroyer commented 6 years ago

请问你的特征维数一共是多少呢?我刚开始测试的时候用10维左右就可能出现子代基因全为0的情况,因为经过交叉和变异是可能出现这种情况的。但是我写这个算法的初衷就是针对特征维数比较高的情况,一般50维以上,如果维数比较低其实就没多大必要做特征选择了或者直接使用蛮力搜索效果可能会更好,时间也可以接受。

rogeroyer commented 6 years ago

我修改了几行代码,你重新下载使用下看行不行,提醒一下就是self.columns那里第一个元素是标签的名称,如果你数据集里面不是target就把它命名为target,其它元素全是特征名称。

chenjian120918 commented 6 years ago

嗯嗯好的,我之前测试的是10维数据,所以会等于0

chenjian120918 commented 6 years ago

用了50维数据之后终于跑通了!,楼主索引特征列的时候,为了避免其他人粗心,可以考虑features = [x for x in self.columns if x != "target" ]去索引就不会错了,哈哈,谢楼主

chenjian120918 commented 6 years ago

请问遗传算法的终止条件在你的代码里面是什么?,是lifecount数吗,貌似之前你对lifecount的增加有一个分数的约束条件,被你注释掉了,我的思考是这样固然不会造成feature_name=[],但是精度会不会下降呢?谢楼主

rogeroyer commented 6 years ago

谢谢你的提议哈,我用的终止条件是迭代次数,当迭代次数达到设定的阈值程序就自动结束了。

def main():
    fs = FeatureSelection(aLifeCount=20)
    rounds = 100    # 算法迭代次数 #
    fs.run(rounds)

之所以采用迭代次数是因为相邻两代之间最优个体适应度可能是一样的,所以就没用相邻两代之间最优个体适应度的差来作为终止条件。lifecount是每一代里面的个体数。

    def initPopulation(self):
        """初始化种群"""
        self.lives = []
        count = 0
        while count < self.lifeCount:
            gene = np.random.randint(0, 2, self.geneLenght)
            life = Life(gene)
            random.shuffle(gene)  # 随机洗牌 #
            if sum(life.gene) < 40:  # (sum(life.gene) < 40) and self.matchFun(life) < 0.8025
                continue
            self.lives.append(life)
            count += 1

不知道你说的注释掉的代码是不是这个函数里面的,之所有在初始化子代的时候添加一个子代候选规则,是为了从第一代就争取选出适应的较高的个体,后期得到适应度更高的个体的速度就会快些。

sum(life.gene) < 40 -> 限定特征维数不低于40

self.matchFun(life) < 0.8025 -> 限定初始子代适应度值大于0.8025

再提醒你一点就是:如果你是参加数据挖掘竞赛的话,如果能保持线上线下同增加,这个特征选择应该能带来好的效果,否则可能会过拟合验证集。

chenjian120918 commented 6 years ago

好的,多谢大佬,向你学习,哈哈,求带

rogeroyer commented 6 years ago

不敢当,相互学习

jjxsecurity commented 4 years ago

你好,这个能用于多分类中,进行特征选择吗?

xuan7qi commented 4 years ago

您好,我的AUC值一直是0.5您知道为什么吗? 我是把特征名字全都改成了英文而已,完全用的例子的数据集,有朋友直到为什么么,谢谢

rogeroyer commented 4 years ago

你好,这个能用于多分类中,进行特征选择吗? 可以的,但需要修改下模型和评价函数的代码

rogeroyer commented 4 years ago

您好,我的AUC值一直是0.5您知道为什么吗? 我是把特征名字全都改成了英文而已,完全用的例子的数据集,有朋友直到为什么么,谢谢 你只改了数据表中的特征名字吗?Feature_selection_genetic_algorithm.py中的self.columns改了没?

xuan7qi commented 4 years ago

columns我改过了,改成跟数据集里一样了,跑通是没问题的一直在显示迭代迭代,但是auc一直一直是0.5.。。。。。没有在学习。。。。

xuan7qi commented 4 years ago

另外请问更改数据集的时候initPopulation处应如何进行修改,谢谢

rogeroyer commented 4 years ago

initPopulation不用修改,auc一直等于0.5的原因应该是validate_feature.csv中的target全是0。你换个数据集跑应该是没有问题的,我给的样例只是为了说明数据大概长啥样的。

xuan7qi commented 4 years ago

好的好的,这回没问题了,十分感谢楼主,谢谢谢谢!

Ziyunyuan09 commented 3 years ago

好的好的,这回没问题了,十分感谢楼主,谢谢谢谢!

你好,我现在遇到了同样的问题。目前把validate_feature.csv中的部分target从0改成了1,roc_auc值仍然保持在0.5,请问你是怎么解决的呢

Hemkua commented 1 year ago

您好! 我想进行多分类的时候进行特征的选择 但是您说的要把acu部分更改一下要怎么进行啊?我是新手,感谢大佬能帮忙一下。。。

lockiecheng commented 1 year ago

您好! 我想进行多分类的时候进行特征的选择 但是您说的要把acu部分更改一下要怎么进行啊?我是新手,感谢大佬能帮忙一下。。。

我刚好有这个需求,解决如下: 1、将Feature_selection_genetic_algorithm.py 中 auc_score函数修改:将params中的objective字段改成multiclass,metric改成auc_mu,增加num_class字段,值为多分类的类别数 2、修改score = roc_auc_score(self.validate_data['target'], predict) 为 score = roc_auc_score(self.validate_data['target'], predict, multi_class = "ovo") 3、重新运行程序即可

Hemkua commented 1 year ago

您好! 我根据您的意见更改了。是下面这样更改吗? 非常感谢大佬的帮助。。。。。。

lockie @.***> 于2022年11月1日周二 19:04写道:

您好! 我想进行多分类的时候进行特征的选择 但是您说的要把acu部分更改一下要怎么进行啊?我是新手,感谢大佬能帮忙一下。。。

我刚好有这个需求,解决如下: 1、将Feature_selection_genetic_algorithm.py 中 auc_score函数修改:将params中的objective字段改成multiclass,metric改成auc_mu,增加num_class字段,值为多分类的类别数 2、修改score = roc_auc_score(self.validate_data['target'], predict) 为 score = roc_auc_score(self.validate_data['target'], predict, multi_class = "ovo") 3、重新运行程序即可

— Reply to this email directly, view it on GitHub https://github.com/rogeroyer/feature_selection_GAAlgorithm/issues/1#issuecomment-1298298132, or unsubscribe https://github.com/notifications/unsubscribe-auth/AZTIUQOABQ3U6QKH2DY5N7DWGDTJZANCNFSM4FIPRZQQ . You are receiving this because you commented.Message ID: @.***>

def auc_score(self, order): print(order) features = self.columns[1:] features_name = [] for index in range(len(order)): if order[index] == 1: features_name.append(features[index])

    labels = np.array(self.train_data['target'], dtype=np.int8)
    d_train = lgb.Dataset(self.train_data[features_name], label=labels)
    params = {
        'boosting': 'gbdt',
        'objective': 'multiclass',(更改内容)
        'metric': 'auc_mu',(更改内容)
        'train_metric': False,
        'subsample': 0.8,
        'learning_rate': 0.05,
        'num_leaves': 96,
        'num_threads': 4,
        'max_depth': 5,
        'colsample_bytree': 0.8,
        'lambda_l2': 0.01,
        'verbose': -1, 
        'num_class'=6(这个“6”就是分类的类别数是吗?)    # inhibit print info #
    }
    rounds = 100
    watchlist = [d_train]
    bst = lgb.train(params=params, train_set=d_train, num_boost_round=rounds, valid_sets=watchlist, verbose_eval=10)
    predict = bst.predict(self.validate_data[features_name])
    print(features_name)
    score = roc_auc_score(self.validate_data['target'], predict, multi_class = "ovo")(更改内容)
    print('validate score:', score)
    return score
zhuohai2363 commented 4 months ago

看着大家的评论,我刚刚运行了一下,跟着大家的评论就解决,哈哈哈哈哈哈哈