☰
机器学习算法案例包:Jupyter Notebook从回归到词向量的实战指南
2026/10/18 18:41:17 网站建设 项目流程

简介:面向机器学习初学者与进阶开发者的Jupyter Notebook实践资料包,系统梳理数据预处理、线性回归、逻辑回归、决策树、随机森林、支持向量机、聚类等基本模型算法,并结合实际案例演示从数据加载到模型训练与评估的完整流程。包内共25个文件,以8个ipynb交互式案例为主,辅以10个md说明文档、3个csv数据集和Python脚本,清晰展示每一步操作与结果,便于读者边看边练、快速上手。内容还涵盖模型评估与调优方法,包括交叉验证、准确率/召回率等指标以及网格搜索参数优化。整体压缩包仅2.97MB,轻量实用,已有2047人学习。案例覆盖线性回归、逻辑回归、决策树、模型集成、正则化、SVM、Word2Vec等典型场景,每部分均配有可直接运行的Notebook和数据文件,适合课程自学、实验复现或作为算法入门参考。

1. Jupyter Notebook 跑机器学习:一套能直接复现的算法案例包

Jupyter Notebook 跑机器学习,最尴尬的不是算法不懂,而是打开一个 notebook 不知道先看哪里:前面一堆加载数据的单元格,后面突然冒出一个训练好的模型,中间哪些参数值得调、哪些坑必须躲,全得自己试。这套基于 Jupyter Notebook 的机器学习基本模型算法介绍资源,恰好是冲着这个痛点来的。它把线性回归、逻辑回归、决策树、随机森林、SVM、正则化、模型融合和 Word2Vec 按目录拆成可独立运行的案例,配套 CSV 数据与 README 说明,技术栈就是 Python + scikit-learn 这条最主流的数据科学路线。新手能按顺序跑通,熟手可以把整套目录当成一个算法实验的 IDE 工作台,改数据、换参数、加模型,省去从零搭环境的时间。

2. 线性回归与逻辑回归:两个 demo 把监督学习主线打通

2.1 Linear Regression demo:从读数据到评估的一气呵成

Linear Regression demo 是整套资源里最适合第一个打开的部分。它只有一条主线:读入 CSV,做一次 train_test_split,训练线性回归,看 R2 和 MSE。线性回归是机器学习的地基,损失函数、梯度下降、过拟合与欠拟合这些概念,几乎都能在这个 demo 里看到雏形。我一般建议拿到目录后别急着从头到尾执行单元格,先把 README 读完,再对照 notebook 的单元格顺序,识别哪一步对应数据预处理、哪一步对应建模,这样后面看复杂案例才不会丢失主线。

import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score df = pd.read_csv("data.csv") # 换成 demo 里实际的 CSV 路径 X = df[["area", "bedrooms", "age"]] # 连续特征列,按你手上的字段名替换 y = df["price"] # 要预测的连续目标列 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) model = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) print("MSE:", mean_squared_error(y_test, y_pred)) print("R2:", r2_score(y_test, y_pred)) print("coef:", model.coef_) print("intercept:", model.intercept_)

代码里最值得关注的是train_test_split的三个参数:test_size=0.2表示留出 20% 样本做测试,剩下的 80% 训练;random_state=42固定随机种子,保证每次运行切分结果一致,否则你调参前后的对比就没有意义。mean_squared_error衡量预测值与真实值的平均平方偏差,数值越小越好;r2_score表示模型解释了目标变量多少方差,越接近 1 越好。

跑完再看coef_,也就是每个特征的系数。系数为正,说明该特征和目标正相关;系数为负,说明负相关。如果 R2 很低,不要急着换模型,先检查两件事:一是df.info()看有没有缺失值,线性回归不会自动处理空值;二是特征是否太少,常见做法是加交互项或多项式特征,比如面积和卧室数一起组成的area * bedrooms,往往比单特征更贴近真实房价逻辑。

2.2 Logistic Regression demo:名称带回归,干的是分类

