Python数据挖掘之回归

文章目录

说明: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)。


通用准备代码(一次写好,后面示例直接用)

python 复制代码
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].values

from 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 等对特征量纲敏感,示例里多用 StandardScalerPipeline


1) 线性回归(Ordinary Least Squares)

  • 要点:无正则化,易过拟合/对多重共线性敏感,但可作为基线。
python 复制代码
from sklearn.linear_model import LinearRegression
ols = LinearRegression()
report(ols, name="OLS")

2) 岭回归(Ridge)

  • 要点 :L2 正则化,缓解共线性与过拟合;超参 alpha 越大惩罚越强。
python 复制代码
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 正则化,能做特征选择(稀疏解)。
python 复制代码
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 控制比例。
python 复制代码
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 回归(鲁棒线性)

  • 要点:对离群点不敏感,兼顾稳健性与效率。
python 复制代码
from sklearn.linear_model import HuberRegressor
huber = make_pipeline(StandardScaler(), HuberRegressor(epsilon=1.35))
report(huber, name="Huber")

6) 贝叶斯岭回归(Bayesian Ridge)

  • 要点:在岭回归框架下做参数的不确定性估计。
python 复制代码
from sklearn.linear_model import BayesianRidge
bayes_ridge = make_pipeline(StandardScaler(), BayesianRidge())
report(bayes_ridge, name="BayesianRidge")

7) 支持向量回归(SVR, RBF 核)

  • 要点 :可拟合非线性关系;Cgammaepsilon 较敏感。
python 复制代码
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、距离度量敏感;需标准化。
python 复制代码
from sklearn.neighbors import KNeighborsRegressor
knn = make_pipeline(StandardScaler(), KNeighborsRegressor(n_neighbors=5, weights="distance"))
report(knn, name="KNN")

9) 决策树回归(Decision Tree)

  • 要点 :可解释性强;易过拟合,需控制 max_depth 等。
python 复制代码
from sklearn.tree import DecisionTreeRegressor
dt = DecisionTreeRegressor(max_depth=5, random_state=42)
report(dt, name="DecisionTree")

10) 随机森林回归(Random Forest)

  • 要点:基于 Bagging 的集成,稳健、调参友好、抗过拟合。
python 复制代码
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_raten_estimators
python 复制代码
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)

  • 要点:更激进的随机化,速度快、方差低。
python 复制代码
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)。
python 复制代码
# 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")

批量比较:一键跑一圈

python 复制代码
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(通吃)。
  • 追求开箱即用的稳健RandomForestExtraTrees
  • 要极致效果/可投入调参GradientBoostingXGBoost/LightGBM

评估与调参(简例)

python 复制代码
from sklearn.model_selection import GridSearchCV

param_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") 即可。

python 复制代码
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)

python 复制代码
from sklearn.linear_model import LinearRegression

lr = 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)

python 复制代码
from sklearn.neighbors import KNeighborsRegressor

from 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)

python 复制代码
from sklearn.tree import DecisionTreeRegressor

dt = DecisionTreeRegressor(max_depth=5, random_state=42)
evaluate_model(dt, "Decision Tree Regressor")

原理:

  • 递归地划分特征空间,使得每个子区域内目标值尽量相似。
  • 预测值为叶节点样本的平均值。

特点:

  • 能捕捉非线性关系。
  • 可解释性强。
  • 易过拟合(需控制 max_depthmin_samples_split 等)。

五、支持向量回归(Support Vector Regressor, SVR)

python 复制代码
from sklearn.svm import SVR

svr = 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 衡量预测值与真实值的平均偏差,单位与目标变量相同。 反映"预测误差"的绝对大小。 越小越好

🧠 直观理解:

  • 看模型"解释能力"------它告诉我们模型能解释多少数据的变化;
  • RMSE 看"误差量级"------它告诉我们预测值平均离真实值有多远。

七、简单总结

模型 是否线性 是否需要标准化 优点 缺点
线性回归 简单、可解释 不能处理非线性
KNN 无需训练、非参数化 慢、对尺度敏感
决策树 可解释、非线性 易过拟合
支持向量机 非线性强、泛化好 参数敏感、慢

相关推荐
固定资产管理系统软件1 小时前
商务局RFID固定资产管理系统的应用价值与落地要点解析
大数据·python
TheBestRucy2 小时前
Python 九阳神功:从零筑基到线程飞升
服务器·开发语言·网络·人工智能·python
lancyu2 小时前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗2 小时前
Claude 使用指南
开发语言·python
工具分享2 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI3 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造3 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏3 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
230万光年的思念4 小时前
分子动力学模拟参考文献
python
HongXu_CaiYi4 小时前
0103-python相关-函数、文件
python