ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

阶段二(机器学习与神经网络)实战笔记

阶段二(机器学习与神经网络)实战笔记 阶段二机器学习与神经网络实战笔记本篇覆盖「周 5 机器学习」与「周 6 神经网络」两个动手实验。全部代码在真实华为云 ECSUbuntu 24.04 / 8 vCPU / 16 GB上运行仅使用numpy / pandas / matplotlib / scikit-learn未使用 GPU、未使用 PyTorch。所有指标、图表均为真实运行结果未作任何编造。目录学习目标周 5 · 机器学习5.1 理论机器学习工具流程5.2 特征、模型分类、评估与优化目标5.3 sklearn 使用范式5.4 实战鸢尾花 逻辑回归完整流水线5.5 真实运行结果5.6 图表周 6 · 神经网络6.1 理论从感知机到 RNN/LSTM6.2 实战一从零实现感知机6.3 实战二从零实现两层 MLP 反向传播XOR6.4 实战三梯度下降与学习率对比6.5 实战四从零实现 RNN / LSTM 做正弦预测小结参考学习目标周 5机器学习理解机器学习的「数据 → 特征 → 模型 → 评估」标准工具流程。弄清「特征」「标签」「训练/验证/测试集」「模型分类监督/无监督、生成/判别」等基本概念。掌握常用评估指标准确率、精确率、召回率、F1、混淆矩阵、学习曲线及其适用场景。理解「优化目标 正则」的思想如逻辑回归的交叉熵损失与 L2 正则。熟练使用scikit-learn的fit / predict / score统一接口。周 6神经网络从零用numpy实现感知机理解其线性可分假设与收敛性。理解神经网络的结构单层/多层、激活函数的作用以及「单层感知机无法解决 XOR、加隐藏层即可解决」。手写两层 MLP 的前向传播与反向传播链式法则体会梯度下降如何更新权重。直观感受学习率对梯度下降收敛的影响过小慢、过大发散。从零实现 RNN 与 LSTM理解「记忆」与「门控」如何解决序列建模与长程依赖问题。周 5 · 机器学习5.1 理论机器学习工具流程一个标准的机器学习项目通常遵循下图所示的流水线原始数据 ── 加载/清洗 ── 特征工程 ── 训练/测试划分 │ ▼ 选择模型并训练 (fit) │ ▼ 在测试集上评估 (predict metric) │ ┌───────────────────┴───────────────────┐ ▼ ▼ 指标达标 ──否── 调特征/调超参/换模型 是 ── 交付/上线要点数据加载从文件/数据库/API 读取转成「特征矩阵X 标签向量y」的二维表。特征工程把原始信息转成模型可用的数值表示标准化、独热编码、降维等。好的特征往往比复杂模型更重要。数据划分用「训练集」拟合参数用「测试集」估计泛化能力交叉验证能在有限数据下更稳健地评估。训练 / 评估调用fit学习参数predict得到预测再用指标量化好坏。5.2 特征、模型分类、评估与优化目标特征Feature是描述样本的可量化属性。例如鸢尾花Iris的四个特征特征含义sepal length花萼长度 (cm)sepal width花萼宽度 (cm)petal length花瓣长度 (cm)petal width花瓣宽度 (cm)模型分类常见维度按学习任务监督学习有标签如分类/回归vs无监督学习无标签如聚类。按输出类型分类离散标签vs回归连续值。按参数形式判别式模型直接建模P(y|x)如逻辑回归、SVMvs生成式模型建模P(x,y)如朴素贝叶斯。按复杂度线性模型逻辑回归、线性回归vs非线性模型决策树、核方法、神经网络。评估方法准确率 Accuracy 预测正确的样本数 / 总样本数。简单直观但在类别不平衡时会「骗人」全预测多数类也能拿高分。精确率 Precision / 召回率 Recall / F1关注某一类的查得准不准、查得全不全。混淆矩阵 Confusion Matrix把「真实 vs 预测」按类别交叉计数是分类诊断的利器。学习曲线 Learning Curve观察「训练样本量↑」与「训练/验证准确率」的关系判断模型是欠拟合还是过拟合。优化目标模型训练本质是一个最优化问题最小化损失函数如逻辑回归的交叉熵同时在损失上加正则项如 L2λ·‖w‖²来抑制过拟合。逻辑回归对第k类使用 softmax 交叉熵多分类对二分类使用 sigmoid 交叉熵z w·x b P(y1|x) σ(z) 1 / (1 e^{-z}) Loss -[ y·log ŷ (1-y)·log(1-ŷ) ]5.3 sklearn 使用范式scikit-learn 的设计高度统一记住三板斧即可modelSomeEstimator(**hyperparams)# 1) 实例化超参数在此设定model.fit(X_train,y_train)# 2) 训练学习参数y_predmodel.predict(X_test)# 3) 预测scoremodel.score(X_test,y_test)# 4) 快速评准确率与此配套的常用工具train_test_split划分、StandardScaler标准化、classification_report/confusion_matrix评估、learning_curve学习曲线。5.4 实战鸢尾花 逻辑回归完整流水线完整代码见src/ml_pipeline.py核心流程如下含注释# -*- coding: utf-8 -*-鸢尾花 逻辑回归加载 - 特征标准化 - 划分 - 训练 - 评估 - 可视化importosimportnumpyasnpimportmatplotlib matplotlib.use(Agg)# 服务器无 GUI必须指定非交互后端importmatplotlib.pyplotaspltfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split,learning_curvefromsklearn.preprocessingimportStandardScalerfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimport(accuracy_score,classification_report,confusion_matrix)# ---- 1) 加载数据集 ----irisload_iris(as_frameTrue)Xiris.data# 特征矩阵 (150, 4)yiris.target# 标签 0/1/2# ---- 2) 特征标准化让梯度下降收敛更快更稳定 ----scalerStandardScaler()X_scaledscaler.fit_transform(X)# ---- 3) 划分训练/测试集分层抽样保持类别比例----X_train,X_test,y_train,y_testtrain_test_split(X_scaled,y,test_size0.2,random_state42,stratifyy)# ---- 4) 训练逻辑回归one-vs-rest L2 正则----modelLogisticRegression(max_iter200,C1.0,random_state42)model.fit(X_train,y_train)# ---- 5) 评估 ----y_predmodel.predict(X_test)accaccuracy_score(y_test,y_pred)print(Accuracy ,round(acc,4))print(classification_report(y_test,y_pred,target_namesiris.target_names))cmconfusion_matrix(y_test,y_pred)# 画混淆矩阵热力图figures/cm.png与学习曲线figures/lc.png完整可运行版本含绘图与中文日志请直接运行python src/ml_pipeline.py。5.5 真实运行结果在远程服务器执行/root/venv/bin/python src/ml_pipeline.py关键输出如下真实 stdout样本数 : 150 特征数 : 4 - [sepal length (cm), sepal width (cm), petal length (cm), petal width (cm)] 类别数 : 3 - [setosa, versicolor, virginica] 训练集: 120 样本 | 测试集: 30 样本 模型 : LogisticRegression 求解器 : lbfgs | 正则 C1.0 是否收敛 : n_iter_[16] 测试集准确率 Accuracy 0.9333 分类报告 classification_report precision recall f1-score support setosa 1.0000 1.0000 1.0000 10 versicolor 0.9000 0.9000 0.9000 10 virginica 0.9000 0.9000 0.9000 10 accuracy 0.9333 30 macro avg 0.9333 0.9333 0.9333 30 weighted avg 0.9333 0.9333 0.9333 30 混淆矩阵 confusion_matrix行真实 / 列预测 [[10 0 0] [ 0 9 1] [ 0 1 9]]结果解读整体准确率93.33%。三类里setosa完美区分precision/recall 均为 1.0这是鸢尾花数据的经典结论——setosa 在特征空间里与其他两类天然可分。versicolor与virginica各有 1 个样本被互相误分混淆矩阵中非对角线上各 1说明这两类在边界处存在重叠属于正常情况。逻辑回归仅用 16 步即收敛lbfgs 求解器说明数据尺度经标准化后非常「好解」。5.6 图表混淆矩阵热力图figures/cm.png直观展示每一类的预测分布对角线越亮说明分类越准。学习曲线figures/lc.png5 折交叉验证下训练与验证准确率随训练样本量变化的曲线。两条曲线都随样本量上升并趋于平稳、且间距不大说明模型未明显过拟合增加数据收益有限但稳定。周 6 · 神经网络6.1 理论从感知机到 RNN/LSTM感知机Perceptron是最简单的神经元对输入做加权求和再加偏置过一个阶跃函数得到 0/1 输出。z w₁x₁ w₂x₂ ... wₙxₙ b ŷ sign(z) # 阶跃z≥0 输出 1否则 0权重更新规则感知机学习规则当预测错误时令w lr·(y - ŷ)·x、b lr·(y - ŷ)。重要结论对于线性可分数据感知机** guaranteed 在有限步内收敛**但对线性不可分数据如 XOR永远无法分开。神经网络模型结构把多个神经元分层堆叠。单层感知机只有输入→输出等价于线性分类器能力有限只能学直线/超平面。多层感知机MLP/ 深层网络在输入与输出之间加入隐藏层和非线性激活sigmoid/tanh/ReLU。隐藏层让网络能拟合任意复杂度的非线性边界——这就是单层解决不了的 XOR加一层隐藏层就能解决。梯度下降Gradient Descent沿损失函数对参数的负梯度方向迭代更新θ ← θ - lr·∇θL(θ)逐步逼近最小值。lr学习率控制步长太小收敛慢太大在谷底两侧来回反弹甚至发散。反向传播Backpropagation用链式法则把输出层的误差逐层往前传高效算出损失对每个权重w的梯度。它是训练所有神经网络的核心算法。前向算输出反向算梯度再用梯度下降更新——这就是训练循环。RNN 与 LSTM前述网络处理的是「定长输入→输出」。现实中有大量序列数据时间序列、文本、语音。循环神经网络RNN引入隐藏状态h_t tanh(Wxh·x_t Whh·h_{t-1} b)让信息在时刻间传递从而「记忆」历史。但普通 RNN 存在长程梯度消失难以记住久远的信息。LSTM长短期记忆用「门控」机制解决这个问题它维护一个记忆单元c并通过遗忘门f、输入门i、输出门o控制信息的保留与输出f_t σ(Wf·[x_t, h_{t-1}] bf) # 遗忘多少旧记忆 i_t σ(Wi·[x_t, h_{t-1}] bi) # 写入多少新信息 g_t tanh(Wc·[x_t, h_{t-1}] bc) c_t f_t ⊙ c_{t-1} i_t ⊙ g_t # 新的记忆单元 o_t σ(Wo·[x_t, h_{t-1}] bo) h_t o_t ⊙ tanh(c_t)门控让 LSTM 能选择性地长期记忆因此在长序列任务上通常优于普通 RNN。下面四个实战逐一用numpy把这些概念「跑」出来。6.2 实战一从零实现感知机完整代码见src/perceptron.py。核心是一个纯 numpy 的Perceptron类classPerceptron:def__init__(self,lr0.1,max_iter200):self.lrlr;self.max_itermax_iter self.wNone;self.b0.0;self.errors[]deffit(self,X,y):n_samples,n_featuresX.shape rngnp.random.default_rng(0)self.wrng.normal(0,0.01,sizen_features)y_np.where(y0,1,-1)# 标签映射为 {-1, 1}foritinrange(self.max_iter):errs0foriinrange(n_samples):znp.dot(self.w,X[i])self.b y_hat1ifz0else-1ify_hat!y_[i]:# 只在预测错误时更新errs1updateself.lr*(y_[i]-y_hat)self.wupdate*X[i]self.bupdate self.errors.append(errs)iferrs0:# 线性可分 - 必收敛print(f第{it1}轮后完全分开提前停止。)breakreturnself真实运行结果二维线性可分数据两类分别来自(2,2)与(-2,-2)附近的高斯分布样本数120特征维度2标签{0,1} 第 2 轮后完全分开提前停止。 最终训练准确率 1.0000 权重 w [0.4913 0.5115]偏置 b 0.2000 训练误差轨迹前若干轮: [1, 0] ... 末轮0仅用2 轮就 100% 分开完美印证「线性可分 → 感知机收敛」的理论。决策边界w·x b 0即图中的黑色直线6.3 实战二从零实现两层 MLP 反向传播XOR完整代码见src/nn_mlp.py。网络结构输入(2) → 隐藏层(sigmoid, 4 个神经元) → 输出(1, sigmoid)用二分类交叉熵做损失手算梯度做反向传播。classMLP:def__init__(self,n_in2,n_h4,n_out1,lr0.5,seed0):rngnp.random.default_rng(seed)self.W1rng.uniform(-1,1,(n_in,n_h))*np.sqrt(1.0/n_in)self.b1np.zeros(n_h)self.W2rng.uniform(-1,1,(n_h,n_out))*np.sqrt(1.0/n_h)self.b2np.zeros(n_out)self.lrlrdefforward(self,X):self.z1X self.W1self.b1 self.a1sigmoid(self.z1)# 隐藏层激活self.z2self.a1 self.W2self.b2 self.a2sigmoid(self.z2)# 输出returnself.a2defbackward(self,X,y):mX.shape[0]dZ2(self.a2-y)*sigmoid_grad(self.a2)# 输出层误差dW2self.a1.T dZ2/m db2dZ2.sum(0)/m dA1dZ2 self.W2.T dZ1dA1*sigmoid_grad(self.a1)# 链式法则回传dW1X.T dZ1/m db1dZ1.sum(0)/m self.W2-self.lr*dW2;self.b2-self.lr*db2 self.W1-self.lr*dW1;self.b1-self.lr*db1真实运行结果XOR4 条样本[0,0]→0, [0,1]→1, [1,0]→1, [1,1]→0epoch 1 | loss 0.6970 | train_acc 0.5000 epoch 1000 | loss 0.6925 | train_acc 0.5000 epoch 2000 | loss 0.6878 | train_acc 0.7500 epoch 3000 | loss 0.5690 | train_acc 1.0000 epoch 4000 | loss 0.1720 | train_acc 1.0000 epoch 5000 | loss 0.0946 | train_acc 1.0000 最终输出接近 0/1 即正确 x[0.0, 0.0] - 预测0.0841 目标0 x[0.0, 1.0] - 预测0.9140 目标1 x[1.0, 0.0] - 预测0.9024 目标1 x[1.0, 1.0] - 预测0.0929 目标0 训练集准确率 1.0000, 最终 loss 0.0946注意前 1000 步 loss 几乎不动卡在 0.69 附近——这是 XOR 损失曲面上的「平坦高原」需要隐藏层把特征扭到可分空间后才会快速下降。这直观证明了「单层感知机做不了 XOR加隐藏层 反向传播就能做」。6.4 实战三梯度下降与学习率对比完整代码见src/gradient_descent.py。目标函数取最简单的凸函数f(w) (w-3)²最小值在w*3梯度df/dw 2(w-3)。对比四种学习率梯度下降演示单变量凸函数 f(w)(w-3)^2最优 w*3 lr0.05 (small) - 末值 w 2.9845, 末损失0.0002 lr0.30 (medium) - 末值 w 3.0000, 末损失0.0000 lr0.90 (large) - 末值 w 3.0000, 末损失0.0000 lr1.05 (diverge) - 末值 w-349.1726, 末损失124025.5111 结论lr 过大会导致超过最优点而震荡/发散lr1.05 时 w 来回反弹。lr0.05收敛但偏慢末值 2.98 仍有误差lr0.30/0.90平滑落到最优lr1.05因步长超过「临界值 1」对二次型稳定要求lr 2/L这里L2而发散损失爆炸到 12 万。下图一目了然6.5 实战四从零实现 RNN / LSTM 做正弦预测完整代码见src/rnn_lstm.py。用sin(t)序列做一步预测用历史预测下一时刻从零实现普通 RNN 与 LSTM均用截断 BPTT 梯度裁剪训练。RNN 前向h_t tanh(Wxh·x_t Whh·h_{t-1} bh)y_t h_t·Why byLSTM 前向见上文门控公式反向传播把误差沿时间t与沿门控链同时回传。为数值稳定代码中sigmoid做了clip梯度统一np.clip(g, -5, 5)防止爆炸。真实运行结果隐藏维度 H16序列长度 24各训练 1500 epoch--- 训练 Vanilla RNN (H16, lr0.05, epochs1500) --- epoch 1 | loss 0.30262 epoch 250 | loss 0.00012 epoch 500 | loss 0.00007 epoch 1000 | loss 0.00004 epoch 1500 | loss 0.00003 --- 训练 LSTM (H16, lr0.02, epochs1500) --- epoch 1 | loss 0.47599 epoch 250 | loss 0.00845 epoch 500 | loss 0.00075 epoch 1000 | loss 0.00033 epoch 1500 | loss 0.00025 测试集 one-step-ahead MSERNN0.00317 LSTM0.00124两者都把训练损失压到 1e-4 量级对已见过的训练区间拟合极好。在未见过的测试区间t30→40做一步预测RNN 的 MSE0.00317LSTM 的 MSE0.00124LSTM 泛化略优与本实验数据规模下「门控有助于稳定记忆」的预期一致注意本演示数据较短、频率单一LSTM 优势有限属正常在长程、多变序列上差距会更明显。小结主题关键结论来自真实运行机器学习流程标准化后的 Iris 逻辑回归测试准确率93.33%setosa 完美可分。感知机线性可分数据2 轮即 100% 收敛决策边界为直线。两层 MLP隐藏层 反向传播成功解决XOR单层感知机做不到最终 loss 0.095、acc 1.0。梯度下降学习率是关键超参lr2/L才稳定lr1.051直接发散。RNN / LSTM两者都能拟合正弦测试一步预测 MSERNN 0.00317 LSTM 0.00124门控略优。工程经验服务器无 GUI 时matplotlib必须matplotlib.use(Agg)并将图savefig为 PNG中文图标签若服务器缺 CJK 字体会变成方块本文统一用英文图注。训练前务必标准化特征否则梯度下降类算法收敛慢甚至不收敛。反向传播的 bug 高发区是张量维度与链式法则的「时间方向」回传用「前向缓存每一步中间量、反向再取用」的方式最稳。梯度裁剪是对抗 RNN/LSTM 训练不稳定的廉价且有效的手段。参考scikit-learn 官方文档https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.htmlsklearn 数据集load_irishttps://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html混淆矩阵与分类报告sklearn.metrics.confusion_matrix/classification_report学习曲线sklearn.model_selection.learning_curvehttps://scikit-learn.org/stable/modules/generated/sklearn.model_selection.learning_curve.htmlRumelhart, Hinton, Williams.Learning representations by back-propagating errors. Nature, 1986.反向传播原始论文Hochreiter Schmidhuber.Long Short-Term Memory. Neural Computation, 1997.LSTM 原始论文感知机收敛定理Rosenblatt, F.The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain. 1958.实验环境华为云 ECSUbuntu 24.04 / 8 vCPU / 16 GBPython 3.12 numpy 2.5 / pandas 3.0 / matplotlib 3.11 / sklearn 1.9。代码与数据本仓库src/脚本、figures/图表、results/指标文本与 JSON。运行方式远程已建 venv 于/root/venv/root/venv/bin/python src/ml_pipeline.py /root/venv/bin/python src/perceptron.py /root/venv/bin/python src/nn_mlp.py /root/venv/bin/python src/gradient_descent.py /root/venv/bin/python src/rnn_lstm.py
返回列表