逻辑回归是新手最容易误读的模型:名字里带“回归”,实际用在二分类。它在线性回归的输出外面套了一层 sigmoid 函数,把连续值压缩到 0 到 1 之间,再以 0.5 为阈值判断类别。Logistic Regression demo 里的典型场景是用户是否会购买、客户是否流失这类二分类问题,输入特征是年龄、收入、最近购买间隔等,标签是 0 或 1。

from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, confusion_matrix, classification_report X = df[["age", "income", "last_order_days"]] y = df["purchase"] # 0/1 二分类标签 clf = LogisticRegression(C=1.0, solver="lbfgs", max_iter=500) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print("accuracy:", accuracy_score(y_test, y_pred)) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))

这里三个参数是调参时必动的。C=1.0是正则化强度的倒数,C 越小,正则化越强,系数越被压缩,能有效抑制过拟合;solver是优化算法,lbfgs适合中小数据集,如果样本量很大,换sag或liblinear收敛更快;max_iter=500是最大迭代次数,训练时如果看到 “ConvergenceWarning”,说明迭代次数不够,直接调大。评估部分,accuracy_score只适合类别均衡的情况,类别不平衡时一定要看classification_report里的精确率、召回率和 F1,否则你可能会被一个 95% 的准确率骗到,而实际上少数类全被模型忽略了。

2.3 读 demo 目录结构:README 是地图,notebook 是过程

每个 demo 目录里都是一个 README.md 配一个或多个 .ipynb。README 写的是数据背景、字段含义和结论摘要,notebook 写的是完整推导过程。我的使用顺序是固定的:先打开 README 看数据字段名,再打开 notebook 用菜单栏的 Kernel -> Restart & Run All 完整跑一遍,确认当前环境能跑通,最后才是逐段改参数。这样做的原因是,很多 notebook 的作者默认你懂他的数据格式,如果直接从上往下跑,很可能在第一个单元格就因列名不匹配而报错,容易被带偏。把这两个 demo 吃透之后再往决策树、随机森林走,你会发现套路完全一致:处理数据、切分、训练、评估,只是模型对象换了而已。

3. 决策树与随机森林:从单棵树的切片看到集成收益

3.1 DecisionTree.ipynb 与 DecisionTree.csv:建树、可视化与剪枝

DecisionTree.csv 是配套的结构化数据,字段通常是年龄、收入、信用额度、是否违约这类组合。决策树的核心逻辑是不断选择能最大程度降低不纯度的特征和切分点来分裂数据。DecisionTree.ipynb 里最值得看的不是训练过程,而是把树画出来之后的结构:根节点选了哪个特征、深度到第几层、每个叶节点里样本怎么分布,这些信息比准确率更能告诉你模型在“想什么”。

import pandas as pd from sklearn.tree import DecisionTreeClassifier, plot_tree from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt df = pd.read_csv("DecisionTree.csv") X = df[["age", "income", "credit_amount"]] y = df["default"] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=0 ) clf = DecisionTreeClassifier(max_depth=3, min_samples_leaf=5, random_state=0) clf.fit(X_train, y_train) plt.figure(figsize=(12, 6)) plot_tree(clf, feature_names=X.columns, class_names=["0", "1"], filled=True) plt.show()

不设置任何限制时,决策树会一直分裂到每个叶节点都纯为止,结果是训练集上准确率接近 100%,测试集上惨不忍睹。所以必须给树加约束。max_depth=3限制树最多 3 层,min_samples_leaf=5强制每个叶节点至少包含 5 个样本。加这两个参数的本质是剪枝,让模型牺牲部分训练精度换取泛化能力。plot_tree里filled=True按分类结果着色,能直观看出哪些特征在顶层被反复使用。如果max_depth调大后训练分数明显上涨而测试分数不动甚至下降,那基本可以确定过拟合,回头把深度降下来。

3.2 RandomForestRegression.ipynb:n_estimators 与 max_features 怎么配

