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 无需训练、非参数化 慢、对尺度敏感
决策树 可解释、非线性 易过拟合
支持向量机 非线性强、泛化好 参数敏感、慢

相关推荐
ColderYY2 小时前
python和mongodb交互
python·mongodb
c++服务器开发2 小时前
掌握RAG系统的七个优秀GitHub存储库
人工智能·python·github·rag
AI的费曼精神2 小时前
Python装饰器入门:让你的代码更优雅
python
熬夜敲代码的小N3 小时前
仓颉ArrayList动态数组源码分析:从底层实现到性能优化
数据结构·python·算法·ai·性能优化
yumgpkpm3 小时前
Hadoop大数据平台在中国AI时代的后续发展趋势研究CMP(类Cloudera CDP 7.3 404版华为鲲鹏Kunpeng)
大数据·hive·hadoop·python·zookeeper·oracle·cloudera
沉默媛3 小时前
如何下载安装以及使用labelme,一个可以打标签的工具,实现数据集处理,详细教程
图像处理·人工智能·python·yolo·计算机视觉
HMS Core3 小时前
【FAQ】HarmonyOS SDK 闭源开放能力 — Push Kit
linux·python·华为·harmonyos
CODE_RabbitV4 小时前
【1min 速通 -- PyTorch 张量数据类型】张量类型的获取、转化与判别
人工智能·pytorch·python
程序猿20234 小时前
Python每日一练---第九天:H指数
开发语言·python