一、baseline理解
# 数据准备
train_dataset = pd.read_csv("./data/train.csv") # 原始训练数据。
test_dataset = pd.read_csv("./data/test.csv") # 原始测试数据(用于提交)。
首先是数据读取部分,用pandas的read_csv函数将训练数据和测试数据分别读入。
pred_labels = list(train_dataset.columns[-34:]) # 需要预测的标签。
train_set, valid_set = train_test_split(train_dataset, test_size=0.2) # 拆分数据集。
标签也就是需要我们最后预测的部分,在这里是数据集的后34列。然后将训练数据划分成数据集和验证集,需要注意的是这里的验证集才是供模型验证准确后继续优化的数据部分,而上面的训练集则只在模型训练好后用来衡量模型的准确性,只用一次且模型不能根据此次结果来继续优化,这一点需要注意。 举一个例子就是训练集就像平时学习时的作业,验证集像是期中期末,可以多次使用,测试集是高考,只能考一次。
lgb_params = {
'boosting_type': 'gbdt', #使用的模型
'objective': 'regression', #回归
'metric': 'mae', #衡量准确性用的方法
'min_child_weight': 5, #防止过拟合的话需要设小一点
'num_leaves': 2 ** 5, #最好不要超过上面
'lambda_l2': 10, #L2正则化项的权重
'feature_fraction': 0.8, #特征采样
'bagging_fraction': 0.8, #数据采样
'bagging_freq': 4, #随机选择数据的频率
'learning_rate': 0.05, #学习率
'seed': 2023, #随机种子
'nthread' : 16, #并行线程
'verbose' : -1, #不输出日志
'early_stopping_rounds' : 50, #如果模型训练50次后无提升就停止
}
no_info = lgb.callback.log_evaluation(period=-1) # 禁用训练日志输出。
二、优化思路
1、 K折交叉验证
首先是数据集的问题,由于数据集比较少,然后再把验证集划分出去后就更少了,为了解决这个问题可以尝试K折交叉验证,也就是将数据集划分成K份,每次将其中的1份作为验证集,其他作为训练集,重复执行K次。为了使模型变得更好,可以将这K次训练全喂到一个模型里,这里可以使用save_model来将之前的模型保存下来。
from sklearn.model_selection import KFold
kf = KFold(n_splits=5) #5也就表示使用5折交叉验证
for result in kf.split(train_dataset):
train_set = train_dataset.iloc[result[0]]
valid_set = train_dataset.iloc[result[1]]
2、防止过拟合
在参数中加上early_stopping_rounds,然后在条件允许的时候可以将模型的训练次数拉大一点。
也可以更改参数中的min_child_weight和num_leaves部分,微调一下观察模型准确性的变化。