如何用Python循环寻找使Class 1.0召回率最高的random_state
寻找使Class 1.0召回率最高的random_state值
你的原代码存在核心问题:模型训练、评估的代码都在for循环外部,实际上只使用了最后一次循环(i=999)的数据集划分,根本没遍历所有random_state值。要实现需求,需把所有逻辑放入循环内,同时记录每次的召回率和对应random_state。
以下是修改后的完整代码:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # 加载并预处理数据 dataw = pd.read_csv('bankrup.csv') dataw = dataw.dropna() X = dataw.values[:, 1:] y = dataw.values[:, 0] print("Logistic regression") # 初始化变量记录最优结果 best_recall = 0.0 best_random_state = 0 # 遍历1000个random_state值 for i in range(1000): # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=i) # 训练模型 logreg = LogisticRegression(solver='lbfgs', max_iter=5000, class_weight="balanced") logreg.fit(X_train, y_train) # 预测并生成字典格式的分类报告,方便提取指标 y_pred = logreg.predict(X_test) report = classification_report(y_test, y_pred, output_dict=True) # 提取Class 1.0的召回率 current_recall = report['1.0']['recall'] # 比较并更新最优结果 if current_recall > best_recall: best_recall = current_recall best_random_state = i # 可选:打印当前循环结果,方便监控 # print(f"random_state={i}, Class 1.0召回率={current_recall:.4f}") # 输出最终最优结果 print(f"\n最优random_state值: {best_random_state}") print(f"对应的Class 1.0最高召回率: {best_recall:.4f}")
关键说明:
- 将模型训练、预测、评估的所有代码放入for循环内部,确保每个random_state都对应完整的训练-评估流程
- 使用
classification_report(output_dict=True)将报告转为字典,直接通过键值对提取Class 1.0的召回率,避免解析文本的麻烦 - 初始化
best_recall和best_random_state变量,每次循环对比当前召回率,更新最优值 - 可选的打印语句可帮你监控每个循环的运行情况,调试时实用
内容的提问来源于stack exchange,提问作者matth
相关产品推荐
相关产品推荐

