You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 22:06:04