1.交叉验证

首先说明交叉验证的含义,在使用训练集对参数进行训练的时候,经常会发现人们通常会将一整个训练集分为三个部分(比如mnist手写训练集)。一般分为:训练集(train_set),评估集(valid_set),测试集(test_set)这三个部分。这其实是为了保证训练效果而特意设置的。其中测试集很好理解,其实就是完全不参与训练的数据,仅仅用来观测测试效果的数据。而训练集和评估集则牵涉到下面的知识了。
因为在实际的训练中,训练的结果对于训练集的拟合程度通常还是挺好的(初始条件敏感),但是对于训练集之外的数据的拟合程度通常就不那么令人满意了。因此我们通常并不会把所有的数据集都拿来训练,而是分出一部分来(这一部分不参加训练)对训练集生成的参数进行测试,相对客观的判断这些参数对训练集之外的数据的符合程度。这种思想就称为交叉验证(Cross Validation)。
时间关系这次代码就不放了,之后有时间补充。
2.选择模型
这里借鉴了大佬的一个方法,觉得很精妙,就是先看一下所有模型的效果,再选择最优的几个进行详细建模。
我一般习惯建立一个字典, 把这些模型放到字典里面,然后分别进行交叉验证,可视化结果来判断哪个模型针对当前问题表现比较好, 这样从这里面选出3-4个进行下面的环节,也就是模型的调参工作。这里给出一个我常用的一个评估算法模型的一个框架, 在这里,采用10交叉验证来分离数据, 通过绝对值误差来比较算法的准确度, 误差越小,准确度越高。
他的代码如下,
num_folds = 10
seed = 7
# 把所有模型写到一个字典中
models = {}
models['LR'] = LinearRegression()
models['Ridge'] = Ridge()
models['LASSO'] = Lasso()
models['DecisionTree'] = DecisionTreeRegressor()
models['RandomForest'] = RandomForestRegressor()
models['GradientBoosting'] = GradientBoostingRegressor()
models['XGB'] = XGBRegressor(n_estimators = 100, objective='reg:squarederror')
models['LGB'] = LGBMRegressor(n_estimators=100)
#models['SVR'] = SVR() # 支持向量机运行不出来
results = []
for key in models:
kfold = KFold(n_splits=num_folds, random_state=seed)
cv_result = cross_val_score(models[key], X, Y_ln, cv=kfold, scoring=make_scorer(mean_absolute_error))
results.append(cv_result)
print('%s: %f (%f)' % (key, cv_result.mean(), cv_result.std()))
# 评估算法 --- 箱线图
fig1 = plt.figure(figsize=(15, 10))
fig1.suptitle('Algorithm Comparison')
ax = fig1.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(models.keys())
plt.show()
可以根据这种效果来看模型是否比较好,省去了一个个试的麻烦。

3.建模调参
下面的话我们就选定了随机森林、LGB和XGB
这里没有用网格搜索法,用了贪心调参。
# 先建立一个参数字典
best_obj = dict()
# 调objective
for obj in objective:
model = LGBMRegressor(objective=obj)
score = np.mean(cross_val_score(model, X, Y_ln, verbose=0, cv=5, scoring=make_scorer(mean_absolute_error)))
best_obj[obj] = score
# 上面调好之后,用上面的参数调num_leaves
best_leaves = dict()
for leaves in num_leaves:
model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0], num_leaves=leaves)
score = np.mean(cross_val_score(model, X, Y_ln, verbose=0, cv=5, scoring=make_scorer(mean_absolute_error)))
best_leaves[leaves] = score
# 用上面两个最优参数调max_depth
best_depth = dict()
for depth in max_depth:
model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0],
num_leaves=min(best_leaves.items(), key=lambda x: x[1])[0],
max_depth=depth)
score = np.mean(cross_val_score(model, X, Y_ln, verbose=0, cv=5, scoring=make_scorer(mean_absolute_error)))
best_depth[depth] = score
# 调n_estimators
best_nstimators = dict()
for nstimator in n_estimators:
model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0],
num_leaves=min(best_leaves.items(), key=lambda x: x[1])[0],
max_depth=min(best_depth.items(), key=lambda x:x[1])[0],
n_estimators=nstimator)
score = np.mean(cross_val_score(model, X, Y_ln, verbose=0, cv=5, scoring=make_scorer(mean_absolute_error)))
best_nstimators[nstimator] = score
# 调learning_rate
best_lr = dict()
for lr in learning_rate:
model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0],
num_leaves=min(best_leaves.items(), key=lambda x: x[1])[0],
max_depth=min(best_depth.items(), key=lambda x:x[1])[0],
n_estimators=min(best_nstimators.items(), key=lambda x:x[1])[0],
learning_rate=lr)
score = np.mean(cross_val_score(model, X, Y_ln, verbose=0, cv=5, scoring=make_scorer(mean_absolute_error)))
best_lr[lr] = score
本文介绍了在二手车交易价格预测比赛中,如何进行建模和调参。内容涉及交叉验证的概念及其在训练过程中的作用,通过比较不同模型的表现选择最优模型,并展示了使用10折交叉验证和绝对误差评估模型准确性。最后,作者提到了在随机森林、LGB和XGB等模型上的贪心调参方法。

2013

被折叠的 条评论
为什么被折叠?



