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
相关产品推荐
相关产品推荐

