从线性回归实战到Python依赖安装踩坑:我的机器学习入门排雷记

从线性回归实战到Python依赖安装踩坑:我的机器学习入门排雷记

最近一直再整理近三年的各变成语言学习心得,感兴趣的小伙伴可以收藏下《bug》专栏,有需要自行翻阅或建楼交流。

当时,作为一名机器学习纯小白,从最基础的线性回归入手敲代码实战,本想顺顺利利跑通模型+可视化,结果一路踩坑不断,从代码语法错误、梯度下降NaN值问题,到matplotlib中文显示异常,最后还卡在了Python依赖包安装的Rust编译器缺失问题上。折腾了大半天,终于把所有问题逐一解决,也攒下了一堆入门级排雷经验,在此整理成篇,希望能给同是小白的朋友避避坑。

一、线性回归代码初写:语法错误与梯度爆炸的双重暴击

我的实战起点是手写一个基于梯度下降的线性回归模型,用来预测房屋面积与房价的关系,核心需求很简单:实现模型训练、新数据预测,再加上可视化看训练效果。本以为照着思路敲代码就行,结果刚运行就遇到了第一个坎。

问题1:基础语法错误扎堆

最初的代码里藏着好几个低级语法问题:np.hstack调用时缺失右括号、print语句末尾少括号、类外部错误使用self关键字,还有把张量形状修改的reshape写成了属性shape。这些问题直接导致代码无法运行,满屏的SyntaxErrorNameError
解决策略 :逐行检查代码,对照Numpy和Python基础语法修正,将类外多余的训练循环移到类的fit方法内部,确保所有函数调用的括号成对、关键字使用在正确作用域内。

问题2:梯度下降出现NaN值,参数更新异常

修正语法后,代码能运行了,但出现了RuntimeWarning: invalid value encountered in subtract警告,模型参数theta变成了NaN,根本无法完成训练。排查后发现是学习率设置过大 导致的梯度爆炸,再加上特征数据没有做标准化,数值量级差异让梯度下降无法收敛。
解决策略

  1. 引入sklearn.preprocessing.StandardScaler对特征数据做标准化处理,让数据满足零均值、单位方差,降低梯度爆炸风险;
  2. 调小学习率(从0.01逐步测试,结合标准化后最终稳定在0.01);
  3. 检查数据有效性,添加np.isnannp.isinf校验,确保训练数据无无效值。

二、可视化添彩:中文显示乱码与损失值未存储的新问题

模型能正常训练后,想给代码加上可视化功能------绘制损失函数变化曲线看训练收敛情况,绘制散点图+预测曲线看模型拟合效果,结果又遇到了两个新问题。

问题1:AttributeError: 'LinearRegression' object has no attribute 'losses'

添加损失曲线绘制代码后,运行报错提示线性回归类没有losses属性。原因是只在可视化部分调用了model.losses,但没有在类中初始化这个用于存储每轮损失值的列表,也没有在训练循环中计算并添加损失值。
解决策略

  1. 在类的__init__方法中初始化self.losses = [],用于存储每轮迭代的均方误差;
  2. fit方法的训练循环中,新增均方误差计算代码loss = np.mean((y_pred - y) ** 2),并将损失值添加到self.losses中。

问题2:RuntimeWarning: Glyph 25454 missing from current font

损失曲线和拟合曲线能绘制了,但matplotlib报出字体缺失警告,图表中的中文标题、坐标轴标签全部变成方框,无法正常显示。这是因为matplotlib默认字体不支持中文字符。
解决策略 :在代码开头添加matplotlib字体配置,指定支持中文的字体(如黑体SimHei),同时解决负号显示异常问题:

python 复制代码
from matplotlib import pyplot as plt
# 设置matplotlib支持中文
plt.rcParams['font.family'] = 'SimHei'
# 解决负号显示为方框的问题
plt.rcParams['axes.unicode_minus'] = False

至此,手写线性回归模型的代码终于完全跑通:能正常生成训练数据、完成模型训练、输出预测结果,还能通过可视化直观看到损失函数随迭代次数下降,以及模型对数据的拟合效果,这部分的坑总算全部踩平。

三、拓展实战:依赖包安装遇阻,Rust编译器成拦路虎

线性回归实战搞定后,想拓展学习其他机器学习相关内容,需要安装flasktransformerstextblob等依赖包,于是在Anaconda的tensorflow环境中执行pip install flask flask-sqlalchemy transformers textblob flask-socketio redis faker,结果又遇到了最棘手的一个问题。

问题:tokenizers包构建失败,提示can't find Rust compiler

安装过程中,大部分包能正常下载,但transformers的依赖包tokenizers在构建wheel时报错,核心提示是找不到Rust编译器 。原来tokenizers底层由Rust语言开发,安装时需要Rust编译器进行编译构建,而我的系统中并未安装Rust。

