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

Python变量在if条件不满足时仍被修改的问题排查

问题:寻找最小MAE对应的树节点数时变量错误更新

我在Kaggle练习中遍历candidate_max_leaf_nodes列表,将每个值传入get_mae函数计算MAE,目标是找到生成最小MAE的列表值。设置了仅当curr_mae < min_mae时才修改min_mae和min_val的条件,但发现即使条件不满足,min_val仍被修改,最终结果错误。

问题代码

candidate_max_leaf_nodes = [5, 25, 50, 100, 250, 500]
# Write loop to find the ideal tree size from candidate_max_leaf_nodes
min_mae = float('inf')
min_val = 0
for s in candidate_max_leaf_nodes:
    print(f"s  = {s}")
    min_val = s
    curr_mae = get_mae(s,train_X, val_X, train_y, val_y)
    print(f" Preloop || curr mae = {curr_mae}")
    print(f" Preloop || min mae = {min_mae}")
    print(f" Preloop || min val  = {min_val}")
    print(f" Preloop || cond = {curr_mae < min_mae}")
    if(curr_mae < min_mae):
            min_mae = curr_mae
            min_val = s
    else:
        continue

print(f" Post || min_mae = { min_mae}")   
print(f" Post || min_val = { min_val}")   

# Store the best value of max_leaf_nodes (it will be either 5, 25, 50, 100, 250 or 500)
best_tree_size = min_val

# Check your answer
step_1.check()

执行日志

s  = 5
 Preloop || curr mae = 35044.51299744237
 Preloop || min mae = inf
 Preloop || min val  = 5
 Preloop || cond = True
s  = 25
 Preloop || curr mae = 29016.41319191076
 Preloop || min mae = 35044.51299744237
 Preloop || min val  = 25
 Preloop || cond = True
s  = 50
 Preloop || curr mae = 27405.930473214907
 Preloop || min mae = 29016.41319191076
 Preloop || min val  = 50
 Preloop || cond = True
s  = 100
 Preloop || curr mae = 27282.50803885739
 Preloop || min mae = 27405.930473214907
 Preloop || min val  = 100
 Preloop || cond = True
s  = 250
 Preloop || curr mae = 27893.822225701646
 Preloop || min mae = 27282.50803885739
 Preloop || min val  = 250
 Preloop || cond = False
s  = 500
 Preloop || curr mae = 29454.18598068598
 Preloop || min mae = 27282.50803885739
 Preloop || min val  = 500
 Preloop || cond = False
 Post || min_mae = 27282.50803885739
 Post || min_val = 500

错误原因分析

你在循环的最开头就执行了min_val = s,这会导致每次循环都会先把min_val覆盖为当前的s,后续的条件判断只在满足时重新赋值,但不满足时不会把min_val改回之前的最小值。比如当s=250和s=500时,虽然条件curr_mae < min_mae不成立,但循环开头已经把min_val改成了当前的s,最终min_val就变成了最后一个循环的s值500,而不是真正对应最小MAE的100。

修正后的代码

删除循环开头的min_val = s,只在条件满足时更新min_val:

candidate_max_leaf_nodes = [5, 25, 50, 100, 250, 500]
# Write loop to find the ideal tree size from candidate_max_leaf_nodes
min_mae = float('inf')
min_val = 0
for s in candidate_max_leaf_nodes:
    print(f"s  = {s}")
    curr_mae = get_mae(s,train_X, val_X, train_y, val_y)
    print(f" Preloop || curr mae = {curr_mae}")
    print(f" Preloop || min mae = {min_mae}")
    print(f" Preloop || min val  = {min_val}")
    print(f" Preloop || cond = {curr_mae < min_mae}")
    if curr_mae < min_mae:
            min_mae = curr_mae
            min_val = s

print(f" Post || min_mae = { min_mae}")   
print(f" Post || min_val = { min_val}")   

# Store the best value of max_leaf_nodes (it will be either 5, 25, 50, 100, 250 or 500)
best_tree_size = min_val

# Check your answer
step_1.check()

内容的提问来源于stack exchange,提问作者HAK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:05:18