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

Python中for i in range循环仅迭代1次,需执行19次生成独立模型如何解决

问题根因

核心问题是你在循环内部直接修改了原始的df_result全局变量:

  • 第一次循环i=1时,执行df_result = df_result[df_result['Product'] == i]后,df_result已经被覆盖为只包含Product=1的子集
  • 第二次循环i=2时,你用已经过滤后的子集再次筛选Product==2的行,结果为空数据集,后续train_test_split会抛出异常,又因为你加了空的except: pass逻辑,所有错误都被静默吞掉,所以看起来循环只执行了一次就退出了。
修复方案

不要修改全局的df_result,每次循环用临时变量存储筛选后的产品数据即可,另外还要补充2个优化点避免其他隐藏问题:

  • 禁止使用空except,避免吞掉关键错误导致难以排查问题
  • 测试集不要调用fit_transform,直接用训练集拟合的scaler做transform,否则会出现数据泄露问题

修复后的代码如下:

for i in range(1,20):
    dtc = DecisionTreeClassifier()
    scaler = MinMaxScaler()
    # 用临时变量存储当前产品的数据集,不修改全局df_result
    current_df = df_result[df_result['Product'] == i]
    x = current_df[feature_colsx]
    y = current_df[feature_colsy]
    try:
        x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=.80)
        x_train = scaler.fit_transform(x_train)
        # 测试集只用transform,不要重新fit
        x_test = scaler.transform(x_test)
        dtc.fit(x_train, y_train.values.ravel())
        y_pred = dtc.predict(x_test)
        accuracy = dtc.score(x_train,y_train)
        Prd.append(i)
        Prdacc.append(accuracy)
        print(f"产品{i}训练准确率:{accuracy}")
        pickle.dump(dtc, open(f'model/{i}mod.pkl',"wb"))
        pickle.dump(scaler, open(f'model/{i}scl.pkl',"wb"))
    except Exception as e:
        # 打印错误信息,方便排查某类产品训练失败的原因
        print(f"产品{i}训练失败:{str(e)}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:24:03