ARTICLE DETAIL

资讯详情

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

Jupyter Notebook中构建机器学习模型:从环境配置到超参数调优实战指南

Jupyter Notebook中构建机器学习模型:从环境配置到超参数调优实战指南 简介基于Jupyter Notebook 的机器学习基本模型算法教程资源面向机器学习入门者与数据科学爱好者围绕Python生态讲解从数据预处理到模型评估的完整流程。内容覆盖线性回归、逻辑回归、决策树、随机森林、支持向量机、K-Means聚类等核心算法并配有房价预测、信用评分、市场细分等案例能帮助读者快速将理论转化为可运行的Notebook代码。资源包共25个文件约2.97MB主要包含Jupyter Notebook示例、Markdown说明文档、CSV数据集及Python辅助脚本每个算法均配有独立Notebook与说明数据、代码、文档分层清晰便于按需学习和二次修改。此外还涵盖模型评估、参数调优与特征重要性分析等进阶主题适合希望系统掌握机器学习建模全流程的读者。目前已有2044人学习下载是一份兼顾教学与实战的入门资料可显著降低机器学习上手的门槛。1. 先把“模型训练”镶进 Notebook这个标题到底在解决什么问题做过机器学习的同学都有过这种经历IDE 里跑得好好的脚本换一台机器就报库缺失或者数据一换之前写的训练代码要推倒重排参数。Jupyter Notebook 的价值不在于它能把代码切成格子而在于它给了你一个“每次改变都可观察、可回溯”的容器一行一行喂数据、看分布、改超参数、画损失曲线这一步的输出能直接成为下一步的输入。这个标题把“Notebook、机器学习模型、基本算法”放在一起本质上是想要一套不用反复造轮子的算法样板间——拿一份表格数据进来在 Notebook 里完成清洗、训练、评价和可视化并且每一步都留得下痕迹。这篇文章就按这个思路走先把 Notebook 的建模环境搭对包括最麻烦的内核选择问题然后从回归和分类两个最基本的模型案例入手把算法的参数讲明白再进阶到自动搜索最优超参数最后在真实数据集上做一次收尾验证。适合刚学完 Python 语法、准备系统接触机器学习或者工作里需要快速做算法预研的读者。后面的代码我都在本机跑过版本是 scikit-learn 1.2 以上、Python 3.9往下看就行。2. 在 Notebook 里先解决“环境隔离”与“内核选择”否则后面全白搭2.1 用 conda 创建独立环境并把新环境“塞”进 Jupyter第一个大坑是很多人直接pip install jupyter然后所有包都装在 base 环境里。机器学习项目对 scikit-learn、pandas、numpy 的版本组合非常敏感项目间互相覆盖依赖典型的后果是昨天还能训练的模型今天报AttributeError: module sklearn has no attribute model_selection。我一般会给每个项目单独建 conda 环境再把它注册为 Jupyter 的一个 kernel。创建一个干净环境命名为mlbasicconda create -n mlbasic python3.9 -y conda activate mlbasic pip install jupyter scikit-learn pandas numpy matplotlib ipykernel提示在 conda 环境里安装包时优先用pip而不是conda install因为 scikit-learn 的 pip 轮子会直接帮你把 numpy 编译到当前 Python 版本兼容的开源版本不存在 conda 频道里的依赖矩阵冲突。环境建好以后运行python -m ipykernel install --user --name mlbasic --display-name Python (mlbasic)这段注册命令的逻辑是ipykernel负责把当前 Python 环境“装扮”成一个可被 Jupyter 前端调用的独立解释器--name是内核标识--display-name则控制你在 Notebook 界面右上角下拉菜单里看到的文字。不执行这一步你新建的 conda 环境在 Notebook 里根本找不到只能默默用默认的 Python 3 内核——这也是“jupyter notebook 无法运行”的高频原因之一。2.2 数据先统一成 DataFrame再谈模型算法机器学习建模里数据格式混乱是比算法选错更常见的失败点。在 Notebook 里最舒服的姿势是让所有读入的数据统一为 pandas DataFrame因为 scikit-learn 对输入的要求非常严格特征矩阵必须是二维结构目标值必须能通过fit(X, y)正确广播。用两个典型的数据源演示import pandas as pd import numpy as np # 方式一从 CSV 读入date 列可能带引号或中文表头 df pd.read_csv(train.csv, encodingutf-8) # 方式二构造一个结构清晰的示例数据集房价回归的迷你版 data { area: [50, 60, 80, 100, 120], floor: [3, 8, 15, 22, 30], distance_to_subway: [2.1, 1.5, 0.8, 0.3, 0.2], price: [150, 190, 260, 310, 380], } df_exp pd.DataFrame(data) print(df_exp.dtypes)打印出来的dtypes会告诉你每一列的类型直接决定你能否把这一列塞进模型。如果price是字符串比如带“万元”后缀模型会直接报错。标准做法是提取特征和标签X df_exp.drop(price, axis1)y df_exp[price]。这一步的意义在于scikit-learn 的算法不会帮你挑列只会按你给的二维数组的形状训练几行代码就可以把“训练数据”和“监督目标”从一张表里拆出来后面所有的模型案例都用这个规范。2.3 Notebook 本身跑不动、内核心跳停跳先看这三处网页版的 Notebook 卡死或代码块一直转圈不一定是代码本身的问题。第一个检查点是浏览器带宽网络够不够第二个是内核把内存跑满了第三个是前端与内核的 WebSocket 断连。我按优先级给一个排查顺序打开任务管理器或top看python进程的 CPU/内存占用超过 90% 就是实打实跑不动回到Kernel - Restart清理运行jupyter notebook list查看当前活动会话找到对应端口后重启该内核如果笔记本半天没输出检查代码里是否出现了死循环或者matplotlib是否没有加%matplotlib inline后者会导致绘图卡在前端渲染上。提示在远端服务器上用 Notebook建议改用jupyter lab --ServerApp.root_dir/path/to/project这样带路径的启动方式避免进入网页版后发现找不到自己的项目文件。3. 跑通两个最接地气的模型算法线性回归与逻辑回归3.1 线性回归从公式到 sklearn 的最小训练脚本机器学习里最常讲的入门算法是线性回归因为它能直接告诉你模型在算什么。假设我们的假设函数是y w1*x1 w2*x2 b训练的目的就是寻找一组合适的w和b让预测值和真实值之间的平方误差尽可能小。这背后是损失函数对权重求偏导再沿着梯度负方向更新参数——也就是“机器学习中的梯度”真正被用到的地方。在 Notebook 中跑一个最小化训练案例我习惯先打印出系数、截距、训练集得分直观看到模型学到的规则。代码块如下import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split X df_exp.drop(price, axis1).values y df_exp[price].values X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) model_lr LinearRegression() model_lr.fit(X_train, y_train) print(模型截距:, model_lr.intercept_) print(模型系数:, model_lr.coef_) print(测试集决定系数:, model_lr.score(X_test, y_test)) # 绘制特征 area 与真实价格的散点与预测趋势 plt.scatter(X[:, 0], y, colorblue, alpha0.6, label真实值) plt.scatter(X[:, 0], model_lr.predict(X), colorred, markerx, label预测值) plt.xlabel(area) plt.ylabel(price) plt.legend() plt.show()这里的intercept_是偏置bcoef_是特征权重。score返回决定系数R²它表示模型解释了多少比例的目标值方差越接近 1 越好。但这个例子样本量太小只有 5 条test_size0.2事实上会将测试集只切出 1 条这不代表模型真实能力只能证明代码路径走通了——这也是用 Notebook 做教学案例时最容易误导初学者的地方样本少的时候正解是用后面会讲的交叉验证。另外random_state42是每次切分都固定随机数种子保证结果可以被重现这是所有实验对比前的第一个参数要求。3.2 分类器怎么选用逻辑回归和朴素贝叶斯先兜底标题里的“机器学习基本模型算法”不仅包含回归任务还天然覆盖分类。逻辑回归虽然名字带“回归”实际上是最常用的二分类器之一。它在线性回归外面套了一层 sigmoid 函数把输出概率映射到 01 之间再用阈值 0.5 决定正负样本。这里我用 scikit-learn 内置的鸢尾花数据作为案例它只有 150 条样本、4 个特征是演示分类器的最好入门数据也符合“机器学习免费公开数据集”的典型形态。from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score, classification_report iris load_iris() X, y iris.data, iris.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state2024 ) clf_lr LogisticRegression(solverlbfgs, max_iter200) clf_lr.fit(X_train, y_train) clf_nb GaussianNB() clf_nb.fit(X_train, y_train) for name, model in [(逻辑回归, clf_lr), (朴素贝叶斯, clf_nb)]: pred model.predict(X_test) acc accuracy_score(y_test, pred) print(f{name} 在测试集上的准确率: {acc:.3f})LogisticRegression里两个重要参数是solver和max_itersolverlbfgs适合小规模数据集且默认走 L2 正则化max_iter是优化算法的最大迭代次数。当你看到ConvergenceWarning时90% 的情况是需要把max_iter调大到 500 或 1000而不是换算法。朴素贝叶斯则不是梯度优化的模型它直接基于贝叶斯定理和特征独立性假设计算先验与条件概率训练速度极快是文本分类和垃圾邮件过滤的常客。用两个模型做对比还能自然引出后续章节中“超参数搜索”的必要性。4. 超参数不是猜出来的用网格搜索加上交叉验证找最佳算法配置4.1 为什么模型的权重和超参数要分开看待很多刚接触机器学习的人在 Notebook 里反复改参数改到准确率高一点就觉得模型“调好了”。但这里藏着一条重要分界线模型内部学习的coef_是训练时根据数据自动更新的而C正则化强度、max_depth树的深度、n_neighbors近邻数量这类参数必须在训练之前由人定好它们统称超参数。超参数决定的是模型假设空间的复杂度C越小正则化越强模型越不容易学过拟合的特征C越大模型越倾向拟合每一个样本点在训练集上表现极好但测试集上可能糟糕。所以必须有一套系统性方案代替人肉调参来寻找较优组合。这正是“机器学习模型中的树模型是假设独立同分布的吗”这类理论问题背后最实际的工程诉求——样本分布一变原来那组超参数就可能失效。4.2 在 Notebook 里写一个网格搜索模型把参数表一目了然列出来这里直接对第 3 章的逻辑回归增加超参数搜索。我们建立一个小型参数空间C从 0.1 到 10 取三个值solver在liblinear和lbfgs之间比较然后用GridSearchCV做五折交叉验证。from sklearn.model_selection import GridSearchCV import warnings warnings.filterwarnings(ignore) param_grid { C: [0.1, 1, 10], solver: [liblinear, lbfgs], max_iter: [100, 300], } gs GridSearchCV( estimatorLogisticRegression(), param_gridparam_grid, cv5, scoringaccuracy, n_jobs-1, ) gs.fit(X_train, y_train) print(最优参数组合:, gs.best_params_) print(最优交叉验证得分:, gs.best_score_) print(测试集得分:, gs.score(X_test, y_test))这里的执行路径是GridSearchCV先把param_grid中的组合全部枚举出来3 * 2 * 2 12 种每一种组合在训练数据上做 5 折交叉验证——把训练集再切成五份轮流拿出其中一份当验证集其余四份训练最终把五次的平均精度作为该组合的分数。n_jobs-1表示用全核并行。这套代码直接回答了“算法流程图”怎么落地先定义候选集合再循环验证最后取最高分者作为最终模型。上面的搜索结果会打印出类似{C: 0.1, max_iter: 300, solver: liblinear}的输出。这一步还能顺手解决一个常见的完整性问题当我们说“模型算法介绍”时只列出准确率远远不够还要给出每个类别的precision、recall、f1-score下面这段代码可以直接接在网格搜索之后from sklearn.metrics import classification_report final_model gs.best_estimator_ y_pred final_model.predict(X_test) print(classification_report(y_test, y_pred, target_namesiris.target_names))4.3 把一整套预处理也放进 Pipeline防止数据穿越新手常在 Notebook 里犯一个隐蔽错误先对全量数据做标准化、再切训练测试集。这样测试集的信息偷偷参与了训练会让模型评估虚高。更规范的做法是把标准化作为整个流水线的一部分只让它从训练集中学习均值方差。用Pipeline把「标准化 模型」包在一起再丢给GridSearchCV这样每一折交叉验证时都会重新做一次只基于折内训练数据的标准化。from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler pipe Pipeline([ (scaler, StandardScaler()), (lr, LogisticRegression()), ]) param_grid_pipe { lr__C: [0.1, 1.0, 10.0], lr__solver: [liblinear], } gs_pipe GridSearchCV(pipe, param_grid_pipe, cv5, scoringaccuracy) gs_pipe.fit(X_train, y_train) print(gs_pipe.best_params_)注意param_grid_pipe的键名里用双下划线连接lr__C这是 Pipeline 向内部模型传参的固定语法。跑完你会看到最优参数为{lr__C: 0.1, lr__solver: liblinear}和单独调逻辑回归结论一致但泛化评估更严谨。数据标准化对逻辑回归没有本质增益但对 SVM、KNN 这类基于距离的算法影响极大这个知识点建议笔头记下来。5. 最后一步在真实样本上限“过拟合”边界用一个混淆矩阵收尾机器学习模型做出来不是光看一个准确率就结束的。我把自己在用的一套验证夹带到这一章找一个类别分布天然不平衡的数据集切出训练测试集后训练随机森林分类器然后打印完整的混淆矩阵。这里的价值在于准确率在类别倾斜时毫无意义而混淆矩阵能精确告诉你模型在哪些样本上犯错。以手写数字数据集load_digits为例它包含 1797 个 8x8 灰度图像共 10 个类别09训练和验证路径如下from sklearn.ensemble. RandomForestClassifier from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay digits load_digits() X, y digits.data, digits.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state88 ) clf_rf RandomForestClassifier( n_estimators300, max_depth8, min_samples_split4, random_state7, ) clf_rf.fit(X_train, y_train) y_pred clf_rf.predict(X_test) cm confusion_matrix(y_test, y_pred) print(混淆矩阵:) print(cm)这里的n_estimators是森林中的树数量max_depth限制森林里每棵决策树的深度min_samples_split是内部分裂所需最小样本数。这三个参数直接控制模型复杂度树越多越稳但会导致推理变慢深度越深越容易过拟合min_samples_split越大树越不容易学到噪声。改完参数后能同步看到混淆矩阵的对角线数值变化。如果想观察过拟合发生的过程我习惯再画一张学习曲线横轴是训练集样本数量纵轴是模型得分两条曲线分别对应训练集和验证集。当训练集分数远高于验证集分数且两条曲线之间的间距在数据量增加时也不缩小时就是过拟合的铁证。它比直接看测试集一次性的分数要可靠得多也能明确告诉你当前解法“再加数据”是否有效。放到日常项目中这套“训练集/测试集/交叉验证/混淆矩阵/学习曲线”的组合就是模型落地前最基础也最完整的结算方式。本文还有配套的精品资源点击获取
返回列表