如何向DataFrame填充列表值并快速找到最优max_leaf_nodes参数
问题解答
问题1:将li列表值添加到df_mae的MAE列
直接给列赋值即可实现,代码如下:
df_mae['MAE'] = li
如果需要同步记录对应的max_leaf_nodes取值,方便后续快速定位最优参数,建议直接用字典方式创建DataFrame:
# 同步存储叶子节点数和对应MAE node_list = list(range(2, 10000, 2)) df_mae = pd.DataFrame({ "max_leaf_nodes": node_list, "MAE": li }) # 直接获取最优参数 best_max_leaf_nodes = df_mae.loc[df_mae['MAE'].argmin(), 'max_leaf_nodes']
问题2:高效查找最优max_leaf_nodes的方法
原方案从2到10000步长2遍历,需要执行近5000次模型训练,耗时久是正常情况,可通过以下方案优化:
- 方案1:粗搜+细搜替代全量遍历
max_leaf_nodes和验证集MAE的关系是单峰曲线:随着叶子节点数增加,MAE先下降(欠拟合→拟合合理),后上升(过拟合),无需全量遍历。先按指数间隔粗选最优区间,再在小范围内细搜即可:
# 第一步:粗搜,仅验证少量候选值,定位MAE最低的区间 candidate_nodes = [2,5,10,20,50,100,200,500,1000,2000,5000,10000] mae_list = [get_mae(n, train_X, val_X, train_y, val_y) for n in candidate_nodes] min_idx = mae_list.index(min(mae_list)) low = candidate_nodes[max(0, min_idx-1)] high = candidate_nodes[min(len(candidate_nodes)-1, min_idx+1)] # 第二步:仅在最优区间内细搜,总训练次数从近5000次降到几十次,速度提升上百倍 li = [] for max_leaf_nodes in range(low, high, 5): mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y) li.append(mae)
- 方案2:开启暖启动避免重复训练
DecisionTreeRegressor支持warm_start暖启动参数,开启后调整max_leaf_nodes时不需要从头训练树,可在原有树结构基础上继续生长,训练速度大幅提升:
def get_mae_fast(model, max_leaf_nodes, val_X, val_y): model.set_params(max_leaf_nodes=max_leaf_nodes) model.fit(train_X, train_y) preds_val = model.predict(val_X) return mean_absolute_error(val_y, preds_val) # 初始化暖启动模型 model = DecisionTreeRegressor(random_state=0, warm_start=True) li = [] for max_leaf_nodes in range(2, 10000, 2): mae = get_mae_fast(model, max_leaf_nodes, val_X, val_y) li.append(mae)
- 方案3:用自带调参工具结合交叉验证
直接用GridSearchCV搭配粗筛后的参数区间,还能自动做交叉验证,结果更稳定:
from sklearn.model_selection import GridSearchCV # 用粗筛后的区间作为候选集,减少验证次数 params = {'max_leaf_nodes': range(2, 2000, 10)} grid = GridSearchCV(DecisionTreeRegressor(random_state=0), params, scoring='neg_mean_absolute_error', cv=5) grid.fit(train_X, train_y) print(grid.best_params_['max_leaf_nodes'])
额外提示:一般max_leaf_nodes不需要设置到10000这么大,当叶子节点数超过训练集样本数的1/10之后基本就已经过拟合,MAE不会再下降,可以根据自己的数据集大小缩小搜索上限,进一步提速。
内容的提问来源于stack exchange,提问作者Skywalker
相关产品推荐
相关产品推荐

