在精读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数组