W1143661759 2024-08-04 21:16 采纳率: 60%
浏览 36

机器学习构建预测模型R2较低怎么优化代码

机器学习构建预测模型,R2卡在0.6-0.69不动,网格搜索和贝叶斯优化以及前后两者结合调整超参数都不能将R2提升,该怎么办

数据100组,三个特征变量,一个目标变量。进行过异常值剔除
剔除代码

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 从CSV文件读取数据
file_path = 'C:/Users/GMQ/Desktop/data.csv'  # 替换成你的文件路径
df = pd.read_csv(file_path, header=None)  # 假设没有列名,使用默认的列索引

# 分离特征和目标变量
features = df.iloc[:-1]  # 前三行是特征
target = df.iloc[-1]  # 最后一行是目标变量

# 绘制箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=features.T)  # 转置以便每一列是一个特征
plt.title('Boxplot of Features')
plt.xticks(rotation=45)
plt.show()

# 处理异常值
for column in features.columns:
    Q1 = features[column].quantile(0.25)
    Q3 = features[column].quantile(0.75)
    IQR = Q3 - Q1
    
    # 根据箱线图定义删除或替换异常值
    features[column] = features[column].clip(lower=Q1 - 1.5 * IQR, upper=Q3 + 1.5 * IQR)
    # 或者替换为中位数
    # median = features[column].median()
    # features[column] = features[column].where((features[column] >= Q1 - 1.5 * IQR) & (features[column] <= Q3 + 1.5 * IQR), median)

# 处理后的数据集
processed_df = pd.concat([features, target], axis=0)

# 保存处理后的数据集到CSV文件
processed_file_path = 'processed_data.csv'  # 替换成你想要保存的文件路径
processed_df.to_csv(processed_file_path, index=False, header=False)  # 不保存索引和列名


模型代码

import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import r2_score, mean_absolute_error
from skopt import BayesSearchCV

# 1. 加载数据
file_path = 'C:/Users/GMQ/Desktop/processed_data.csv'  # 修改为你的数据文件路径
df = pd.read_csv(file_path)

# 假设数据包含四列,前三列为特征变量,最后一列为目标变量
X = df.iloc[:, :-1]
y = df.iloc[:, -1]

# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 定义梯度提升回归模型
model = GradientBoostingRegressor(random_state=42)

# 4. 第一阶段:网格搜索
param_grid = {
    'n_estimators': [200, 300, 400],
    'learning_rate': [0.01, 0.05, 0.1],
    'max_depth': [5, 7, 9]
}

grid_search = GridSearchCV(
    estimator=model,
    param_grid=param_grid,
    scoring='r2',
    cv=5,
    verbose=1,
    n_jobs=-1
)

grid_search.fit(X_train, y_train)

# 获取网格搜索的最佳参数
best_params_grid = grid_search.best_params_

# 5. 第二阶段:贝叶斯优化
param_space = {
    'n_estimators': (best_params_grid['n_estimators'] - 50, best_params_grid['n_estimators'] + 50),
    'learning_rate': (best_params_grid['learning_rate'] * 0.5, best_params_grid['learning_rate'] * 1.5, 'log-uniform'),
    'max_depth': (best_params_grid['max_depth'] - 2, best_params_grid['max_depth'] + 2)
}

bayes_search = BayesSearchCV(
    estimator=model,
    search_spaces=param_space,
    scoring='r2',
    cv=5,
    n_iter=50,          # 迭代次数,可以根据计算资源和时间进行调整
    random_state=42,
    verbose=1,
    n_jobs=-1           # 并行处理的作业数,-1表示使用所有可用的CPU核心
)

bayes_search.fit(X_train, y_train)

# 获取最佳参数和最佳分数
best_params_bayes = bayes_search.best_params_
best_score_bayes = bayes_search.best_score_

# 训练最终模型(使用最佳参数)
best_params_grid.update(best_params_bayes)  # 更新参数为网格搜索和贝叶斯优化得到的最佳参数
model.set_params(**best_params_grid)
model.fit(X_train, y_train)

# 在测试集上评估模型
y_pred = model.predict(X_test)
r2 = r2_score(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)

# 打印模型优化结果
print("\n梯度提升回归模型优化结果:")
print(f"最佳参数: {best_params_grid}")
print(f"最佳R^2分数: {best_score_bayes:.4f}")
print(f"测试集上的R^2分数: {r2:.4f}")
print(f"测试集上的平均绝对误差: {mae:.4f}")
print("------------------------------------------------------------")


  • 写回答

1条回答 默认 最新

  • 专家-司宇[在线] 2024-08-04 21:16
    关注

    引自免费微信小程序:皆我百晓生

    你已经进行了网格搜索和贝叶斯优化来调整参数,但R²分数仍然无法提升。在这种情况下,可以尝试以下几种策略来进一步优化你的模型:

    1. 特征工程:检查你的特征是否包含所有重要的相关信息。可能有些重要的特征被遗漏或者存在冗余、无关的特征。尝试进行特征选择、特征组合或创建新的特征,以提高模型的预测能力。
    2. 超参数优化:除了你已经在用的参数,还可以尝试调整其他超参数,比如决策树的子采样比例、最小分割点样本数等。这些参数可能对模型的性能有重要影响。
    3. 模型融合:尝试使用不同的模型并融合他们的预测结果。例如,你可以使用随机森林、支持向量回归(SVR)、神经网络等模型进行预测,然后平均或加权他们的预测结果。模型融合常常能带来性能的提升。
    4. 模型诊断和可视化:通过可视化模型的决策边界和重要性权重等方式,了解模型在哪些区域表现良好,哪些区域存在问题。这有助于发现数据中的潜在模式或异常值,从而调整模型或数据预处理步骤。
    5. 数据检查和处理:确保你的数据没有异常值或缺失值,它们可能对模型的训练产生负面影响。另外,检查数据的分布和是否存在离群值也是一个好的做法。如果数据有特定的分布模式(如噪声较多),可能需要采取特定的数据清洗或预处理步骤。
    6. 使用集成方法:考虑使用像Boosting或者Bagging这样的集成方法,这些方法通过组合多个模型来提高预测性能。例如,你可以尝试使用sklearn.ensemble.GradientBoostingRegressorn_subsamples参数来进行子采样,以构建一种基于梯度提升算法的bagging方法。或者你可以尝试使用随机森林等集成树模型。

    记住,机器学习是一个迭代过程,需要不断地尝试和调整。不要害怕尝试新的方法或调整你的策略,直到你找到最适合你数据和任务的模型为止。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 8月4日
  • 修改了问题 8月4日
  • 创建了问题 8月4日