如何在Python中通过循环寻找最大R²以优化随机森林决策树
解决RandomForest采样迭代找最优r值与训练集的问题
以下是修正后的循环迭代代码,同时针对你的需求做了关键逻辑的优化说明:
核心代码实现
import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier from scipy.stats import pearsonr import joblib # 加载你的数据集(替换为实际加载方式) df = pd.read_csv("your_dataset.csv") X = df[['DATA1', 'DATA2', 'DATA3']] y = df['target'] # 初始化最优结果存储变量 max_r = -1 # 皮尔逊r取值范围[-1,1],初始设为最小值 best_X_train = None best_y_train = None best_model = None n_iterations = 100 # 可根据需求调整迭代次数 # 循环迭代采样与模型训练 for iter_idx in range(n_iterations): # 手动实现Bootstrap有放回采样(能直接获取训练集样本) sample_idx = np.random.choice(len(X), size=len(X), replace=True) X_train = X.iloc[sample_idx] y_train = y.iloc[sample_idx] # 训练随机森林模型 rf_model = RandomForestClassifier(bootstrap=True, random_state=iter_idx) rf_model.fit(X_train, y_train) # 计算特征与目标列的皮尔逊r(按你的需求调整计算逻辑) # 注:若你实际需要的是决定系数R²,可将r值平方后比较 r_list = [] for feat in X_train.columns: r, _ = pearsonr(X_train[feat], y_train) r_list.append(abs(r)) # 取绝对值仅关注相关性强度 current_r = np.mean(r_list) # 更新最优结果 if current_r > max_r: max_r = current_r best_X_train = X_train.copy() best_y_train = y_train.copy() best_model = rf_model # 打印迭代进度(可选) if (iter_idx + 1) % 10 == 0: print(f"迭代 {iter_idx+1}/{n_iterations} | 当前最优r值: {max_r:.4f}") # 保存最优训练集与模型 best_X_train.to_csv("best_X_train.csv", index=False) best_y_train.to_csv("best_y_train.csv", index=False) joblib.dump(best_model, "best_rf_model.pkl") print(f"迭代完成,最大r值为 {max_r:.4f},已保存最优训练集和模型")
关键逻辑说明
- 手动Bootstrap采样:由于RandomForest内部的Bootstrap采样无法直接导出训练集样本,因此手动实现有放回采样才能记录对应训练数据。
- r值计算调整:你提到“皮尔逊r代表决定系数”,这里存在概念混淆——决定系数是皮尔逊r的平方(
R² = r²),如果实际需求是R²,只需将代码中current_r替换为current_r ** 2即可。 - 随机种子设置:每次迭代使用不同的
random_state,保证采样的多样性;若需要复现结果,可固定种子序列。 - 迭代次数控制:
n_iterations可根据计算资源调整,次数越多找到最优样本的概率越高,但耗时也会增加。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

