从线性回归实战到Python依赖安装踩坑:我的机器学习入门排雷记
最近一直再整理近三年的各变成语言学习心得,感兴趣的小伙伴可以收藏下《bug》专栏,有需要自行翻阅或建楼交流。
当时,作为一名机器学习纯小白,从最基础的线性回归入手敲代码实战,本想顺顺利利跑通模型+可视化,结果一路踩坑不断,从代码语法错误、梯度下降NaN值问题,到matplotlib中文显示异常,最后还卡在了Python依赖包安装的Rust编译器缺失问题上。折腾了大半天,终于把所有问题逐一解决,也攒下了一堆入门级排雷经验,在此整理成篇,希望能给同是小白的朋友避避坑。
一、线性回归代码初写:语法错误与梯度爆炸的双重暴击
我的实战起点是手写一个基于梯度下降的线性回归模型,用来预测房屋面积与房价的关系,核心需求很简单:实现模型训练、新数据预测,再加上可视化看训练效果。本以为照着思路敲代码就行,结果刚运行就遇到了第一个坎。
问题1:基础语法错误扎堆
最初的代码里藏着好几个低级语法问题:np.hstack调用时缺失右括号、print语句末尾少括号、类外部错误使用self关键字,还有把张量形状修改的reshape写成了属性shape。这些问题直接导致代码无法运行,满屏的SyntaxError和NameError。
解决策略 :逐行检查代码,对照Numpy和Python基础语法修正,将类外多余的训练循环移到类的fit方法内部,确保所有函数调用的括号成对、关键字使用在正确作用域内。
问题2:梯度下降出现NaN值,参数更新异常
修正语法后,代码能运行了,但出现了RuntimeWarning: invalid value encountered in subtract警告,模型参数theta变成了NaN,根本无法完成训练。排查后发现是学习率设置过大 导致的梯度爆炸,再加上特征数据没有做标准化,数值量级差异让梯度下降无法收敛。
解决策略:
- 引入
sklearn.preprocessing.StandardScaler对特征数据做标准化处理,让数据满足零均值、单位方差,降低梯度爆炸风险; - 调小学习率(从0.01逐步测试,结合标准化后最终稳定在0.01);
- 检查数据有效性,添加
np.isnan和np.isinf校验,确保训练数据无无效值。
二、可视化添彩:中文显示乱码与损失值未存储的新问题
模型能正常训练后,想给代码加上可视化功能------绘制损失函数变化曲线看训练收敛情况,绘制散点图+预测曲线看模型拟合效果,结果又遇到了两个新问题。
问题1:AttributeError: 'LinearRegression' object has no attribute 'losses'
添加损失曲线绘制代码后,运行报错提示线性回归类没有losses属性。原因是只在可视化部分调用了model.losses,但没有在类中初始化这个用于存储每轮损失值的列表,也没有在训练循环中计算并添加损失值。
解决策略:
- 在类的
__init__方法中初始化self.losses = [],用于存储每轮迭代的均方误差; - 在
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编译器成拦路虎
线性回归实战搞定后,想拓展学习其他机器学习相关内容,需要安装flask、transformers、textblob等依赖包,于是在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下载安装程序,按照指引进行安装:
- 运行rustup安装程序后,出现交互界面,显示默认安装配置:Cargo主目录为
C:\Users\1\.cargo,相关命令路径为C:\Users\1\.cargo\bin,自动修改系统PATH环境变量,默认工具链为stable; - 无特殊需求,直接选择标准安装(选项1),按回车键确认,安装程序会自动下载并配置Rust编译器、Cargo包管理工具;
- 安装完成后,重启命令行窗口,执行
rustc --version验证,显示版本信息即说明安装成功; - 重新执行
pip install命令,此时tokenizers能正常编译构建,所有依赖包顺利安装。
四、整个过程的坎坷与收获
那些让人头疼的坎坷
- 基础不扎实导致低级错误:作为纯小白,对Python语法、Numpy函数的使用细节不熟悉,写出了括号缺失、作用域错误等低级代码,浪费了不少排查时间;
- 机器学习基础概念理解不到位:一开始不知道梯度下降需要做数据标准化,也不理解学习率过大的后果,遇到NaN值时完全摸不着头脑,不清楚梯度爆炸的本质原因;
- 第三方库使用细节不了解 :对matplotlib的字体配置、
tokenizers的底层实现完全不知情,遇到问题后需要从头查文档、找解决方案; - 环境配置的隐蔽性问题:依赖包安装的问题并非Python本身,而是牵扯到Rust编译器这类跨语言工具,超出了初期的认知范围,排查起来难度最大。
最终达成的结果
- 成功手写实现了基于梯度下降的线性回归模型,掌握了模型的核心逻辑:特征处理、参数初始化、梯度计算、参数更新、预测推理;
- 为模型添加了完整的可视化功能,能通过损失曲线观察训练收敛过程,通过散点图+预测曲线直观评估模型拟合效果;
- 解决了matplotlib中文显示异常问题,掌握了第三方库的基础配置技巧;
- 成功安装了所需的Python依赖包,解决了Rust编译器缺失的环境配置问题,打通了后续拓展学习的环境通道;
- 积累了一套小白级的问题排查思路:从语法错误到逻辑错误,从代码问题到环境问题,逐层级排查、对照报错信息找解决方案。
五、小白入门的几点建议
- 打好基础再动手:Python基础语法、Numpy/Pandas等数据处理库的基本使用,是机器学习实战的前提,避免因低级语法错误耽误时间;
- 理解概念再敲代码:不要死记硬背模型代码,先理解梯度下降、数据标准化等核心概念的本质,知道"为什么要做",再去实现"怎么做";
- 善用报错信息:Python的报错信息很重要,学会从报错信息中定位问题位置(如行号、错误类型),关键词搜索报错信息,大部分问题都能找到现成的解决方案;
- 环境配置单独记:Python的环境配置(如Anaconda环境、第三方库安装、跨语言依赖)是独立的知识点,遇到问题后及时整理解决方案,形成自己的环境配置笔记;
- 别怕踩坑,多试多练:机器学习入门阶段踩坑是常态,每解决一个问题,就是一次知识的积累,从错误中总结的经验,比单纯看教程更深刻。
机器学习入门之路,从来都不是一帆风顺的,尤其是对于纯小白来说,从代码到环境,从概念到实战,每一步都可能遇到新问题。但只要沉下心来逐层级排查,把遇到的坑一个个填平,就能在这个过程中慢慢建立起自己的知识体系,为后续的学习打下坚实的基础。愿每一个机器学习小白,都能在踩坑中成长,在实战中进步!