前言
之前的笔记已包括基础知识,现在将结合实际案例讲解线性回归的使用方法。
一、数据集准备与划分
1. 数据集简介
-
波士顿房价数据集:包含 506 条样本,13 个特征(如犯罪率、房间数等),目标值为房价中位数(MEDV)。
-
关键特征选择 :实验中选取
CRIM
(犯罪率)、RM
(房间数)、LSTAT
(低收入人群比例)三个特征进行建模。
2. 数据加载与预览
python
import pandas as pd
# 加载数据
df = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/1081/course-5-boston.csv")
df.head() # 查看前5行数据
3. 数据集划分
-
训练集:70% 数据用于模型训练。
-
测试集:30% 数据用于模型评估。
python
features = df[['crim', 'rm', 'lstat']] # 特征数据
target = df['medv'] # 目标值
split_num = int(len(features) * 0.7) # 70% 位置分割
X_train, y_train = features[:split_num], target[:split_num] # 训练集
X_test, y_test = features[split_num:], target[split_num:] # 测试集
关键点:
-
手动按顺序划分数据集可能导致数据分布不均衡,实际应用中建议使用
sklearn.model_selection.train_test_split
进行随机划分。 -
特征选择直接影响模型性能,需结合业务背景或特征重要性分析。
二、模型构建与训练
1. 使用 Scikit-learn 构建模型
python
from sklearn.linear_model import LinearRegression
model = LinearRegression() # 初始化线性回归模型
model.fit(X_train, y_train) # 训练模型
2. 输出模型参数
python
print("系数 (w):", model.coef_) # 特征权重
print("截距项 (b):", model.intercept_)
-
输出示例 :
系数 (w): [ 0.6997, 10.1356, -0.2053]
截距项 (b): -38.0
- 模型方程 :
关键点:
-
正系数表示特征与房价正相关(如
RM
房间数越多,房价越高)。 -
负系数表示特征与房价负相关(如
LSTAT
低收入人群比例越高,房价越低)。
三、模型评估
1. 预测与评估指标
python
preds = model.predict(X_test) # 输入测试集特征进行预测
2. 实现评估指标
-
平均绝对误差(MAE):
pythonimport numpy as np def mae_value(y_true, y_pred): return np.mean(np.abs(y_true - y_pred))
-
均方误差(MSE):
pythondef mse_value(y_true, y_pred): return np.mean(np.square(y_true - y_pred))
3. 评估结果
python
mae = mae_value(y_test.values, preds)
mse = mse_value(y_test.values, preds)
print("MAE:", mae) # 示例输出:MAE: 13.02
print("MSE:", mse) # 示例输出:MSE: 264.31
关键点:
-
MAE 更直观反映预测误差的实际大小。
-
MSE 对异常值更敏感(大误差被平方放大)。
-
本实验模型 MAE 为 4.11,而房价均值为 22,误差较大,需优化模型。
四、问题分析与改进方向
1. 模型性能不足的原因
-
特征选择:仅使用 3 个特征,未充分利用其他有效特征。
-
数据预处理:未处理异常值、缺失值,未进行特征缩放(如归一化)。
2. 改进方法
-
特征工程:
-
使用所有 13 个特征。
-
通过相关性分析选择高相关特征。
-
-
数据预处理:
-
标准化/归一化特征数据。
-
剔除异常值或进行数据变换(如对数变换)。
-
-
验证方法优化:
- 使用交叉验证(如 K-Fold)避免过拟合。
五、完整代码示例
python
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split # 改进:使用随机划分
# 加载数据
df = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/1081/course-5-boston.csv")
features = df[['crim', 'rm', 'lstat']]
target = df['medv']
# 随机划分数据集(改进点)
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.3, random_state=42)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测与评估
preds = model.predict(X_test)
mae = np.mean(np.abs(y_test - preds))
mse = np.mean((y_test - preds) ** 2)
print(f"模型系数: {model.coef_}, 截距: {model.intercept_}")
print(f"MAE: {mae:.2f}, MSE: {mse:.2f}")
![](https://i-blog.csdnimg.cn/direct/1d6bb365ac02428098c538688331ca63.png)
六、注意事项
-
数据泄露:避免在预处理时使用测试集信息(如均值、标准差)。
-
可解释性:线性回归模型系数可解释性强,适合业务分析。
-
局限性:线性回归假设特征与目标呈线性关系,实际数据可能需引入多项式特征。
通过本实战,可掌握线性回归从数据加载到模型评估的全流程,后续可结合特征工程和高级回归方法(如岭回归、Lasso)进一步提升性能。