Python数据挖掘之回归
文章目录
- 通用准备代码(一次写好,后面示例直接用)
- 1) 线性回归(Ordinary Least Squares)
- 2) 岭回归(Ridge)
- 3) LASSO 回归(L1)
- 4) 弹性网(Elastic Net)
- 5) Huber 回归(鲁棒线性)
- 6) 贝叶斯岭回归(Bayesian Ridge)
- 7) 支持向量回归(SVR, RBF 核)
- 8) K 近邻回归(KNN)
- 9) 决策树回归(Decision Tree)
- 10) 随机森林回归(Random Forest)
- 11) 梯度提升回归(Gradient Boosting)
- 12) 极端随机树回归(Extra Trees)
- 13) XGBoost / LightGBM(第三方库,选读)
- 批量比较:一键跑一圈
- 什么时候选谁?(简明指北)
- 评估与调参(简例)
- 案例讲解
- 一、数据准备
- 二、线性回归(Linear Regression)
- 三、K 最近邻回归(KNN Regressor)
- 四、决策树回归(Decision Tree Regressor)
- 五、支持向量回归(Support Vector Regressor, SVR)
- 六、R² 与 RMSE 的含义
- 七、简单总结
说明:Boston Housing 数据集因伦理与统计问题已在 sklearn 中下线,实际项目更推荐
fetch_california_housing。如果你仍要用boston.csv,请确保它包含经典 14 列:13 个特征 + 目标MEDV(常见列名:CRIM, ZN, INDUS, CHAS, NOX, RM, AGE, DIS, RAD, TAX, PTRATIO, B, LSTAT, MEDV)。
通用准备代码(一次写好,后面示例直接用)
import pandas as pd
import numpy as np# 读取数据
df = pd.read_csv("boston.csv")# 适配常见列名;X 为 13 特征,y 为房价 MEDV
target_col = "MEDV"
X = df.drop(columns=[target_col]).values
y = df[target_col].valuesfrom sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.compose import ColumnTransformer# 简单切分(也可只用交叉验证)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42
)def report(model, X_train=X_train, X_test=X_test, y_train=y_train, y_test=y_test, name=None):model.fit(X_train, y_train)pred = model.predict(X_test)rmse = mean_squared_error(y_test, pred, squared=False)r2 = r2_score(y_test, pred)print(f"[{name or model.__class__.__name__}] R2={r2:.3f}, RMSE={rmse:.3f}")
小贴士:含正则化的线性模型、SVR、KNN 等对特征量纲敏感,示例里多用
StandardScaler的Pipeline。
1) 线性回归(Ordinary Least Squares)
- 要点:无正则化,易过拟合/对多重共线性敏感,但可作为基线。
from sklearn.linear_model import LinearRegression
ols = LinearRegression()
report(ols, name="OLS")
2) 岭回归(Ridge)
- 要点:L2 正则化,缓解共线性与过拟合;超参
alpha越大惩罚越强。
from sklearn.linear_model import Ridge
ridge = make_pipeline(StandardScaler(), Ridge(alpha=1.0, random_state=42))
report(ridge, name="Ridge")
3) LASSO 回归(L1)
- 要点:L1 正则化,能做特征选择(稀疏解)。
from sklearn.linear_model import Lasso
lasso = make_pipeline(StandardScaler(), Lasso(alpha=0.05, random_state=42, max_iter=10000))
report(lasso, name="Lasso")
4) 弹性网(Elastic Net)
- 要点:L1+L2 折中,
l1_ratio控制比例。
from sklearn.linear_model import ElasticNet
enet = make_pipeline(StandardScaler(), ElasticNet(alpha=0.05, l1_ratio=0.5, random_state=42, max_iter=10000))
report(enet, name="ElasticNet")
5) Huber 回归(鲁棒线性)
- 要点:对离群点不敏感,兼顾稳健性与效率。
from sklearn.linear_model import HuberRegressor
huber = make_pipeline(StandardScaler(), HuberRegressor(epsilon=1.35))
report(huber, name="Huber")
6) 贝叶斯岭回归(Bayesian Ridge)
- 要点:在岭回归框架下做参数的不确定性估计。
from sklearn.linear_model import BayesianRidge
bayes_ridge = make_pipeline(StandardScaler(), BayesianRidge())
report(bayes_ridge, name="BayesianRidge")
7) 支持向量回归(SVR, RBF 核)
- 要点:可拟合非线性关系;
C、gamma、epsilon较敏感。
from sklearn.svm import SVR
svr = make_pipeline(StandardScaler(), SVR(kernel="rbf", C=10.0, gamma="scale", epsilon=0.1))
report(svr, name="SVR (RBF)")
8) K 近邻回归(KNN)
- 要点:基于局部样本;
n_neighbors、距离度量敏感;需标准化。
from sklearn.neighbors import KNeighborsRegressor
knn = make_pipeline(StandardScaler(), KNeighborsRegressor(n_neighbors=5, weights="distance"))
report(knn, name="KNN")
9) 决策树回归(Decision Tree)
- 要点:可解释性强;易过拟合,需控制
max_depth等。
from sklearn.tree import DecisionTreeRegressor
dt = DecisionTreeRegressor(max_depth=5, random_state=42)
report(dt, name="DecisionTree")
10) 随机森林回归(Random Forest)
- 要点:基于 Bagging 的集成,稳健、调参友好、抗过拟合。
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=300, max_depth=None, random_state=42, n_jobs=-1)
report(rf, name="RandomForest")
11) 梯度提升回归(Gradient Boosting)
- 要点:弱学习器逐步纠错,拟合能力强;关注
learning_rate、n_estimators。
from sklearn.ensemble import GradientBoostingRegressor
gbr = GradientBoostingRegressor(n_estimators=500, learning_rate=0.05, max_depth=3, random_state=42)
report(gbr, name="GradientBoosting")
12) 极端随机树回归(Extra Trees)
- 要点:更激进的随机化,速度快、方差低。
from sklearn.ensemble import ExtraTreesRegressor
etr = ExtraTreesRegressor(n_estimators=400, random_state=42, n_jobs=-1)
report(etr, name="ExtraTrees")
13) XGBoost / LightGBM(第三方库,选读)
- 要点:工业界常用的高性能 boosting。需要安装相应库(
xgboost/lightgbm)。
# pip install xgboost
from xgboost import XGBRegressor
xgb = XGBRegressor(n_estimators=800, learning_rate=0.05, max_depth=4,subsample=0.9, colsample_bytree=0.9, random_state=42, n_jobs=-1
)
report(xgb, name="XGBoost")
批量比较:一键跑一圈
models = {"OLS": LinearRegression(),"Ridge": make_pipeline(StandardScaler(), Ridge(alpha=1.0, random_state=42)),"Lasso": make_pipeline(StandardScaler(), Lasso(alpha=0.05, random_state=42, max_iter=10000)),"ElasticNet": make_pipeline(StandardScaler(), ElasticNet(alpha=0.05, l1_ratio=0.5, random_state=42, max_iter=10000)),"Huber": make_pipeline(StandardScaler(), HuberRegressor()),"BayesianRidge": make_pipeline(StandardScaler(), BayesianRidge()),"SVR(RBF)": make_pipeline(StandardScaler(), SVR(C=10.0, epsilon=0.1)),"KNN": make_pipeline(StandardScaler(), KNeighborsRegressor(n_neighbors=5, weights="distance")),"DecisionTree": DecisionTreeRegressor(max_depth=5, random_state=42),"RandomForest": RandomForestRegressor(n_estimators=300, random_state=42, n_jobs=-1),"GradientBoosting": GradientBoostingRegressor(n_estimators=500, learning_rate=0.05, max_depth=3, random_state=42),"ExtraTrees": ExtraTreesRegressor(n_estimators=400, random_state=42, n_jobs=-1),
}for name, m in models.items():report(m, name=name)
什么时候选谁?(简明指北)
- 数据线性、特征少/可解释性高:
OLS/Ridge/Lasso/ElasticNet,其中 Lasso 便于做特征选择。 - 有离群点:
HuberRegressor、树模型/集成模型。 - 潜在非线性:
SVR(中小样本)、KNN(局部性)、树/森林/Boosting(通吃)。 - 追求开箱即用的稳健:
RandomForest、ExtraTrees。 - 要极致效果/可投入调参:
GradientBoosting、XGBoost/LightGBM。
评估与调参(简例)
from sklearn.model_selection import GridSearchCVparam_grid = {"randomforestregressor__n_estimators": [200, 400, 800],"randomforestregressor__max_depth": [None, 6, 10]
}
pipe = make_pipeline(RandomForestRegressor(random_state=42))
gs = GridSearchCV(pipe, param_grid, scoring="neg_root_mean_squared_error", cv=5, n_jobs=-1)
gs.fit(X, y)
print(gs.best_params_, -gs.best_score_)
案例讲解
四个常见回归算法(线性回归、KNN、决策树、支持向量机)** 的完整示例,并讲解 R² 与 RMSE 的含义。
我们使用经典的 波士顿房价数据集(Boston Housing)。
一、数据准备
在新版 sklearn 中,
load_boston已被移除,因此这里用fetch_california_housing代替演示。如果你有本地boston.csv,把数据读取部分换成pd.read_csv("boston.csv")即可。
import numpy as np
import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score, mean_squared_error
import matplotlib.pyplot as plt# 加载数据
data = fetch_california_housing()
X = data.data
y = data.target
feature_names = data.feature_names# 切分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)def evaluate_model(model, name):model.fit(X_train, y_train)y_pred = model.predict(X_test)r2 = r2_score(y_test, y_pred)rmse = mean_squared_error(y_test, y_pred, squared=False)print(f"{name}: R2 = {r2:.3f}, RMSE = {rmse:.3f}")plt.figure()plt.scatter(y_test, y_pred)plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()])plt.xlabel("True Price")plt.ylabel("Predicted Price")plt.title(f"{name} (R2={r2:.3f}, RMSE={rmse:.3f})")plt.show()
二、线性回归(Linear Regression)
from sklearn.linear_model import LinearRegressionlr = LinearRegression()
evaluate_model(lr, "Linear Regression")
原理:
-
假设目标变量与各特征存在线性关系:
y ^ = w 0 + w 1 x 1 + w 2 x 2 + ⋯ + w n x n \hat{y} = w_0 + w_1x_1 + w_2x_2 + \cdots + w_nx_n y^=w0+w1x1+w2x2+⋯+wnxn
-
通过最小化残差平方和(OLS)求得系数。
特点:
- 简单、易解释,但不能捕捉非线性关系。
- 对异常值敏感。
三、K 最近邻回归(KNN Regressor)
from sklearn.neighbors import KNeighborsRegressorfrom sklearn.pipeline import make_pipeline
knn = make_pipeline(StandardScaler(), KNeighborsRegressor(n_neighbors=5, weights="distance"))
evaluate_model(knn, "KNN Regressor")
原理:
- 对预测样本,找到最近的
k个训练样本。 - 取这些样本目标值的平均(或加权平均)作为预测。
- 无训练过程(惰性学习),预测时计算距离。
特点:
- 简单直观,适合小数据集。
- 对特征量纲敏感,需标准化。
k过小易过拟合,过大易欠拟合。
四、决策树回归(Decision Tree Regressor)
from sklearn.tree import DecisionTreeRegressordt = DecisionTreeRegressor(max_depth=5, random_state=42)
evaluate_model(dt, "Decision Tree Regressor")
原理:
- 递归地划分特征空间,使得每个子区域内目标值尽量相似。
- 预测值为叶节点样本的平均值。
特点:
- 能捕捉非线性关系。
- 可解释性强。
- 易过拟合(需控制
max_depth、min_samples_split等)。
五、支持向量回归(Support Vector Regressor, SVR)
from sklearn.svm import SVRsvr = make_pipeline(StandardScaler(), SVR(kernel="rbf", C=10, epsilon=0.1))
evaluate_model(svr, "Support Vector Regressor")
原理:
- 试图找到一个“最平滑”的函数,使误差在
ε范围内尽量小。 - 使用核函数(RBF、多项式等)映射到高维空间建模非线性。
特点:
- 拟合能力强、抗过拟合。
- 对参数(C、γ、ε)较敏感。
- 计算复杂度高。
六、R² 与 RMSE 的含义
| 指标 | 公式 | 含义 | 理想值 |
|---|---|---|---|
| R²(决定系数) | R 2 = 1 − S S r e s S S t o t R^2 = 1 - \frac{SS_{res}}{SS_{tot}} R2=1−SStotSSres | 衡量模型解释目标变量方差的比例。 R² 越接近 1,模型解释能力越强; 若 R² < 0,说明模型还不如简单的平均值预测。 | 越接近 1 越好 |
| RMSE(均方根误差) | R M S E = 1 n ∑ ( y i − y ^ i ) 2 RMSE = \sqrt{\frac{1}{n} \sum (y_i - \hat{y}_i)^2} RMSE=n1∑(yi−y^i)2 | 衡量预测值与真实值的平均偏差,单位与目标变量相同。 反映“预测误差”的绝对大小。 | 越小越好 |
🧠 直观理解:
- R² 看模型“解释能力”——它告诉我们模型能解释多少数据的变化;
- RMSE 看“误差量级”——它告诉我们预测值平均离真实值有多远。
七、简单总结
| 模型 | 是否线性 | 是否需要标准化 | 优点 | 缺点 |
|---|---|---|---|---|
| 线性回归 | 是 | 否 | 简单、可解释 | 不能处理非线性 |
| KNN | 否 | ✅ | 无需训练、非参数化 | 慢、对尺度敏感 |
| 决策树 | 否 | 否 | 可解释、非线性 | 易过拟合 |
| 支持向量机 | 否 | ✅ | 非线性强、泛化好 | 参数敏感、慢 |
