机器学习教程【免费下载链接】python-machine-learning-bookThe Python Machine Learning (1st edition) book code repository and info resource项目地址https://gitcode.com/gh_mirrors/py/python-machine-learning-book点击查看免费下载本指南围绕《Python Machine Learning第 1 版》仓库中 第 10 章回归分析 的技术脉络展开以波士顿房价Housing数据集为例系统讲解从简单线性回归、梯度下降求解、scikit-learn 实现到 RANSAC 稳健拟合、模型评估、正则化Lasso、多项式回归与随机森林回归的完整实战路径。读完本文你将能独立用numpy/pandas/scikit-learn完成一轮数据探索 → 建模 → 评估 → 对比调优的回归任务。全文所有代码与实验输出均可对照仓库中的 ch10.ipynb 与 ch10.py 复现。本章知识地图第 10 章的结构见 README是一条典型的回归分析流水线每一环都可独立复用引入简单线性回归模型探索 Housing 数据集含可视化特征关系实现普通最小二乘OLS线性回归用梯度下降求解回归参数用 scikit-learn 估计回归系数用 RANSAC 拟合稳健回归模型评估线性回归模型的性能使用正则化方法做回归Ridge / Lasso把线性回归变成曲线——多项式回归在 Housing 数据集中建模非线性关系用随机森林处理非线性关系决策树回归、随机森林回归小结下面的小节逐一展开这 8 个环节并在每处标注仓库中可对照的源码位置。简单线性回归从一条直线开始回归分析要回答的核心问题是给定一个解释变量explanatory variable$x$如何预测连续的响应变量response variable$y$最简单的模型是假设两者之间存在线性关系$$\hat{y} w_0 w_1 x$$其中 $w_0$ 是截距intercept$w_1$ 是斜率slope。模型学习的目标就是找到一组 $w$使预测值 $\hat{y}$ 与真实值 $y$ 之间的垂直偏差vertical offsets最小化。仓库中的 10_01.png 正是对这一概念的图解绿色方块代表数据点 $(x_i, y_i)$蓝色直线代表拟合出的回归线红色垂直线段刻画每个样本的残差 $|\hat{y}_i - y_i|$。当只用一个特征如房间数 RM去预测房价时这就是一元线性回归当引入全部特征时模型自然推广为多元线性回归 $\hat{y} w_0 \sum_{j1}^{m} w_j x^{(j)}$这正是第 10 章在 Housing 数据集上最终使用的形态。探索 Housing 数据集可视化重要特征数据来源与字段说明第 10 章使用的经典 Boston Housing 数据集在仓库中有一份本地副本datasets/housing/housing.data配套说明见 datasets/housing/README.md。该数据集共有506 个样本包含13 个特征和 1 个连续目标变量特征含义如下列名含义CRIM城镇人均犯罪率ZN占地超过 25000 平方英尺的住宅用地比例INDUS城镇非零售商业用地比例CHAS是否邻近查尔斯河哑变量1 是 / 0 否NOX一氧化氮浓度每千万分之一RM每套住宅的平均房间数AGE1940 年之前建造的自有住房比例DIS到波士顿 5 个就业中心的加权距离RAD径向高速公路可达性指数TAX每 1 万美元的全额房产税率PTRATIO城镇师生比B1000(Bk - 0.63)²其中 Bk 为城镇黑人比例LSTAT人口中低收入阶层百分比MEDV目标变量自住房价格中位数单位千美元数据无表头、以空白分隔因此加载时要手工指定列名ch10.ipynb 中的做法import pandas as pd df pd.read_csv(https://archive.ics.uci.edu/ml/machine-learning-databases/ housing/housing.data, headerNone, sep\s) df.columns [CRIM, ZN, INDUS, CHAS, NOX, RM, AGE, DIS, RAD, TAX, PTRATIO, B, LSTAT, MEDV] df.head()如果远程链接不可用可直接改用仓库本地文件 datasets/housing/housing.datanotebook 中也明确给出了这一替代方案。散点矩阵与相关性热力图在动手建模之前先用可视化快速判断哪些特征与房价存在近似线性的关系。notebook 选取了LSTAT、INDUS、NOX、RM四个特征与目标MEDV借助 seaborn 画出成对散点图矩阵import matplotlib.pyplot as plt import seaborn as sns sns.set(stylewhitegrid, contextnotebook) cols [LSTAT, INDUS, NOX, RM, MEDV] sns.pairplot(df[cols], size2.5) plt.tight_layout() plt.show()散点矩阵能直观揭示出RM平均房间数与MEDV呈明显正相关而LSTAT低收入人口比例与MEDV呈明显的负相关——这两者都是有潜力的解释变量。随后用热力图定量呈现相关系数矩阵import numpy as np cm np.corrcoef(df[cols].values.T) sns.set(font_scale1.5) hm sns.heatmap(cm, cbarTrue, annotTrue, squareTrue, fmt.2f, annot_kws{size: 15}, yticklabelscols, xticklabelscols) plt.show()这张热力图直接为后续建模提供依据LSTAT与MEDV相关系数约为-0.74RM与MEDV约为0.70说明两者是预测房价的重要特征同时INDUS与NOX高度正相关约 0.76提示特征间可能存在共线性。实现普通最小二乘OLS线性回归用梯度下降求解回归参数scikit-learn 的LinearRegression在底层使用基于最小二乘的闭式求解但为了理解回归参数的估计原理第 10 章先用numpy手写了一个批梯度下降版线性回归LinearRegressionGD源码见 ch10.ipynbclass LinearRegressionGD(object): def __init__(self, eta0.001, n_iter20): self.eta eta # 学习率 self.n_iter n_iter # 迭代轮数 def fit(self, X, y): self.w_ np.zeros(1 X.shape[1]) self.cost_ [] for i in range(self.n_iter): output self.net_input(X) errors (y - output) self.w_[1:] self.eta * X.T.dot(errors) self.w_[0] self.eta * errors.sum() cost (errors**2).sum() / 2.0 self.cost_.append(cost) return self def net_input(self, X): return np.dot(X, self.w_[1:]) self.w_[0] def predict(self, X): return self.net_input(X)关键点如下代价函数采用平方误差和的一半SSE/2即 $\frac{1}{2}\sum_i (y_i - \hat{y}_i)^2$除以 2 是为了让梯度表达更整洁。权重更新对每个权重 $w_j$ 沿负梯度方向前进 $\eta$self.w_[1:] self.eta * X.T.dot(errors)一次完成全部特征的梯度更新截距单独用errors.sum()更新。标准化是梯度下降的前提因为不同特征如 RM 与 TAX量纲差异巨大直接训练会导致收敛缓慢甚至震荡。notebook 对输入输出都做了标准化from sklearn.preprocessing import StandardScaler sc_x StandardScaler() sc_y StandardScaler() X_std sc_x.fit_transform(X) y_std sc_y.fit_transform(y[:, np.newaxis]).flatten() lr LinearRegressionGD() lr.fit(X_std, y_std)训练完成后绘制 Epoch vs SSE 曲线可以确认代价函数随迭代单调下降打印权重可得标准化空间下的斜率约为 0.695、截距约为 -0.000。预测时需要用sc_y.inverse_transform把标准化的预测值还原回房价量纲千美元。notebook 演示了预测 5 间房样本的价格num_rooms_std sc_x.transform(np.array([[5.0]])) price_std lr.predict(num_rooms_std) print(Price in $1000s: %.3f % sc_y.inverse_transform(price_std)) # 输出Price in $1000s: 10.840用 scikit-learn 估计回归系数手写版适合理解原理生产实践则直接使用sklearn.linear_model.LinearRegression。它对未标准化的原始数据拟合直接得到可解释的系数from sklearn.linear_model import LinearRegression slr LinearRegression() slr.fit(X, y) # X df[[RM]].values, y df[MEDV].values y_pred slr.predict(X) print(Slope: %.3f % slr.coef_[0]) # Slope: 9.102 print(Intercept: %.3f % slr.intercept_) # Intercept: -34.671notebook 还演示了**正规方程Normal Equations**作为闭式解的另一条路径结果与LinearRegression完全一致斜率 9.102、截距 -34.671验证了库实现的正确性# 给设计矩阵加一列全 1 Xb np.hstack((np.ones((X.shape[0], 1)), X)) w np.zeros(X.shape[1]) z np.linalg.inv(np.dot(Xb.T, Xb)) w np.dot(z, np.dot(Xb.T, y))用 RANSAC 拟合稳健回归模型数据中难免存在离群点outlier普通最小二乘会对离群点过于敏感。RANSACRandom Sample Consensus随机抽样一致性通过先采样子集拟合、再评估内点/外点的迭代策略得到更稳健的模型。notebook 中针对 sklearn 版本做了兼容处理0.18 前后参数名不同核心代码如下from sklearn.linear_model import RANSACRegressor if Version(sklearn_version) 0.18: ransac RANSACRegressor(LinearRegression(), max_trials100, min_samples50, residual_metriclambda x: np.sum(np.abs(x), axis1), residual_threshold5.0, random_state0) else: ransac RANSACRegressor(LinearRegression(), max_trials100, min_samples50, lossabsolute_loss, residual_threshold5.0, random_state0) ransac.fit(X, y) inlier_mask ransac.inlier_mask_ outlier_mask np.logical_not(inlier_mask)参数含义与取值max_trials100最多迭代 100 轮随机采样min_samples50每次随机选取至少 50 个样本参与拟合Housing 共 506 个样本lossabsolute_loss/residual_threshold5.0以绝对损失作为残差度量残差绝对值超过 5千美元的样本被判为外点random_state0固定随机种子保证结果可复现。拟合后可通过inlier_mask_区分内点与外点并分别用不同颜色和形状绘制蓝色圆点内点浅绿色方块外点红色的 RANSAC 拟合线比 OLS 直线更少受外点拖拽。打印最终系数print(Slope: %.3f % ransac.estimator_.coef_[0]) # Slope: 9.621 print(Intercept: %.3f % ransac.estimator_.intercept_) # Intercept: -37.137对比 OLS 的 9.102 / -34.671 可以发现RANSAC 的斜率与截距均发生了变化这正是稳健拟合的体现——它受外点影响更小。评估线性回归模型的性能评估回归模型不能只看训练集上的表现。notebook 先用train_test_split按30% 测试集、固定random_state0切分数据并对 sklearn 0.18 前后的导入路径sklearn.cross_validation/sklearn.model_selection做了兼容然后用全部 13 个特征训练多元线性回归。残差图残差residual 预测值 − 真实值。把残差对预测值作图可以诊断模型是否满足残差随机、无系统性模式的假设plt.scatter(y_train_pred, y_train_pred - y_train, cblue, markero, labelTraining data) plt.scatter(y_test_pred, y_test_pred - y_test, clightgreen, markers, labelTest data) plt.xlabel(Predicted values) plt.ylabel(Residuals) plt.legend(locupper left) plt.hlines(y0, xmin-10, xmax50, lw2, colorred) plt.xlim([-10, 50]) plt.show()观察残差图可以发现预测值较高时残差存在一定的扇形扩散且部分样本残差偏离明显——这提示房价与特征之间可能存在非线性关系为后文引入多项式回归与随机森林埋下伏笔。MSE 与 R²notebook 用两个经典指标量化性能from sklearn.metrics import r2_score from sklearn.metrics import mean_squared_error print(MSE train: %.3f, test: %.3f % ( mean_squared_error(y_train, y_train_pred), mean_squared_error(y_test, y_test_pred))) print(R^2 train: %.3f, test: %.3f % ( r2_score(y_train, y_train_pred), r2_score(y_test, y_test_pred)))该模型在 30% 测试集上的结果为MSE均方误差训练集 19.958测试集 27.196R²决定系数训练集 0.765测试集 0.673。测试集 MSE 明显高于训练集且 R² 只有 0.67说明纯线性假设对房价预测并不充分需要引入正则化或非线性手段。使用正则化方法Lasso 回归正则化通过在损失函数中加入权重惩罚项来抑制过拟合、压缩系数。第 10 章演示了LassoL1 正则化alpha0.1from sklearn.linear_model import Lasso lasso Lasso(alpha0.1) lasso.fit(X_train, y_train) y_train_pred lasso.predict(X_train) y_test_pred lasso.predict(X_test) print(lasso.coef_)Lasso 的一个重要特性是特征选择L1 惩罚会把一部分不重要的系数直接压成 0。上面的输出中 13 个系数里就出现了-0.接近零的项这正是稀疏解的表现。性能对比MSE训练集 20.926测试集 28.876R²训练集 0.753测试集 0.673此处约为 0.653 量级。可以看到 Lasso 以轻微的训练精度损失换来了更稀疏、可解释性更强的模型。读者可以自行调整alpha观察正则强度对系数稀疏度与测试集表现的影响Ridge 即 L2 版本同理仓库中未展开但接口一致。把线性回归变成曲线多项式回归多项式特征与玩具示例线性回归的线性指的是对参数$w$ 线性而非对特征 $x$ 线性。借助PolynomialFeatures构造 $x^2, x^3, \dots$ 等衍生特征就能用线性模型拟合曲线关系。notebook 先用一组包含 10 个点的玩具数据演示了线性拟合与二次拟合的差异from sklearn.preprocessing import PolynomialFeatures lr LinearRegression() pr LinearRegression() quadratic PolynomialFeatures(degree2) X_quad quadratic.fit_transform(X)拟合后对比两者在训练数据上的表现线性拟合 MSE569.780R²0.832二次拟合 MSE61.330R²0.982。仅把次数从 1 提到 2MSE 就下降了近一个数量级R² 从 0.832 跃升到 0.982——直观说明二次曲线能更好地贴合该玩具数据。在 Housing 数据集中建模非线性关系回到波士顿房价数据用LSTAT单一特征分别做线性d1、二次d2、三次d3多项式拟合X df[[LSTAT]].values y df[MEDV].values quadratic PolynomialFeatures(degree2) cubic PolynomialFeatures(degree3) X_quad quadratic.fit_transform(X) X_cubic cubic.fit_transform(X) X_fit np.arange(X.min(), X.max(), 1)[:, np.newaxis] regr regr.fit(X, y) y_lin_fit regr.predict(X_fit) linear_r2 r2_score(y, regr.predict(X)) regr regr.fit(X_quad, y) y_quad_fit regr.predict(quadratic.fit_transform(X_fit)) quadratic_r2 r2_score(y, regr.predict(X_quad)) regr regr.fit(X_cubic, y) y_cubic_fit regr.predict(cubic.fit_transform(X_fit)) cubic_r2 r2_score(y, regr.predict(X_cubic))图中三条曲线蓝色点线d1、红色实线d2、绿色虚线d3叠加在灰色训练点上LSTAT与MEDV的负相关呈现出明显的非线性下凹形态多项式拟合显著优于单一直线。特征变换log 与平方根除了构造多项式还可以对原始特征做单调变换。notebook 的另一条思路是对LSTAT取对数、对MEDV取平方根再在变换后的空间做线性拟合X_log np.log(X) y_sqrt np.sqrt(y) regr regr.fit(X_log, y_sqrt) y_lin_fit regr.predict(X_fit) linear_r2 r2_score(y_sqrt, regr.predict(X_log))变换后 $log(LSTAT)$ 与 $\sqrt{MEDV}$ 呈现出更接近直线的分布变换空间中的线性模型即可获得较好的 R²。这种先变换、再线性拟合的思路是处理偏态分布与非线性关系的常用工程手段。用随机森林处理非线性关系树模型天然支持非线性与特征交互无需手工构造多项式特征是多项式回归之外的另一种选择。决策树回归DecisionTreeRegressor通过递归划分特征空间、在每个叶节点取均值的方式做回归。notebook 用max_depth3限制树深防止过拟合from sklearn.tree import DecisionTreeRegressor X df[[LSTAT]].values y df[MEDV].values tree DecisionTreeRegressor(max_depth3) tree.fit(X, y) sort_idx X.flatten().argsort() lin_regplot(X[sort_idx], y[sort_idx], tree) plt.xlabel(% lower status of the population [LSTAT]) plt.ylabel(Price in $1000\s [MEDV]) plt.show()注意由于决策树预测是分段常数必须先按X排序再绘图否则连线会杂乱无章。max_depth3让拟合线呈现为 2³8 段以内的阶梯状既能捕捉非线性趋势又避免了高方差过拟合。仓库中另附有 tree.dot可用于将决策树导出为 Graphviz 可视化直观查看切分规则。随机森林回归随机森林通过自助采样bootstrap 特征随机子集 多棵树平均来降低单棵决策树的高方差。notebook 用 40% 测试集评估了 1000 棵树的随机森林from sklearn.ensemble import RandomForestRegressor forest RandomForestRegressor(n_estimators1000, criterionmse, random_state1, n_jobs-1) forest.fit(X_train, y_train) y_train_pred forest.predict(X_train) y_test_pred forest.predict(X_test) print(MSE train: %.3f, test: %.3f % ( mean_squared_error(y_train, y_train_pred), mean_squared_error(y_test, y_test_pred))) print(R^2 train: %.3f, test: %.3f % ( r2_score(y_train, y_train_pred), r2_score(y_test, y_test_pred)))参数说明n_estimators1000森林中决策树的数量越多通常越稳健配合并行可控制耗时criterionmse节点划分依据为均方误差random_state1固定随机种子保证可复现n_jobs-1使用全部 CPU 核并行训练。在全部 13 个特征上的结果MSE训练集 1.642测试集 11.052R²训练集 0.979测试集 0.878。与线性回归测试 R²≈0.67、Lasso测试 R²≈0.65相比随机森林在测试集上把 R² 提升到了约0.88。训练集 R² 高达 0.979 而测试集为 0.878二者仍有差距说明随机森林在训练集上存在一定过拟合但泛化能力已显著优于线性族模型。残差图也证实了这一点训练残差被压缩到接近零测试残差集中在零线附近、分布更对称。小结如何选模型沿着第 10 章的完整流水线走下来可以总结出一条清晰的选型逻辑先探索用散点矩阵与相关性热力图10_04.png识别与目标强相关的特征及潜在非线性如LSTAT、RM从简单模型起步手写梯度下降版LinearRegressionGD理解参数估计原理再用 scikit-learnLinearRegression与正规方程做基准考虑数据质量存在离群点时改用 RANSAC 稳健拟合严格评估用 30%40% 测试集 MSE / R² / 残差图衡量泛化能力而不是只看训练集对症下药特征多、要稀疏可解释 → Lassoalpha0.1特征与目标呈曲线关系 →PolynomialFeaturesd2、d3或 log/平方根变换关系复杂、树模型泛化更好 →DecisionTreeRegressor(max_depth3)起步再上RandomForestRegressor(n_estimators1000)。仓库中的 ch10.ipynb 与 ch10.py 完整收录了以上全部代码与输出datasets/housing/README.md 提供了数据集字段的权威说明可随时对照复现。建议读者在跑通后自行调节eta、alpha、max_depth、n_estimators等关键超参观察它们如何影响 SSE 收敛曲线、系数稀疏度与测试集 R²从而把本章的方法内化为自己的回归建模工具箱。赞分享机器学习教程【免费下载链接】python-machine-learning-bookThe Python Machine Learning (1st edition) book code repository and info resource项目地址https://gitcode.com/gh_mirrors/py/python-machine-learning-book点击查看免费下载相关推荐ReplaceAnimation如何在iOS中实现惊艳的下拉刷新动画效果ReplaceAnimation如何在iOS中实现惊艳的下拉刷新动画效果 ReplaceAnimation是一个基于Swift编写的iOS开源项目专注于在UPakePlus-Android原生WebView容器化架构与极简打包技术解析PakePlus Android原生WebView容器化架构与极简打包技术解析 PakePlus Android是一款基于原生Android WebView容移动开发从感知机到 Adaline用 Python 从零实现线性分类器python-machine-learning-book 第 2 章实战解析从感知机到 Adaline用 Python 从零实现线性分类器python machine learning book 第 2 章实战解析 本文围绕 py机器学习教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
从决策树到随机森林:电信客户流失建模与参数调优实战 上个季度我在做一个电信客户留存分析,客户成功团队催着要一份流失预警名单。数据集是经典的电信客户流失数据,七千多条样本,二十来个字段。我当时顺手跑了三行默认参数的随机森林,AUC卡在0.75上不去。问题出在哪我很清楚ÿ… · 2026/9/23 2:50:18
基于SpringBoot和微信小程序的家校交流系统开发实战 每年到毕业设计季,总能收到大量私信:“学长,我的题目是‘基于SpringBoot的两河学校家校交流微信小程序’,该从哪里下手?”这个题目看起来平平无奇,但真正做起来,方向选错的人特别多。有人把它做… · 2026/9/23 2:50:18
戴尔5557搞定版本升级API崩溃:5道高频面试题直击痛点 戴尔5557搞定版本升级API崩溃:5道高频面试题直击痛点 版本升级后 API 全变了,代码跑不通,线上服务报警,这种绝望感每个开发者都懂。更糟的是,面试官拿着这套旧逻辑问“为什么”,你卡壳,直接挂。 这就是 戴尔5557… · 2026/9/23 2:50:18
科沃斯X12S PRO实测:从扫拖到托管,真正解放双手的地面清洁体验 如果你问我,过去两年里扫地机器人最值得关注的变化是什么,我的答案不是导航精度提高了多少,也不是吸力又翻了几倍,而是“托管能力”。科沃斯X12S PRO这台机器,从命名到宣传口径,都在刻意强调同一个词&#… · 2026/9/23 3:35:15
AI判断也能写if语句?置信度路由让模型输出变成可控逻辑 1. 别把AI当黑盒:先理解「置信度路由」到底解决了什么问题先说个我自己的经历。早先做一个文本分类项目,模型同时要判断用户提问的意图、情绪,还要抽取出关键实体。按照常规做法,我写了三个独立的函数,每个函数单独调一… · 2026/9/23 3:35:15
金蝶kis迷你版5大避坑指南附完整示例 金蝶kis迷你版5大避坑指南附完整示例 官方文档翻了三遍还是配不平账?别急,金蝶kis迷你版的逻辑确实反直觉。 很多老会计被这套系统坑得够呛,尤其是数据迁移和凭证生成环节。 这篇干货直接给你5个高频报错的 完整示例… · 2026/9/23 3:35:09
降AI率工具全面测评:十大工具实测对比与底层逻辑解析 1. 为什么要降AI率?先把这个事说透先说个可能让你不太舒服的事实:现在大学里交论文、交课程报告,老师最先看的往往不是你写了什么,而是你的文字“像不像人写的”。2026年了,AI写作早就渗透进本科生的日常,从… · 2026/9/23 3:35:09
PowerSploit Recon 模块 Get-DomainDFSShare 深度解析:枚举域内分布式文件系统共享 PowerSploit Recon 模块 Get-DomainDFSShare 深度解析:枚举域内分布式文件系统共享 【免费下载链接】PowerSploit PowerSploit - A PowerShell Post-Exploitation Framework 项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit
导读
Get-DomainDFSSh… · 2026/9/23 3:35:02
YOLO遥感油罐检测数据集全解析:标签格式转换与训练避坑指南 简介:面向YOLO目标检测学习者与遥感图像分析人员,这份遥感油罐检测数据集来自真实场景,图片质量高、场景丰富,使用LabelImg标注且框体质量高,可直接用于YOLOv5、YOLOv8等主流目标检测模型的训练与算法效果验证。压缩包… · 2026/9/23 3:35:02
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29