随机森林是决策树的集成版本,思路是同时训练多棵树,每棵树在随机抽样的数据和随机抽样的特征子集上生长,最后取平均或投票。RandomForestRegression.ipynb 用的是回归版本,适合预测连续值,比如信贷评分中的违约概率。随机森林能压方差的核心在于“随机”两个字:行采样让每棵树看到的样本不同,列采样让每棵树使用的特征不同,树与树之间的相关性越低,集成后的方差下降就越明显。

from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error rf = RandomForestRegressor( n_estimators=200, max_depth=8, min_samples_split=4, max_features="sqrt", random_state=42 ) rf.fit(X_train, y_train) y_pred = rf.predict(X_test) print("MAE:", mean_absolute_error(y_test, y_pred)) print("feature_importances_:", rf.feature_importances_)

参数里最常调的是n_estimators和max_features。n_estimators是树的棵数,从 100 加到 300,误差通常还会缓慢下降,但超过某个点后收益极小,训练时间却线性增长,我一般先设 200 看趋势。max_features="sqrt"表示每棵树只随机取总特征数的平方根个特征参与分裂,这是分类任务的常用默认值;回归任务更常用max_features=1.0,即全部特征参与候选,区别在于对特征差异的敏感度。min_samples_split=4是内部节点再分裂所需的最小样本数,调大它能更早停止生长。评估回归模型我用mean_absolute_error而不是 MSE,因为它的单位与目标变量一致,解释起来更直观。

3.3 特征重要性怎么读

feature_importances_是随机森林训练完成后自动算好的,数值越大代表该特征对分裂的贡献越大,所有特征的重要性加起来等于 1。它是基于不纯度下降累计出来的,所以也叫 Gini importance。读这个数值有一个常见误区:特征重要性高不代表因果关系,只代表该特征在树的分裂中频繁且有效地区分了样本。比如预测违约概率时,“收入”重要性最高,这只能说明它和违约强相关,不能推出“提高收入就能降低违约”的结论。想对比单棵决策树和随机森林的特征重要性,直接打印排序结果:

importance = pd.Series(rf.feature_importances_, index=X.columns).sort_values(ascending=False) print(importance)

两个模型给出来的特征排序如果差异很大,通常意味着特征之间存在较强的相关性,这时可以回看相关性矩阵,把高度相关的冗余特征去掉,再重新训练看是否有性能损失。

4. 正则化与模型融合:RidgeCV/LassoCV 与 kaggle_credict 的实战配置

4.1 RidgeCV 与 LassoCV:岭回归和 Lasso 的正则化路径

Regularization 目录下的 RidgeCV.ipynb 和 LassoCV.ipynb 解决的是同一个问题:特征多、共线性强的时候,普通线性回归的系数会变得不稳定,稍微换一批数据,系数就大幅波动。Ridge 加 L2 范数惩罚,把系数往零的方向压缩但不等于零;Lasso 加 L1 范数惩罚,会把一部分系数精确压成 0,相当于在做特征选择。带 CV 后缀表示模型内部用交叉验证自动选正则化强度,不需要手动一个个试。

import numpy as np from sklearn.linear_model import RidgeCV, LassoCV from sklearn.model_selection import train_test_split alphas = np.logspace(-4, 2, 50) ridge = RidgeCV(alphas=alphas, cv=5).fit(X_train, y_train) lasso = LassoCV(alphas=alphas, cv=5, max_iter=10000, random_state=0).fit(X_train, y_train) print("ridge alpha:", ridge.alpha_) print("lasso alpha:", lasso.alpha_) print("lasso coef:", lasso.coef_)

alphas是候选正则化强度列表,用np.logspace(-4, 2, 50)生成从 0.0001 到 100 的 50 个对数均匀间隔的值,覆盖范围足够广。cv=5表示五折交叉验证,每折轮流当验证集,选出平均误差最小的 alpha。Lasso 因为是坐标下降法逐步逼近最优解,迭代次数不够时结果不稳定,max_iter=10000是保险设置。跑完直接看lasso.coef_,如果某些系数是 0,说明模型认为这些特征对预测没有贡献,这是一种比手工筛选更客观的特征选择方式。

