3.2 回归任务 Scikit-learn 回归任务实践详解 3.2 回归任务:预测连续数值型目标 回归任务是机器学习中一类重要的任务,其目标是预测连续数值型目标变量。与分类任务预测离散类别标签不同,回归任务旨在建立模型来估计一个或多个自变量与一个连续因变量之间的关系。在现实世界中,回归任务应用广泛,例如: 房价预测: 根据房屋面积、地理位置、房间数量等特征预测房屋价格。 销售额预测: 基于广告投入、季节性因素、促销活动等预测产品销售额。 股票价格预测: 根据历史股价、市场指标、新闻情绪等预测股票未来价格(虽然股票预测非常复杂,但回归模型是其中一种方法)。 疾病风险评估: 基于患者的生理指标、生活习惯、家族病史等预测患病风险评分。
回归任务是机器学习中一类重要的任务,其目标是预测连续数值型目标变量。与分类任务预测离散类别标签不同,回归任务旨在建立模型来估计一个或多个自变量与一个连续因变量之间的关系。在现实世界中,回归任务应用广泛,例如:
房价预测: 根据房屋面积、地理位置、房间数量等特征预测房屋价格。
销售额预测: 基于广告投入、季节性因素、促销活动等预测产品销售额。
股票价格预测: 根据历史股价、市场指标、新闻情绪等预测股票未来价格(虽然股票预测非常复杂,但回归模型是其中一种方法)。
疾病风险评估: 基于患者的生理指标、生活习惯、家族病史等预测患病风险评分。
能源消耗预测: 根据天气状况、时间、工业活动等预测能源消耗量。
在深入代码实践之前,我们需要先了解回归任务的一些基本概念:
自变量 (Independent Variables) / 特征 (Features): 用于预测目标变量的输入变量,通常用矩阵 X 表示,每一列代表一个特征,每一行代表一个样本。
因变量 (Dependent Variable) / 目标变量 (Target Variable): 我们需要预测的连续数值型变量,通常用向量 y 表示。
回归模型 (Regression Model): 一个数学模型,用于学习自变量和因变量之间的关系。Scikit-learn 提供了多种回归模型,如线性回归、多项式回归、决策树回归、随机森林回归、支持向量回归等。
训练数据 (Training Data): 用于训练回归模型的数据集,包含已知自变量和对应的因变量。
测试数据 (Testing Data): 用于评估训练好的回归模型性能的数据集,模型在测试数据上进行预测,并将预测结果与真实值进行比较。
评估指标 (Evaluation Metrics): 用于衡量回归模型预测性能的指标,常用的指标包括均方误差 (MSE)、均方根误差 (RMSE)、平均绝对误差 (MAE)、R 平方 (R²) 等。
使用 Scikit-learn 进行回归任务通常遵循以下步骤:
数据准备 (Data Preparation):
加载数据集: 使用 Pandas 或 Scikit-learn 内置数据集加载数据。
数据预处理: 处理缺失值、异常值,进行特征缩放、特征编码等。
划分数据集: 将数据集划分为训练集和测试集,用于模型训练和评估。
模型选择 (Model Selection):
根据数据特点和问题需求选择合适的回归模型。
Scikit-learn 提供了多种回归模型,例如 LinearRegression, PolynomialFeatures, DecisionTreeRegressor, RandomForestRegressor, SVR 等。
模型训练 (Model Training):
使用训练集数据和选定的回归模型进行训练,学习模型参数。
使用 Scikit-learn 模型的 fit() 方法进行训练。
模型预测 (Model Prediction):
使用训练好的模型对测试集数据进行预测,得到预测结果。
使用 Scikit-learn 模型的 predict() 方法进行预测。
模型评估 (Model Evaluation):
使用测试集数据和评估指标评估模型性能。
Scikit-learn 提供了多种评估指标,例如 mean_squared_error, mean_absolute_error, r2_score 等。
模型优化 (Model Optimization, 可选):
通过调整模型超参数、特征工程等方法优化模型性能。
可以使用 GridSearchCV, RandomizedSearchCV 等方法进行超参数调优。
接下来,我们将通过具体的代码示例,详细讲解每个步骤在 Scikit-learn 中的实践应用。
线性回归是最简单且常用的回归模型之一,它假设自变量和因变量之间存在线性关系。我们将使用 Scikit-learn 的 LinearRegression 模型进行实践。
1. 数据准备:加载数据集
我们使用 Scikit-learn 内置的波士顿房价数据集 load_boston() 作为示例数据集。
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split import pandas as pd # 加载波士顿房价数据集 boston = load_boston() X = pd.DataFrame(boston.data, columns=boston.feature_names) y = boston.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) print("训练集特征形状:", X_train.shape) print("测试集特征形状:", X_test.shape) print("训练集目标形状:", y_train.shape) print("测试集目标形状:", y_test.shape)
代码详解:
from sklearn.datasets import load_boston: 导入 Scikit-learn 数据集模块中的 load_boston 函数,用于加载波士顿房价数据集。
from sklearn.model_selection import train_test_split: 导入 train_test_split 函数,用于划分训练集和测试集。
import pandas as pd: 导入 Pandas 库,用于数据处理和DataFrame创建。
boston = load_boston(): 加载波士顿房价数据集,返回一个 Bunch 对象,包含数据和元数据。
X = pd.DataFrame(boston.data, columns=boston.feature_names): 将特征数据转换为 Pandas DataFrame,并设置列名。
y = boston.target: 获取目标变量(房价)。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42): 将数据集划分为训练集和测试集,test_size=0.2 表示测试集占比 20%,random_state=42 设置随机种子以保证结果可复现。
print(...): 打印训练集和测试集的形状,确认数据划分结果。
2. 模型选择:线性回归模型
选择 LinearRegression 模型。
from sklearn.linear_model import LinearRegression # 创建线性回归模型实例 model = LinearRegression()
代码详解:
from sklearn.linear_model import LinearRegression: 导入线性回归模型类 LinearRegression。
model = LinearRegression(): 创建 LinearRegression 模型的实例。
3. 模型训练:使用训练集数据训练模型
使用 fit() 方法训练模型。
# 使用训练集数据训练模型 model.fit(X_train, y_train)
代码详解:
model.fit(X_train, y_train): 使用训练集特征 X_train 和目标变量 y_train 训练线性回归模型。fit() 方法会学习线性回归模型的参数(系数和截距)。4. 模型预测:使用测试集数据进行预测
使用 predict() 方法进行预测。
# 使用测试集数据进行预测 y_pred = model.predict(X_test)
代码详解:
y_pred = model.predict(X_test): 使用训练好的模型对测试集特征 X_test 进行预测,得到预测结果 y_pred。5. 模型评估:评估模型性能
使用常用的回归评估指标评估模型性能。
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score # 评估模型性能 mse = mean_squared_error(y_test, y_pred) mae = mean_absolute_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print("均方误差 (MSE):", mse) print("平均绝对误差 (MAE):", mae) print("R 平方 (R²):", r2)
代码详解:
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score: 导入评估指标函数。
mse = mean_squared_error(y_test, y_pred): 计算均方误差 (MSE),衡量预测值与真实值之间的平方误差的平均值,值越小模型性能越好。
mae = mean_absolute_error(y_test, y_pred): 计算平均绝对误差 (MAE),衡量预测值与真实值之间绝对误差的平均值,值越小模型性能越好。
r2 = r2_score(y_test, y_pred): 计算 R 平方 (R²),衡量模型解释目标变量方差的比例,值越接近 1 模型性能越好。
print(...): 打印评估指标结果。
运行结果示例 (结果可能因随机种子略有不同):
均方误差 (MSE): 24.291119474973417 平均绝对误差 (MAE): 3.1890919673307966 R 平方 (R²): 0.6687594935356373
结果分析:
MSE 和 MAE 的值表示预测房价的误差大小,数值越小越好。
R² 的值接近 0.67,表示线性回归模型可以解释大约 67% 的房价方差,模型性能尚可,但仍有提升空间。
线性回归假设线性关系,但现实世界中很多关系是非线性的。多项式回归通过引入特征的多项式项,可以拟合非线性关系。
我们将继续使用波士顿房价数据集,并尝试使用多项式回归。
1. 数据准备:与线性回归相同
数据加载和划分与线性回归示例相同。
2. 特征转换:多项式特征
使用 PolynomialFeatures 进行特征转换,生成多项式特征。
from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline # 创建多项式特征转换器,degree=2 表示生成 2 次多项式特征 poly_features = PolynomialFeatures(degree=2) # 创建线性回归模型 lin_reg = LinearRegression() # 创建 Pipeline 将特征转换和线性回归模型串联起来 polynomial_regression = Pipeline([ ("poly_features", poly_features), ("lin_reg", lin_reg), ])
代码详解:
from sklearn.preprocessing import PolynomialFeatures: 导入多项式特征转换器 PolynomialFeatures。
from sklearn.pipeline import Pipeline: 导入 Pipeline,用于将多个处理步骤串联起来。
poly_features = PolynomialFeatures(degree=2): 创建 PolynomialFeatures 实例,degree=2 表示生成 2 次多项式特征(例如,如果原始特征是 x1, x2,则生成 1, x1, x2, x1², x1x2, x2²)。
lin_reg = LinearRegression(): 创建线性回归模型实例。
polynomial_regression = Pipeline([...]): 创建 Pipeline,将 poly_features 和 lin_reg 串联起来。Pipeline 可以简化代码,并方便进行交叉验证和参数调优。
3. 模型训练:使用训练集数据训练模型
使用 Pipeline 的 fit() 方法进行训练,Pipeline 会自动先进行特征转换,再训练线性回归模型。
# 使用训练集数据训练多项式回归模型 polynomial_regression.fit(X_train, y_train)
代码详解:
polynomial_regression.fit(X_train, y_train): 使用训练集特征 X_train 和目标变量 y_train 训练多项式回归模型。Pipeline 会先使用 poly_features 对 X_train 进行多项式特征转换,然后使用 lin_reg 对转换后的特征进行线性回归模型训练。4. 模型预测:使用测试集数据进行预测
使用 Pipeline 的 predict() 方法进行预测,Pipeline 会自动先进行特征转换,再进行预测。
# 使用测试集数据进行预测 y_poly_pred = polynomial_regression.predict(X_test)
代码详解:
y_poly_pred = polynomial_regression.predict(X_test): 使用训练好的多项式回归模型对测试集特征 X_test 进行预测。Pipeline 会先使用 poly_features 对 X_test 进行多项式特征转换,然后使用 lin_reg 对转换后的特征进行预测。5. 模型评估:评估模型性能
评估模型性能的方式与线性回归相同。
# 评估多项式回归模型性能 poly_mse = mean_squared_error(y_test, y_poly_pred) poly_mae = mean_absolute_error(y_test, y_poly_pred) poly_r2 = r2_score(y_test, y_poly_pred) print("多项式回归 均方误差 (MSE):", poly_mse) print("多项式回归 平均绝对误差 (MAE):", poly_mae) print("多项式回归 R 平方 (R²):", poly_r2)
运行结果示例 (结果可能因随机种子略有不同):
多项式回归 均方误差 (MSE): 18.888124178960155 多项式回归 平均绝对误差 (MAE): 2.784541718645522 多项式回归 R 平方 (R²): 0.7415132188775808
结果分析:
与线性回归相比,多项式回归的 MSE 和 MAE 更小,R² 更高,表明多项式回归模型在波士顿房价数据集上表现更好。
这说明波士顿房价与特征之间可能存在一定的非线性关系,多项式回归模型能够更好地捕捉这种非线性关系。
决策树回归是一种基于树结构的非线性回归模型,它通过递归地将特征空间划分为不同的区域,并在每个区域内进行常数预测。
1. 数据准备:与线性回归相同
数据加载和划分与线性回归示例相同。
2. 模型选择:决策树回归模型
选择 DecisionTreeRegressor 模型。
from sklearn.tree import DecisionTreeRegressor # 创建决策树回归模型实例 tree_reg = DecisionTreeRegressor(random_state=42)
代码详解:
from sklearn.tree import DecisionTreeRegressor: 导入决策树回归模型类 DecisionTreeRegressor。
tree_reg = DecisionTreeRegressor(random_state=42): 创建 DecisionTreeRegressor 模型的实例,random_state=42 设置随机种子以保证结果可复现。
3. 模型训练:使用训练集数据训练模型
使用 fit() 方法训练模型。
# 使用训练集数据训练决策树回归模型 tree_reg.fit(X_train, y_train)
4. 模型预测:使用测试集数据进行预测
使用 predict() 方法进行预测。
# 使用测试集数据进行预测 y_tree_pred = tree_reg.predict(X_test)
5. 模型评估:评估模型性能
评估模型性能的方式与线性回归相同。
# 评估决策树回归模型性能 tree_mse = mean_squared_error(y_test, y_tree_pred) tree_mae = mean_absolute_error(y_test, y_tree_pred) tree_r2 = r2_score(y_test, y_tree_pred) print("决策树回归 均方误差 (MSE):", tree_mse) print("决策树回归 平均绝对误差 (MAE):", tree_mae) print("决策树回归 R 平方 (R²):", tree_r2)
运行结果示例 (结果可能因随机种子略有不同):
决策树回归 均方误差 (MSE): 24.749117647058822 决策树回归 平均绝对误差 (MAE): 3.203921568627451 决策树回归 R 平方 (R²): 0.6625311695980789
结果分析:
决策树回归模型的性能与线性回归模型接近,但略差于多项式回归模型。
决策树回归模型能够处理非线性关系,但容易过拟合训练数据,尤其是在树深度没有限制的情况下。
随机森林回归是一种集成学习方法,它通过构建多个决策树并取平均预测结果来提高模型性能和鲁棒性。
1. 数据准备:与线性回归相同
数据加载和划分与线性回归示例相同。
2. 模型选择:随机森林回归模型
选择 RandomForestRegressor 模型。
from sklearn.ensemble import RandomForestRegressor # 创建随机森林回归模型实例 forest_reg = RandomForestRegressor(n_estimators=100, random_state=42)
代码详解:
from sklearn.ensemble import RandomForestRegressor: 导入随机森林回归模型类 RandomForestRegressor。
forest_reg = RandomForestRegressor(n_estimators=100, random_state=42): 创建 RandomForestRegressor 模型的实例,n_estimators=100 表示森林中决策树的数量,random_state=42 设置随机种子以保证结果可复现。
3. 模型训练:使用训练集数据训练模型
使用 fit() 方法训练模型。
# 使用训练集数据训练随机森林回归模型 forest_reg.fit(X_train, y_train)
4. 模型预测:使用测试集数据进行预测
使用 predict() 方法进行预测。
# 使用测试集数据进行预测 y_forest_pred = forest_reg.predict(X_test)
5. 模型评估:评估模型性能
评估模型性能的方式与线性回归相同。
# 评估随机森林回归模型性能 forest_mse = mean_squared_error(y_test, y_forest_pred) forest_mae = mean_absolute_error(y_test, y_forest_pred) forest_r2 = r2_score(y_test, y_forest_pred) print("随机森林回归 均方误差 (MSE):", forest_mse) print("随机森林回归 平均绝对误差 (MAE):", forest_mae) print("随机森林回归 R 平方 (R²):", forest_r2)
运行结果示例 (结果可能因随机种子略有不同):
随机森林回归 均方误差 (MSE): 10.871545137254902 随机森林回归 平均绝对误差 (MAE): 2.1008235294117647 随机森林回归 R 平方 (R²): 0.857135464922221
结果分析:
随机森林回归模型的 MSE 和 MAE 最小,R² 最高,表明随机森林回归模型在波士顿房价数据集上表现最佳。
随机森林回归通过集成多个决策树,有效地降低了过拟合风险,提高了模型的泛化能力和预测精度。
模型的性能可以通过调整超参数进行优化。对于随机森林回归模型,n_estimators (决策树数量), max_depth (树的最大深度), min_samples_split (分裂节点所需的最小样本数) 等都是重要的超参数。我们可以使用 GridSearchCV 或 RandomizedSearchCV 进行超参数调优。
以下示例使用 GridSearchCV 对随机森林回归模型进行超参数调优。
from sklearn.model_selection import GridSearchCV # 定义超参数网格 param_grid = { 'n_estimators': [50, 100, 200], 'max_depth': [None, 10, 20], 'min_samples_split': [2, 5, 10] } # 创建 GridSearchCV 对象 grid_search = GridSearchCV(estimator=RandomForestRegressor(random_state=42), param_grid=param_grid, cv=5, # 5 折交叉验证 scoring='neg_mean_squared_error', # 使用负均方误差作为评分标准 n_jobs=-1) # 使用所有 CPU 核心 # 进行网格搜索 grid_search.fit(X_train, y_train) # 打印最佳超参数和最佳得分 print("最佳超参数:", grid_search.best_params_) print("最佳得分 (负均方误差):", grid_search.best_score_) # 使用最佳超参数的模型进行预测 best_forest_reg = grid_search.best_estimator_ y_best_forest_pred = best_forest_reg.predict(X_test) # 评估最佳模型性能 best_forest_mse = mean_squared_error(y_test, y_best_forest_pred) best_forest_mae = mean_absolute_error(y_test, y_best_forest_pred) best_forest_r2 = r2_score(y_test, y_best_forest_pred) print("最佳随机森林回归 均方误差 (MSE):", best_forest_mse) print("最佳随机森林回归 平均绝对误差 (MAE):", best_forest_mae) print("最佳随机森林回归 R 平方 (R²):", best_forest_r2)
代码详解:
from sklearn.model_selection import GridSearchCV: 导入网格搜索交叉验证类 GridSearchCV。
param_grid = {...}: 定义超参数网格,包含需要调优的超参数及其候选值。
grid_search = GridSearchCV(...): 创建 GridSearchCV 对象,estimator 指定模型,param_grid 指定超参数网格,cv=5 表示 5 折交叉验证,scoring='neg_mean_squared_error' 指定评分标准为负均方误差(因为 GridSearchCV 默认是最大化评分,而 MSE 是越小越好,所以使用负 MSE)。 n_jobs=-1 表示使用所有 CPU 核心并行计算。
grid_search.fit(X_train, y_train): 使用训练集数据进行网格搜索和模型训练。
print("最佳超参数:", grid_search.best_params_): 打印找到的最佳超参数组合。
print("最佳得分 (负均方误差):", grid_search.best_score_): 打印最佳得分(负均方误差)。
best_forest_reg = grid_search.best_estimator_: 获取使用最佳超参数训练的模型。
y_best_forest_pred = best_forest_reg.predict(X_test): 使用最佳模型进行预测。
print(...): 评估最佳模型性能。
运行结果示例 (结果可能因随机种子略有不同):
最佳超参数: {'max_depth': None, 'min_samples_split': 2, 'n_estimators': 200} 最佳得分 (负均方误差): -19.423873179276284 最佳随机森林回归 均方误差 (MSE): 9.84461830392157 最佳随机森林回归 平均绝对误差 (MAE): 2.051941176470588 最佳随机森林回归 R 平方 (R²): 0.8708047783243537
结果分析:
通过超参数调优,随机森林回归模型的性能得到了进一步提升,MSE 和 MAE 进一步降低,R² 进一步升高。
GridSearchCV 遍历了所有超参数组合,找到在交叉验证中表现最佳的超参数组合,并使用这些超参数重新训练了模型,从而优化了模型性能。
总结:
Scikit-learn 提供了丰富的回归模型和工具,使得回归任务的实现变得简单高效。
线性回归适用于线性关系数据,多项式回归可以拟合非线性关系,决策树回归和随机森林回归是强大的非线性模型,随机森林回归通常具有更好的泛化能力。
模型评估是回归任务的重要环节,常用的评估指标包括 MSE, MAE, R² 等。
超参数调优可以进一步优化模型性能,常用的方法包括 GridSearchCV 和 RandomizedSearchCV。
展望:
除了本文介绍的回归模型,Scikit-learn 还提供了其他回归模型,例如支持向量回归 (SVR), 梯度提升回归树 (GBRT) 等,可以根据具体问题选择合适的模型。
特征工程是提升回归模型性能的重要手段,例如特征缩放、特征编码、特征选择、特征构造等。
模型集成学习是提高模型鲁棒性和预测精度的有效方法,除了随机森林,还有梯度提升树、Stacking 等集成学习方法。
实际应用中,需要根据具体问题和数据特点选择合适的回归模型、评估指标和优化方法,并进行充分的实验和调优,才能获得最佳的预测效果。
希望本文能够帮助读者掌握 Scikit-learn 回归任务的基本知识和实践技能,并能够运用 Scikit-learn 解决实际的回归问题。通过不断学习和实践,相信读者可以成为熟练的机器学习工程师。