同时,安装过程中还出现了清华源的部分包下载提示"系统内部异常""网页解析失败",但不影响核心包下载,暂未深究。

解决策略:安装Rust编译器(rustup)

根据报错提示,前往Rust官方安装地址https://rustup.rs下载安装程序,按照指引进行安装:

  1. 运行rustup安装程序后,出现交互界面,显示默认安装配置:Cargo主目录为C:\Users\1\.cargo,相关命令路径为C:\Users\1\.cargo\bin,自动修改系统PATH环境变量,默认工具链为stable;
  2. 无特殊需求,直接选择标准安装(选项1),按回车键确认,安装程序会自动下载并配置Rust编译器、Cargo包管理工具;
  3. 安装完成后,重启命令行窗口,执行rustc --version验证,显示版本信息即说明安装成功;
  4. 重新执行pip install命令,此时tokenizers能正常编译构建,所有依赖包顺利安装。

四、整个过程的坎坷与收获

那些让人头疼的坎坷

  1. 基础不扎实导致低级错误:作为纯小白,对Python语法、Numpy函数的使用细节不熟悉,写出了括号缺失、作用域错误等低级代码,浪费了不少排查时间;
  2. 机器学习基础概念理解不到位:一开始不知道梯度下降需要做数据标准化,也不理解学习率过大的后果,遇到NaN值时完全摸不着头脑,不清楚梯度爆炸的本质原因;
  3. 第三方库使用细节不了解 :对matplotlib的字体配置、tokenizers的底层实现完全不知情,遇到问题后需要从头查文档、找解决方案;
  4. 环境配置的隐蔽性问题:依赖包安装的问题并非Python本身,而是牵扯到Rust编译器这类跨语言工具,超出了初期的认知范围,排查起来难度最大。

最终达成的结果

  1. 成功手写实现了基于梯度下降的线性回归模型,掌握了模型的核心逻辑:特征处理、参数初始化、梯度计算、参数更新、预测推理;
  2. 为模型添加了完整的可视化功能,能通过损失曲线观察训练收敛过程,通过散点图+预测曲线直观评估模型拟合效果;
  3. 解决了matplotlib中文显示异常问题,掌握了第三方库的基础配置技巧;
  4. 成功安装了所需的Python依赖包,解决了Rust编译器缺失的环境配置问题,打通了后续拓展学习的环境通道;
  5. 积累了一套小白级的问题排查思路:从语法错误到逻辑错误,从代码问题到环境问题,逐层级排查、对照报错信息找解决方案。

五、小白入门的几点建议

  1. 打好基础再动手:Python基础语法、Numpy/Pandas等数据处理库的基本使用,是机器学习实战的前提,避免因低级语法错误耽误时间;
  2. 理解概念再敲代码:不要死记硬背模型代码,先理解梯度下降、数据标准化等核心概念的本质,知道"为什么要做",再去实现"怎么做";
  3. 善用报错信息:Python的报错信息很重要,学会从报错信息中定位问题位置(如行号、错误类型),关键词搜索报错信息,大部分问题都能找到现成的解决方案;
  4. 环境配置单独记:Python的环境配置(如Anaconda环境、第三方库安装、跨语言依赖)是独立的知识点,遇到问题后及时整理解决方案,形成自己的环境配置笔记;
  5. 别怕踩坑,多试多练:机器学习入门阶段踩坑是常态,每解决一个问题,就是一次知识的积累,从错误中总结的经验,比单纯看教程更深刻。

机器学习入门之路,从来都不是一帆风顺的,尤其是对于纯小白来说,从代码到环境,从概念到实战,每一步都可能遇到新问题。但只要沉下心来逐层级排查,把遇到的坑一个个填平,就能在这个过程中慢慢建立起自己的知识体系,为后续的学习打下坚实的基础。愿每一个机器学习小白,都能在踩坑中成长,在实战中进步!

相关推荐
干啥啥不行,秃头第一名2 小时前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
二闹2 小时前
一文了解Python里的函数名和函数参数到底啥关系?
后端·python
温九味闻醉2 小时前
Meta | HSTU:生成式推荐工业级方案
人工智能·深度学习·机器学习
宵时待雨2 小时前
C++笔记归纳15:红黑树
开发语言·数据结构·c++·笔记
黑眼圈子2 小时前
牛客刷题记录5
java·开发语言·学习·算法
罗湖老棍子2 小时前
【例 2】A Simple Problem with Integers(信息学奥赛一本通- P1548)
数据结构·算法·线段树·区间修改 区间查询
abant22 小时前
leetcode 148 排序链表 归并终极形态
算法·leetcode·链表
sin°θ_陈2 小时前
前馈式3D Gaussian Splatting 研究地图(路线一):像素对齐高斯的起点——pixelSplat 与 latentSplat 在解决什么
python·深度学习·3d·aigc·webgl·3dgs·空间智能