4.2 kaggle_credict.ipynb:模型融合怎么搭

Model Ensemble 目录下的 kaggle_credict.ipynb 是整套资源里唯一专门讲融合的案例,主题是信贷预测。单模型在这个场景里通常不够稳,逻辑回归方差低但偏差高,随机森林偏差低但方差高,把它们融合起来,往往能在测试集上拿到比任一单模型更好的分数。这个 notebook 展示的思路是:先分别训练多个基础模型,再用某种策略把它们的预测结果合成最终输出。

from sklearn.ensemble import VotingRegressor from sklearn.linear_model import Ridge from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor base_models = [ ("ridge", Ridge(alpha=1.0)), ("rf", RandomForestRegressor(n_estimators=200, random_state=0)), ("gbr", GradientBoostingRegressor(random_state=0)), ] vote = VotingRegressor(base_models) vote.fit(X_train, y_train) y_pred = vote.predict(X_test)

VotingRegressor对多个模型的预测结果取平均,是最简单的融合方式。三种模型差异越大,融合效果越好:Ridge 是线性模型,随机森林是装袋集成,梯度提升是 Boosting 序列集成,覆盖了不同角度。更进阶的做法是用StackingRegressor,把基础模型的输出作为新特征,再训练一个最终模型来学习如何最佳组合这些预测,代价是训练时间和过拟合风险上升。我一般先跑 Voting 看提升幅度,提升明显再试 Stacking。

4.3 融合的注意点:时间序列不能随机切分

信贷数据如果带了时间字段,比如申请日期、放款日期,就存在一个隐蔽问题:直接用train_test_split随机切分,会让测试集包含和训练集同期的样本,模型等于偷看了未来信息,验证分数虚高。正确做法是使用TimeSeriesSplit,按时间顺序切分,前一段训练、后一段验证。这也是 kaggle_credict 这类案例最容易翻车的地方,肉眼看着分数不错,一旦上线预测新客户就崩,原因不是模型不行,而是数据切分方式在骗你。

5. 避坑:跑这套 Jupyter 案例时最常撞上的环境与数据坑

5.1 坑一:CSV 中文路径与编码读取失败

现象:pd.read_csv("DecisionTree.csv")直接报UnicodeDecodeError,或者提示路径不存在。

原因:demo 数据如果是中文内容,文件编码多半是 GBK 或 GB2312,而 pandas 默认按 UTF-8 解码,一遇到中文字符就崩。中文路径问题则出在部分旧版 pandas 对非 ASCII 路径处理不友好。

解决:读取时显式指定编码,gbk不行就换gb18030,它覆盖的字符范围更广。路径方面,把整个项目目录移到英文路径下再运行,比在代码里写各种转义省事得多。

5.2 坑二:Jupyter 内核运行到一半假死

现象:单元格左侧的[*]一直亮着,代码既不报错也不出结果,点菜单栏的 Interrupt 也没反应。

原因:最常见的是训练集太大,随机森林或 Lasso 这类模型在默认参数下迭代量超出预期;其次是代码里写了死循环,比如while True忘了写退出条件。

解决:先看任务管理器或资源监视器,确认是 CPU 占用 100% 还是内存用满。CPU 爆满就等一轮,内存爆满就放弃当前内核,用 Kernel -> Restart & Run All 重启。从那以后,我每次训练前都会多打一行print(df.shape),先确认数据量级,再决定要不要把n_estimators降低。

5.3 坑三:scikit-learn 版本升级导致 API 改名

现象:运行到from sklearn.cross_validation import train_test_split或LinearRegression(normalize=True)时报ImportError或TypeError。

原因:旧版教程常用cross_validation模块,新版统一挪到了model_selection;normalize参数在新版中也被移除了。

解决:先看自己的版本,pip show scikit-learn打印当前环境版本。新代码一律写from sklearn.model_selection import train_test_split,normalize参数直接用StandardScaler替代。如果非要用旧接口,才考虑在虚拟环境里锁定一个旧版本,不推荐在全局环境降级,会影响其他项目。还有个更省事的习惯:环境里装好 scikit-learn、pandas、matplotlib 三件套后,就用这类资源里自带的 README 作为版本参照,不要盲目追新。

