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

