甲基化疾病预测(2)

在精读baseline之后,进行了其他初步尝试。

首先是同时使用所有485512个位点数据训练模型,并给出重要排行。

结果显示只有前304个位点的值不为零,其后均为零。(其实排名较为靠后的那些特征的重要性也几乎为零)

故取出该304个位点训练模型。结果甚至比全部位点信息都使用还要好一点点。

故接下来考虑使用其他模型以及使用optuna调参。找出最优参数。

总体而言比较大的收获在于提取出了少量最重要的特征以及学习了optuna的使用。

代码为插入optuna:

def catboost_model3(train_x, train_y, test_x, seed = 2023):
    folds = 5  # 设置K折交叉验证折数为5
    kf = KFold(n_splits=folds, shuffle=True, random_state=seed) # 使用KFold方法创建一个交叉验证对象kf,设置折数、是否打乱顺序和随机种子
    oof = np.zeros(train_x.shape[0]) # 初始化一个全零数组oof,长度为train_x的长度
     # 初始化一个全零数组test_predict,长度为test_x的长度
    test_predict = np.zeros(test_x.shape[0]) 
    cv_scores = [] # 初始化一个空列表cv_scores,用于存储交叉验证得分
    # 使用for循环遍历kf的每个折叠
    for i, (train_index, valid_index) in enumerate(kf.split(train_x, train_y)):
               # 打印当前折数的序号
        print('************************************ {} ************************************'.format(str(i+1)))
        # 获取当前折叠的训练集索引和验证集索引,根据索引获取训练集和验证集的特征和标签
        trn_x, trn_y, val_x, val_y = train_x.iloc[train_index], train_y[train_index], train_x.iloc[valid_index], train_y[valid_index]
        # 定义CatBoostRegressor模型的参数
        
        
        def objective(trial, test_predict):
            params = {
                'iterations': trial.suggest_int('iterations', 100, 500),
                'depth': trial.suggest_int('depth', 4, 8),
                'learning_rate': trial.suggest_float('learning_rate', 1e-3, 1e-1),
            }

    # 使用 Pool 加载数据
            train_pool = Pool(trn_x, trn_y)
            test_pool = Pool(val_x, val_y)

            # 创建 CatBoost 分类器
            model = CatBoostRegressor(**params, verbose=False)

            # 训练模型
            model.fit(train_pool)

            # 预测并计算准确率
            val_pred  = model.predict(val_x)
            test_pred = model.predict(test_x)
            oof[valid_index] = val_pred
            test_predict += test_pred / kf.n_splits
            score = mean_absolute_error(val_y, val_pred)

            cv_scores.append(score)
            print(cv_scores) # 打印cv_scores列表
            return score
        study = optuna.create_study(direction='minimize')
        study.optimize(lambda trial: objective(trial, test_predict), n_trials=100)
        # 输出最佳超参数和值
        print('Number of finished trials: ', len(study.trials))
        print('Best trial:')
        trial = study.best_trial

        print('Value: ', trial.value)
        print('Params: ')
        for key, value in trial.params.items():
            print(f'    {key}: {value}')
        
    return oof, test_predict # 返回oof和test_predict数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值