Python循环合并与计算问题:为何仅能获取最后一个随机数对应的R2评分
Python循环合并与计算问题:为何仅能获取最后一个随机数对应的R2评分
嗨,我帮你找出问题所在啦!核心问题出在代码缩进和多余的循环上,导致你的模型训练逻辑只执行了最后一次:
问题分析
你写的第一个for _ in range(20):循环,只包含了生成随机数和打印随机数的代码,后面的数据集划分、模型训练、R2计算全部都在这个循环外面。这意味着程序会先跑完20次随机数生成(最后value变量只保留最后一个35),然后才执行一次模型训练和评分计算,自然只会输出最后一个数的结果。
另外,你写的for n in [value]:完全是多余的——[value]是只有一个元素的列表,这个循环只会执行一次,完全可以直接用value代替n。
修正后的代码
seed(4) for _ in range(20): value = randint(0, 100) print(value, end=', ') # 直接用当前的value作为random_state,不需要额外循环 X_train,X_test,y_train,y_test = train_test_split(df3_X1,df3_Y1, test_size=0.25, random_state=value) params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 5, 'learning_rate': 0.01, 'loss': 'ls'} estimators = [ ('svr', make_pipeline(StandardScaler(), SVR(kernel='rbf',C=0.6))), ('gb', GradientBoostingRegressor(random_state=0)) ] stack = StackingRegressor(estimators=estimators,final_estimator= RandomForestRegressor(n_estimators=100, random_state=0)) Final_model = stack.fit(X_train, y_train) predictions = Final_model.predict(X_test) y_bar = y_test.mean() ss_tot = ((y_test-y_bar)**2).sum() ss_res = ((y_test-predictions)**2).sum() r2_score = 1 - (ss_res/ss_tot) print(f'{value} r2_score is {r2_score}') print('The for loop is complete!')
修正说明
- 将模型训练、评分计算的所有代码缩进到第一个
for循环内部,这样每生成一个随机数,就会立刻执行一次完整的模型训练和评分流程。 - 去掉了多余的
for n in [value]:循环,直接用当前循环生成的value作为train_test_split的random_state参数。 - 调整了打印格式,让每个随机数和对应的R2评分对应得更清晰。
这样修改后,程序就会为每个生成的随机数计算并输出对应的R2评分啦!
备注:内容来源于stack exchange,提问作者Azar
相关产品推荐
相关产品推荐