5.4 坑四:类别特征直接塞进树模型

现象:clf.fit(X_train, y_train)报ValueError: could not convert string to float,提示集中在某个字符串列上。

原因:决策树、随机森林、SVM 的底层实现都要求数值输入,如果 CSV 里有“是 / 否”、“高 / 中 / 低”这类文本列,模型无法直接解析。

解决:类别有序时用OrdinalEncoder映射成 0、1、2;类别无序时用OneHotEncoder转成哑变量。注意树模型对标签编码不敏感,但 SVM 和线性模型必须做标准化或归一化,否则量纲大的特征直接主导距离计算。代码里先检查df.dtypes,看到object类型就手动处理,别等报错。

5.5 坑五:kaggle_credict 里的数据泄漏

现象:训练时交叉验证分数很高,换到新数据上预测效果断崖式下跌。

原因:数据预处理顺序错了。常见的有两种:先对整个数据集做归一化或缺失值填充,再切分训练测试集,导致测试集信息混入训练阶段;或者在特征中包含了与目标变量强关联的派生字段,比如预测违约时把“是否逾期”也放进特征。

解决:严格按“先切分、再处理”的顺序执行。StandardScaler、SimpleImputer都只在训练集上fit,之后只对测试集transform。特征选择阶段,把和目标变量同义或直接由其生成的字段剔除。信贷场景里尤其要小心,这类泄漏在 notebook 里跑得越顺,上线越危险。

6. SVM 与 Word2Vec:把两个进阶 notebook 改造成复用模板

6.1 cnews_demo:中文文本分类的 SVM 管线

cnews_demo 目录是典型的中文文本分类任务,输入是文本和标签。SVM 在这里的优势是:文本经过 TF-IDF 向量化后维度极高,而 SVM 在高维稀疏向量上表现稳定。notebook 里的步骤一般是分词、向量化、训练、评估,我习惯把这四步收敛成一个 Pipeline,方便复用和调参。

from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC pipeline = Pipeline([ ("tfidf", TfidfVectorizer(max_features=20000, ngram_range=(1, 2))), ("svm", SVC(kernel="linear", C=1.0)) ]) pipeline.fit(X_train, y_train)

max_features=20000限制特征维度,防止内存爆炸;ngram_range=(1, 2)同时保留单个词和相邻词对,对中文文本分类有明显提升。

6.2 word2vec.ipynb:词向量训练与相似词验证

Word2Vec 目录解决的问题和 TF-IDF 不同,它训练的是词的分布式表示,让语义相近的词在向量空间中距离接近。word2vec.ipynb 里的核心代码是 gensim 的Word2Vec,训练完直接查相似词验证效果。

from gensim.models import Word2Vec sentences = [ ["机器学习", "模型", "训练"], ["线性回归", "预测", "误差"], ["逻辑回归", "分类", "标签"] ] model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, sg=0) print(model.wv.most_similar("机器学习"))

vector_size=100是词向量维度;window=5是上下文窗口大小,窗口越大越能捕捉远距离语义;min_count=1表示出现次数少于 1 的词忽略,实际项目中一般设 5 左右,过滤低频噪声;sg=0用 CBOW 训练,sg=1用 Skip-gram,语料少时 CBOW 更快,语料大时 Skip-gram 更准。

6.3 把自己的流程固化成模板

这两个 notebook 最有价值的地方不是算法本身,而是它们示范了可复用的流程:一个管文本到特征的转换,一个管语义到向量的转换。把那套 SVM 文本分类管线抽成一个函数,传入不同数据集就能复用;把 Word2Vec 训练参数保存成配置字典,换语料只改文件名。有一次我偷懒直接复制旧模板,忘了换编码参数,结果在演示当天反复翻车。从那以后,我每次收到新任务都强制走一遍流程:先读 README,再 Restart & Run All,最后把所有参数整理成一张表再动手。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询