1. 课程定位:为什么“数据分析+机器学习”得放在一起学
1.1 这个组合到底在解决什么问题
先说个现象。很多人学Python的时候,是先学语法,然后学数据结构,再学文件操作,学完感觉自己啥都会了,结果拿到一份真实的业务数据,依然是两手空空。为什么?因为语法只是工具,真正值钱的是“拿到数据之后怎么处理、怎么从中挖出有价值的信息、怎么把信息转成决策依据”这一整条链路。
“Python数据分析与机器学习实战课程”这门课,它的立脚点正好卡在这条链路上。它不是一门纯Python语法课,也不是一门纯算法理论课,它要解决的是一个非常现实的问题:**如何用Python把一份乱七八糟的原始数据,变成清晰的图表和可用的模型结果。**数据分析解决的是“过去和现在发生了什么”,机器学习解决的是“接下来大概率会发生什么”,两件事串起来,才是一个完整的项目闭环。
很多人有一个误区,认为机器学习高高在上,数据分析只是画几张图,两者是割裂的。实际上,我在真实项目里跑过的流程几乎永远是:先用Pandas把数据洗到能用的状态,画图观察分布和趋势,再根据观察结果决定用哪个模型。没有前一步的数据分析,后面模型的准确率基本靠运气。这门课把两者放一起讲,恰恰还原了真实工作流的顺序,这是它最值钱的地方。
1.2 视频课程和书本最大的区别在哪
同类书比如《利用Python进行数据分析》和《机器学习西瓜书》,我都翻过不止一遍。书写得好不好?好。但书的致命问题是:它默认你读完了就会了,而实际动手时,你连Pandas里groupby之后为什么得到一个DataFrame而不是Series这种细节,都要卡半天。视频课不一样,它把“代码运行的中间过程”直接展示在你面前,哪里报错、哪里数据变了型、哪里索引对不上,一眼就能看出来。
我自己带新人的时候,最头疼的就是他们对着书抄代码,抄完运行报错,也不知道错在哪。视频课等于有人坐在你旁边,边敲边给你讲“这一步为什么会这么写”“这里不这么写会出什么问题”。这种陪伴感是文字材料给不了的,尤其是对刚开始接触Pandas和sklearn的学员来说,跟着视频敲一遍,比默读十页书都管用。
当然,视频课的坑也在“跟着敲”这三个字上。很多人开着视频1.5倍速,全程手没停,代码跟着敲完了,关掉视频脑子一片空白。所以我在后面专门写一节视频课的正确打开方式,那是从我自己踩坑和带人踩坑里总结出来的。
1.3 这门课适合谁,不适合谁
说点实在的。如果你满足下面任何一个条件,这门课的内容对你是有用的:
- 刚学完Python基础语法,正愁不知道拿它干什么;
- 工作中已经开始接触Excel搞不定的数据,想升级到Python;
- 想转行做数据分析或数据挖掘,缺一份完整的项目实操经验;
- 大学课程学了机器学习理论,但从来没正经跑通一个sklearn模型;
- 准备期末考或者面试,需要把概念和代码对上号。
反过来,如果你已经是资深数据工程师,日常工作就是调Hive、写Spark,那这门课的前半部分对你来说太基础了,你可以直接跳过数据分析部分,只看后半段的机器学习建模和特征处理章节。另外,如果你连Python都没装过、完全零基础,最好先花一两天把基本语法过一遍再来,不然跟着视频敲代码会很吃力——不是说完全跟不上,而是你会把大量注意力花在“为什么这里要加冒号”上,反而忽略了真正的数据分析逻辑。
提示:判断自己适不适合,最简单的方法是找课程目录里“数据清洗”那节的视频,先看十分钟。如果你能看懂它讲的是“处理缺失值、统一数据类型”,而不是一脸懵地纠结语法,就可以直接开整。
2. 环境搭建:别让安装配置拖慢你的进度
2.1 Python安装的常见坑与建议
热搜词里有大量“python安装”“python下载安装教程”“python 3.8”,说明被环境卡住的绝对不是少数人。这部分我多说几句,因为我当年也在这里浪费过整整一个下午。
第一个建议:不要自己去官网下Python,再手动配环境变量。你如果只用Python做数据分析,最省事的方案是直接装Anaconda。Anaconda是什么?你可以把它理解成一个“带全家桶的Python启动器”,里面不光有Python解释器,还有Pandas、NumPy、Matplotlib、Jupyter这些数据分析常用的库,装完就能用,不用一个个去折腾pip install。
我知道会有人杠:Anaconda太臃肿了,占用好几个G。这话说得没错,但对新手来说,臃肿换来的省心是值得的。等你熟练了,知道哪些库是常用的,再换成Miniconda或者纯Python加requirements.txt也不迟。我见过太多初学者卡在“Python装好了但numpy import不了”这种问题上,一问原因,全是环境变量、路径、版本兼容的锅,这些破事离真正的数据分析十万八千里,却不声不响地劝退了很多人。
第二个建议涉及版本问题。不要装最新的Python 3.12或3.13,除非你确认所有库都支持。我的经验是Python 3.8到3.10这个区间最稳,因为Pandas、sklearn、TensorFlow这些库在这个区间经过了最多测试。如果你用的是Anaconda,默认自带的Python版本就已经是经过验证的,那就更不用担心了。
2.2 NumPy、Pandas、Matplotlib的安装与验证
如果你坚持用纯Python环境,那安装依赖库就是绕不开的一步。最常用的三个库:NumPy(数值计算)、Pandas(表格处理)、Matplotlib(绘图)。安装命令非常简单:
pip install numpy pandas matplotlib但我想多说一个隐藏知识点:装库之前,先确认你用的pip是哪个Python的pip。很多莫名其妙的“装完还报ModuleNotFoundError”,根源在于终端里的pip和Python不是同一套环境。你在命令行敲下面这条命令,看输出里的路径,如果这个路径和你写代码用的Python路径对不上,那装一百遍也没用:
pip show numpy正常情况你会看到类似这样的输出:
Name: numpy Version: 1.24.3 Location: /opt/anaconda3/lib/python3.10/site-packages如果Location指向的路径不是你当前Python解释器的路径,那就说明你混用了多个环境。解决方法也很简单:用python -m pip install numpy来装,python -m会保证pip运行在当前Python解释器对应的环境里。
装完之后,建议立刻做个验证,别急着开始看视频:
import numpy as np import pandas as pd import matplotlib.pyplot as plt print(np.__version__) print(pd.__version__) print(plt.__version__) arr = np.arange(12).reshape(3, 4) print(arr)这几行代码能跑通,说明环境基本没问题,后面看视频的时候手就不抖了。
2.3 用Jupyter还是编辑器:各取所需
关于用Jupyter还是用PyCharm,或者VS Code,这个争议一直很大。我的看法是:做分析和做工程,本来就是两种不同思路,没必要争个高下。
数据分析讲究的是“一步步探索”。你读入数据,看一眼数据结构,做一步清洗,再看一眼结果,画个图观察规律。整个过程是碎片的、迭代的、探索性的。这种场景Jupyter Notebook就是神器,因为它把代码、运行结果、图表全部放在同一个页面里,每一步都看得见摸得着。视频课里绝大部分演示也都基于Jupyter,跟随性最好。
但到了要写一个自动化脚本、每天定时跑一遍报表的时候,Jupyter就不合适了。那时候你需要的是VS Code或者PyCharm,把逻辑写成一个完整的.py文件,加上函数和异常处理,才能交付给别人用。我见过一个数据新手,在Jupyter里写了两百多行代码,最后要把脚本部署到服务器上跑定时任务,急得直挠头——因为他不知道怎么把Notebook转成脚本,里面的变量一层嵌套一层,根本没法独立运行。
所以我的建议是:**跟着课程做项目时用Jupyter,做完一个阶段后,自己尝试把核心逻辑整理成一个.py文件。**这一步能帮你把“探索型思维”转换成“工程型思维”,面试和实际工作里都特别加分。
3. 数据分析实战:以真实场景为骨架
3.1 数据清洗才是重头戏,别急着画图
很多初学者拿到一份CSV,第一件事就是赶紧data.plot()看看长什么样。翻车现场我见得太多了:横坐标为文字,日期格式全都乱掉,数据里有空值一画图就断线,还有重复值导致柱状图莫名其妙地高出一截。你要明白一个道理:数据可视化是最后一公里,前面百分之八十的工作都在清洗数据。
以Pandas为例,最常用的清洗流程我帮你拆成四步走:
第一步,读入数据后立刻看元信息。
df = pd.read_csv('sales_data.csv') print(df.shape) print(df.info()) print(df.head())df.shape告诉你总共有多少行多少列,df.info()告诉你每一列的数据类型和非空数量。这一眼扫过去,你就能确认:哪些列有空值、哪些数字列被读成了字符串、哪些列名带着乱七八糟的空格。不要跳过着一步,后面所有分析都建立在“我对数据底细心里有数”这个前提下。
第二步,处理缺失值。
缺失值的处理不是只有“删”和“填”两种选项,关键在于理解缺失值为什么会出现。如果某列缺失了超过一半的数据,而且这列对你的业务分析没有直接帮助,直接drop掉;如果世界上的缺失值零零散散,时间序列类的数据可以用前向填充,数值型的可以用均值或中位数填。这里有个细节,视频课里通常会演示,但你可能没意识到它的重要性:**先区分“数值缺失”和“业务缺失”。**比如销售额为0是业务上本来就该是0,销售额为空才是数据缺失。这两种情况清洗策略完全不同,处理错了后面做出来的报表会误导决策。
第三步,统一数据类型。
日期列明明写着“2025-01-15”,读进来却是字符串,你画折线图的时候横坐标按字母顺序排,完全乱套。用pd.to_datetime()转一次就能根治:
df['日期'] = pd.to_datetime(df['日期'])数字列里混入了空格和逗号,比如“1,000”这种,读进来会变成字符串,这时候要用pd.to_numeric()配合errors='coerce'做处理。这些都是细节,但每一个细节都决定你能不能舒舒服服地画图。
第四步,检查重复值。
print(df.duplicated().sum()) df = df.drop_duplicates()重复数据在真实业务里很常见,特别是七库系统导出多张表合并之后,重复行如果不处理,统计结果会虚高。这一步看起来不起眼,但它是数据质量的生命线。
3.2 可视化实操:图表的密度、配色与取舍
热搜词里有“python画图横坐标太密集”,这是我在答疑里被问得最多的问题之一。场景一般是这样的:你有一个时间序列,跨度是一整年,数据是每天的,画折线图横坐标就变成了365个点。Matplotlib默认会尝试把所有刻度都显示出来,结果就是一团黑,啥也看不清。
解决方法有三种,我按推荐度排序:
**第一种,设置刻度步长和旋转。**这是最简单最实用的:
plt.figure(figsize=(12, 6)) plt.plot(df['日期'], df['销售额']) plt.xticks(ticks=df['日期'][::30], rotation=45) plt.tight_layout() plt.show()df['日期'][::30]的意思是每隔30天取一个刻度,这样365个点就变成了12个刻度,整整齐齐。rotation=45让标签斜着放,避免重叠。
第二种,用plt.locator_params控制刻度数量。
ax = plt.gca() ax.locator_params(axis='x', nbins=12)设置了nbins=12,Matplotlib会自动帮你挑选大约12个刻度位置,不用手动切数据,省事。
第三种,如果时间范围太长,考虑按月份聚合后再画。
这一步同时涉及了数据分析的核心思维:不是所有原始数据都适合直接可视化,你需要先站在“看的视角”决定粒度。举例说,365天的日数据画出来,如果只看趋势不看波动,按周聚合或者按月聚合并画,比强行压缩横坐标好看得多:
df_monthly = df.resample('ME', on='日期')['销售额'].sum() df_monthly.plot(kind='line', marker='o')关于配色,多说一句。Matplotlib默认的蓝色C0本身不难看,但如果你想跟视频课的效果对齐,可以设一套统一的样式,让所有图表的字号、网格、颜色风格一致。我一般在项目开头习惯性地写:
import matplotlib as mpl mpl.rcParams['axes.grid'] = True mpl.rcParams['grid.alpha'] = 0.3 mpl.rcParams['figure.dpi'] = 120 mpl.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 mpl.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块中文乱码这个问题在中文分析项目里几乎必然出现,很多视频课用的Mac,,Windows上跑出来中文就变方块,问题就出在缺少中文字体配置。上面两行一加就能解决,记得收藏。
3.3 行业案例拆解:从白酒、中药材到制造业
热搜词里有“白酒销售数据分析和可视化”“中药材数据分析可视化”“制造业数据分析”,这些不是课程本身就有的案例,但它们的分析思路是通用的。我拿白酒销售这个最典型的场景来拆一下,你就知道这种案例分析到底在做什么了。
白酒销售数据的核心分析目标,无非是这几个:**哪个月卖得最好、哪个品牌/度数/价位的产品贡献的利润最高、不同区域的销售差异有多大、下一步库存怎么备。**对应到技术动作:
# 按月统计销售额 monthly_sales = df.groupby(df['日期'].dt.month)['销售额'].sum() # 按产品线和区域做透视表 pivot = pd.pivot_table(df, index='区域', columns='产品线', values='销售额', aggfunc='sum') # 利润率计算 df['利润率'] = (df['销售额'] - df['成本']) / df['销售额']这三段代码背后,是数据分析最经典的“拆维”思路。原始数据每一行是一笔订单,这是明细维度;你关心的是“月度”这个维度,于是groupby按月聚合;你又关心“区域×产品线”这两个维度的交叉关系,于是pivot_table做一个交叉表。所谓数据分析能力,很大程度上就是“知道在什么业务问题面前,该把数据切成什么形状”。
中药材数据的分析逻辑也差不多,但多了一个字段值得注意——产地和采收季节。中药材最典型的分析是“哪些药材价格波动最大”,这时候跨不同产地的均价比较、季节性的涨幅,都是分析的切入点。制造业数据则不太一样,它更多是设备状态的时间序列数据,比如温度、转速、震动频率,分析目标常常是“哪个参数和良品率相关”,这种场景往往需要先做相关性分析:
corr_matrix = df[['温度', '转速', '震动', '良品率']].corr()如果转速和良品率的相关系数接近-0.8,说明转速越高良品率越低,下一步你就可以建议“把产线转速下调10%,良品率可能提升几个点”。这一步在真实世界里就是实打实的利润。
3.4 大数据分析场景:Hive与Spark怎么配合
热搜词里有“网约车大数据综合项目——数据分析hive”“spark数据分析案例”。这里稍微多说两句,因为当数据量大到单机Pandas跑不动的时候,整个技术栈就开始变了。
Pandas处理的舒适区是几百万行的数据量,再往上,单机内存不够用,速度也会慢到让人怀疑人生。这时候的选择一般是两个方向:一是用HiveSQL做离线批处理,数据量大到几个T甚至几个P,就放HDFS上用Hive算;二是用Spark做分布式的内存计算,比Hadoop经典MapReduce快很多,交互式分析更友好。
很多人学Python的时候会问:我都用Python了,还要学Hive和Spark吗?我的建议是看你的目标岗位。如果只是做业务侧的数据分析,Pandas和SQL基本够用;如果是做数据开发或大数据方向,那Hive和Spark就是必备技能。关键在于理解两者的边界:数据量决定技术选型,数据量还在单机范围内,不要为了炫技硬上Spark,那只会把简单问题复杂化。
网约车那种场景,一般涉及海量的订单表、司机轨迹表、用户行为表,分析的常规套路包括:时段高峰分析(几点接单最快)、区域热力分析(哪里叫车需求最大)、司机活跃度分群、空驶率计算。这些在Hive里用SQL写起来并不复杂,核心还是那个思路:搞清楚每个表的主键、时间字段、地域字段,然后用GROUP BY把维度拆出来,再用JOIN把多张表的信息串联起来。如果你Pandas玩得熟了,学HiveSQL会特别快,因为两者在思维上是同构的——都是一个表,你从里面筛选、聚合、关联,只是语法不一样而已。
4. 机器学习:从数据处理到模型落地
4.1 机器学习中的数据处理到底是什么
很多人在这个环节有个巨大的理解偏差。他们以为机器学习入门就是调sklearn,训练模型,看准确率,然后就完事了。实际上,业界有一句老话:模型决定上限,数据处理决定你离上限有多近。我面试候选人的时候,基本都会问“你的特征是怎么处理的”,能把这部分讲清楚的人,远比只会说“我用的是随机森林”的人有说服力。
机器学习中的数据处理,至少包括下面这些动作:
标准化/归一化。比如有两个特征,一个是“年龄”,范围20到60;另一个是“月消费金额”,范围1万到10万。如果不做标准化,模型计算距离或者梯度时,年龄这个特征基本上被淹没在金额的量级里。你的模型看似在学,其实只学到了金额这一个维度的信息。所以对线性模型、SVM、KNN这类对特征尺度敏感的算法,先用StandardScaler把每个特征变成均值0、方差1,这是常规操作。
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X)但对树模型(决策树、随机森林、XGBoost)来说,特征缩放意义不大,因为树模型只关心特征分裂点的顺序,不关心特征的绝对值大小。这一点视频课里不一定讲,但实际调参时非常关键——别拿着树模型还要硬做标准化,纯属浪费时间。
类别特征编码。机器学习模型只能吃数字,但真实数据里充满了“城市”“职业”“产品类型”这种字符串。处理方式有三种:一是LabelEncoder直接给标签编号,适合有序类别;二是OneHotEncoder做独热编码,适合无序类别,尤其当类别在几个到几十个的时候;三是目标编码,拿目标变量的平均值给类别赋值,适合类别特别多的场景。我的建议是:类别少用独热编码,类别多(上百个)用目标编码,中间地带看你的经验判断。
缺失值处理。和数据分析阶段的处理不太一样,机器学习不能简单粗暴地dropna(),因为每一行都带着特征信息,删了可能要丢掉有用的样本。更常规的做法是:数值型用中位数填充(对离群值更鲁棒),类别型用众数填充,或者直接填充一个新类别“Unknown”。sklearn里可以用SimpleImputer统一处理,再配合Pipeline把填充和建模串在一起,避免在交叉验证的时候数据泄漏。
4.2 算法选择:从线性回归到集成学习
很多初学者最头疼的问题就是:“这么多算法,我到底该用哪个?”我的回答永远是:先看任务类型,再看数据量,然后从最简单的开始尝试。
如果是回归任务(预测连续值,比如销售额、房价、温度),首选线性回归或岭回归。为什么?不是因为它们效果最好,而是因为它们是“白盒”——你一眼就能看出哪些特征对预测结果影响最大,特征系数一目了然。我跑过太多项目,线性回归的结果和复杂模型的精确度相差不到3%,但可解释性差出十万八千里。老板问你“为什么预测下个月销量是1万2”,你可以指着系数说“因为促销活动这个特征贡献了+2500的增量”,换成XGBoost你就只能摊手了。
如果是分类任务(预测类别,比如客户是否会流失、贷款是否会违约),从逻辑回归起步,然后试试随机森林。逻辑回归和线性回归异曲同工,只是加了sigmoid函数把输出压到0到1之间。随机森林的优点是容错率高,基本不需要调参也能得到一个还不错的基线。等你确认基线效果后,再上XGBoost或者LightGBM——这两个是Kaggle比赛里的常胜将军,处理大量数据和复杂非线性关系的能力强,但相应地,需要更多调参功夫,也更容易过拟合。
选算法的这个思路,我打个比方。你去医院看病,如果只是感冒,医生不会直接让你去做全身CT,而是先问症状、看喉咙。选模型也是一个道理:先做最简单的检查(线性回归/逻辑回归),确认问题有多复杂,再决定要不要上重型设备(集成学习/深度学习)。一上来就XGBoost调参,就像感冒就做CT,效果未必好,反而给自己添乱。
关于深度学习,再啰嗦一句。视频课如果涉及神经网络,通常只讲个全连接网络或者CNN的皮毛,这是合理的,因为深度学习对数据量的要求极高,普通课程项目里的几千条数据根本喂不饱一个像样的神经网络。真到了需要上深度学习的数据规模,你已经不是初学者了,自然会知道该往哪个方向学。
4.3 模型评估与过拟合处理
模型训练完,准确率好看吗?不一定。这里涉及机器学习里面最关键的一个概念:训练集表现好没用,测试集表现好才算数。
标准流程是train_test_split把数据分成训练集和测试集,这个大家都懂。我要补充的是几个容易踩坑的细节:
第一,分层抽样。如果分类结果极度不平衡,比如“99%正常、1%异常”,简单的随机切分很可能导致测试集里一条异常样本都没有。train_test_split里有个参数stratify,设为y就能保证训练集和测试集的类别比例一致:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y )第二,用交叉验证而不是单次切分。单次切分的运气成分太大,这次随机种子效果好,换个种子效果就差。用cross_val_score做5折交叉验证,把模型在每一折上的表现取平均,才是更可靠的评估:
from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X, y, cv=5, scoring='accuracy') print(f'平均准确率: {scores.mean():.4f}, 标准差: {scores.std():.4f}')标准差特别大的时候,说明模型在不同数据子集上表现不稳定,这时候别急着优化模型结构,先回头看数据有没有问题。
第三,过拟合的识别和处理。过拟合的表现非常典型:训练集准确率99%,测试集准确率75%。这就是模型把训练集里的噪声和巧合都背下来了,遇到新数据就抓瞎。解决手段按照优先级排列:
- 增加训练数据量,永远是最有效的;
- 降低模型复杂度,比如减少决策树的深度(
max_depth)、减少随机森林的树数量; - 加正则化参数,线性模型用
C,树模型用min_samples_split和min_samples_leaf; - 做特征选择,把不重要的特征删掉。
还有一个常用手段是早停法,训练深度学习或梯度提升模型的时候,监控验证集的损失,一旦发现验证损失开始上升就停止迭代。sklearn里很多模型有early_stopping参数,记得用上。
4.4 量化交易场景:策略代码框架简解
热搜词里有“python量化交易策略代码”,这个和机器学习课程经常被一起提起。我简单说下界,不建议初学者一开始就冲着量化去,但了解它的框架对理解“数据→策略”的流程非常有帮助。
一个最简单的双均线策略代码框架长这样:
import pandas as pd import numpy as np # 假设df已经读入了某只股票的历史价格 df['ma20'] = df['close'].rolling(window=20).mean() df['ma60'] = df['close'].rolling(window=60).mean() # 金叉买入,死叉卖出(生成信号) df['signal'] = 0 df.loc[df['ma20'] > df['ma60'], 'signal'] = 1 df['position'] = df['signal'].diff() # 计算策略收益 df['strategy_return'] = df['close'].pct_change() * df['position'].shift(1)这个框架里包含了一个非常重要的思维:策略信号是一个时间序列,你的下单动作是信号的差分。所谓“金叉”就是20日均线从下方穿越60日均线,也就是signal从0变1的那一刻,对应position为1;死叉对应position为-1。用shift(1)是为了避免用当天收盘价信号在当天就执行交易导致的未来函数偏差。
这里想提醒的是,量化交易真正的难点从来不是写策略,而是数据获取、回测的准确性、手续费和滑点的模拟。很多初学者自己写一个回测,年化收益率看着高得吓人,一问有没有算手续费和滑点,人直接愣住了。年化30%,手续费扣掉2%,滑点再扣掉3%,实际到手和存余额宝差不多。所以学到这里,重点学的是“数据到信号到收益”流程的搭建思路,别被“暴富策略”的心态带跑偏了。
5. 常见问题与排查技巧速查
5.1 Python环境层面的经典报错
ModuleNotFoundError: No module named 'numpy',这个出现频率极高。九成情况是pip装到了别的环境。处理方案两条:一是用python -m pip install numpy强制执行到当前环境;二是干脆用which python先确认你现在用的是哪个解释器,再决定装到哪里。
SyntaxError: invalid syntax,这个一般不是环境问题,是代码抄错了。最常见的坑是:中文标点混进去了,冒号和括号不匹配,或者把print(f"...")里的引号写成了中文引号。我见过新手拿着报错问半天,最后发现是中文输入法没切换。排查方法:看IDE里报错的红色波浪线位置,把那一行前后十行重抄一遍。
AttributeError: module 'pandas' has no attribute 'xxx',这不是你代码的问题,而是Pandas版本太老或太新,某个API的路径变了。解决办法是实现实报错里的函数名上网查一下新版本对应名称,或者干脆升级Pandas版本。如果不想折腾,pip install --upgrade pandas先升级再说,一般能解决。
5.2 数据分析与可视化类问题
中文乱码很常见,上半篇已经给了SimHei配置代码,这里再补充一个通用方案:
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'PingFang SC']这三个中文字体分别覆盖Windows、macOS、Linux常见环境,写成一个列表让Matplotlib自动fallback,比只写一个更保险。
横坐标太密集的问题,上面给了三种方案,这里不再重复,记住一个口诀:步长控制密度,降频聚合画趋势,旋转标签防重叠。
ValueError: If using all scalar values, you must pass an index,这个常见于你试图用pd.DataFrame({'one': 1, 'two': 2})创建DataFrame,而value全是标量。解决办法是把标量改成列表,或者传一个index参数。
5.3 机器学习训练类问题
ValueError: Input contains NaN。 信息非常明确:模型喂进去的数据里还有空值。别急着训练,回到数据清洗:先用X.isnull().sum()找出哪些特征有缺失,然后SimpleImputer处理,或者df.dropna(subset=[columns])。
NameError: name 'model' is not defined,这个常见于Notebook里跳着执行单元格,模型变量没有加载。解决办法最简单:Kernel -> Restart & Run All,从头到尾把Notebook完整跑一遍。这也是我用Jupyter时养成的习惯——不跳格子,避免变量依赖错乱。
训练时内存爆炸,常见于one-hot编码把几百个类别的特征直接展开成几万行几万列。解决办法:对高基数类别用目标编码,或者把模型换成LightGBM,它对稀疏高维数据的处理能力明显强于传统模型。另一个技巧是训练前先del掉不用的中间变量,用gc.collect()手动触发垃圾回收。
5.4 配套资源:西瓜书、吴恩达和期末复习怎么用
热搜词里有“机器学习西瓜书”“吴恩达机器学习”,还有高校期末相关的搜索。一个视频课的学习者大概率会同时接触这些资源,我就说说它们该怎么搭配。
《机器学习西瓜书》确实是理论深度很足的书,但它不适合当第一本入门书读。它的价值在于:当你跑完代码、有了直观感受之后,书里的公式才变得有意义。我的建议是:**先跟着课程视频跑代码,跑完再看书补理论,公式不懂先跳过。**比如视频里你看到了逻辑回归的predict_proba输出的是一个0到1之间的概率,这时候再看西瓜书里sigmoid函数的推导,脑子里的画面一下就通了。
吴恩达老师的机器学习课程是经典中的经典,它有非常好的“由浅入深”教学节奏,但用Python复现吴恩达课程里的练习时要注意,很多早期的作业是用Octave写的,你需要自己把公式翻译成NumPy或sklearn代码。这个过程虽然有点痛苦,但价值巨大,因为手动实现一遍梯度下降,比调一百遍sklearn都更能加深你对模型的理解。
高校期末考试的复习逻辑则完全不同。期末考重点考察的是概念、公式推导和算法的适用场景,不会让你现场训练一个模型。所以期末复习的策略是:从课程视频里提取概念术语,然后用西瓜书对应章节去查定义和公式。常考的点包括:过拟合和欠拟合的区别、偏差和方差的权衡、精确率和召回率的定义、KNN的k值选择和计算流程、决策树的信息增益计算等等。最好是能把每个算法拿来和实际场景对上号:什么场景用KNN、什么场景用朴素贝叶斯、什么场景用SVM,考试喜欢出这种选择题。
6. 我的实操心得与学习建议
6.1 视频课的高效打开方式
我前面提过“跟着敲”的陷阱,这里展开说说。很多视频课的学习者把课程当成一种“背景音乐”,开着倍速,手上不停抄代码,两个小时下来,手指敲熟了,脑子还在原地踏步。我在带人的时候,反复强调的是“三步法”。
第一步,认真看一遍。不碰键盘,只看老师怎么操作,重点看他为什么这么写。比如他为什么先print(df.shape)而不是先df.head(),这种小的决策背后都是长期经验。
第二步,自己独立敲一遍。不要跟着视频同步敲,而是看完一个小节之后,合上视频,凭记忆把自己的版本写出来。写不出来的地方先自己查文档,查完再回头看视频,对比老师的解法和你的解法有什么差异。这个过程会产生一些“哎,我的做法居然也能跑”的时刻,那就是你真正内化的时刻。
第三步,带着项目去改。课程的数据集和案例是固定的,但你可以自己找一个真实数据集,把课程里的操作套上去。比如学完白酒销售数据可视化,你自己去下载一份小区附近的超市流水数据,用同样的代码画图。代码可能报错,没关系,报错本身就是最好的学习材料。
三个步骤走下来,一个视频课的内容才算真正变成你的东西。
6.2 期末复习与面试准备的共同套路
期末复习和面试准备看起来是两个场景,但核心套路是一样的,就六个字:建目录,写总结。
别拿着西瓜书从头翻到尾,那样翻到后面忘了前面。我的做法是:拿一张空白的纸,或者一个空白的笔记软件,把每个算法当做一个条目写下来。每个条目里包含这几行信息:
- 算法名称和一句话定性(比如“KNN——基于实例的懒惰学习算法”);
- 适用的任务类型和数据规模;
- 关键的参数和默认值;
- 优点和缺点各两条;
- 你在课程项目里用它跑出来的结果数据。
写完之后,你会惊讶于自己能记住多少。而且这张“目录”在面试的时候就是你的提词器:面试官问“讲讲随机森林”,你的答案天然有结构,不会东扯西扯。期末考前把这些条目过一遍,概念题基本稳了;面试前再把自己写过的项目代码过一遍,能说出“我用了随机森林,调整了max_depth从默认值改到10,测试集准确率从85%涨到88%”,面试官对你的评价绝对上一个档次。
6.3 最后分享一个小习惯
我从用了很多年的习惯:每个项目结束,写一个README.md。不用写得很长,三五条就够——“数据来源”“清洗步骤”“踩过的三个坑”“最后模型效果”。这个习惯最初是为了方便自己一个月后回来看还能接上手,后来发现它的价值远超预期:写到第十个项目的时候,你会发现自己的坑是重复的,处理手法却在迭代,那种感觉非常奇妙。
学Python数据分析与机器学习是一件正反馈很强的事,因为你每跑出一个图、每调出一个模型,都能立刻看到结果。但正反馈的启动需要你先走完最开始那条充满环境问题和报错的路。视频课的价值就在于,它帮你把这条路上的坑提前标了出来,剩下的,就是你自己动手去走一遍了。