首页 / 资讯中心 / 文章详情

机器学习算法案例包:Jupyter Notebook从回归到词向量的实战指南

机器学习算法案例包:Jupyter Notebook从回归到词向量的实战指南 ★ FEATURED ARTICLE
简介面向机器学习初学者与进阶开发者的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_size0.2, random_state42 ) 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_size0.2表示留出 20% 样本做测试剩下的 80% 训练random_state42固定随机种子保证每次运行切分结果一致否则你调参前后的对比就没有意义。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(C1.0, solverlbfgs, max_iter500) 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))这里三个参数是调参时必动的。C1.0是正则化强度的倒数C 越小正则化越强系数越被压缩能有效抑制过拟合solver是优化算法lbfgs适合中小数据集如果样本量很大换sag或liblinear收敛更快max_iter500是最大迭代次数训练时如果看到 “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_size0.3, random_state0 ) clf DecisionTreeClassifier(max_depth3, min_samples_leaf5, random_state0) clf.fit(X_train, y_train) plt.figure(figsize(12, 6)) plot_tree(clf, feature_namesX.columns, class_names[0, 1], filledTrue) plt.show()不设置任何限制时决策树会一直分裂到每个叶节点都纯为止结果是训练集上准确率接近 100%测试集上惨不忍睹。所以必须给树加约束。max_depth3限制树最多 3 层min_samples_leaf5强制每个叶节点至少包含 5 个样本。加这两个参数的本质是剪枝让模型牺牲部分训练精度换取泛化能力。plot_tree里filledTrue按分类结果着色能直观看出哪些特征在顶层被反复使用。如果max_depth调大后训练分数明显上涨而测试分数不动甚至下降那基本可以确定过拟合回头把深度降下来。3.2 RandomForestRegression.ipynbn_estimators 与 max_features 怎么配随机森林是决策树的集成版本思路是同时训练多棵树每棵树在随机抽样的数据和随机抽样的特征子集上生长最后取平均或投票。RandomForestRegression.ipynb 用的是回归版本适合预测连续值比如信贷评分中的违约概率。随机森林能压方差的核心在于“随机”两个字行采样让每棵树看到的样本不同列采样让每棵树使用的特征不同树与树之间的相关性越低集成后的方差下降就越明显。from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error rf RandomForestRegressor( n_estimators200, max_depth8, min_samples_split4, max_featuressqrt, random_state42 ) 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_featuressqrt表示每棵树只随机取总特征数的平方根个特征参与分裂这是分类任务的常用默认值回归任务更常用max_features1.0即全部特征参与候选区别在于对特征差异的敏感度。min_samples_split4是内部节点再分裂所需的最小样本数调大它能更早停止生长。评估回归模型我用mean_absolute_error而不是 MSE因为它的单位与目标变量一致解释起来更直观。3.3 特征重要性怎么读feature_importances_是随机森林训练完成后自动算好的数值越大代表该特征对分裂的贡献越大所有特征的重要性加起来等于 1。它是基于不纯度下降累计出来的所以也叫 Gini importance。读这个数值有一个常见误区特征重要性高不代表因果关系只代表该特征在树的分裂中频繁且有效地区分了样本。比如预测违约概率时“收入”重要性最高这只能说明它和违约强相关不能推出“提高收入就能降低违约”的结论。想对比单棵决策树和随机森林的特征重要性直接打印排序结果importance pd.Series(rf.feature_importances_, indexX.columns).sort_values(ascendingFalse) 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(alphasalphas, cv5).fit(X_train, y_train) lasso LassoCV(alphasalphas, cv5, max_iter10000, random_state0).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 个对数均匀间隔的值覆盖范围足够广。cv5表示五折交叉验证每折轮流当验证集选出平均误差最小的 alpha。Lasso 因为是坐标下降法逐步逼近最优解迭代次数不够时结果不稳定max_iter10000是保险设置。跑完直接看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(alpha1.0)), (rf, RandomForestRegressor(n_estimators200, random_state0)), (gbr, GradientBoostingRegressor(random_state0)), ] 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(normalizeTrue)时报ImportError或TypeError。原因旧版教程常用cross_validation模块新版统一挪到了model_selectionnormalize参数在新版中也被移除了。解决先看自己的版本pip show scikit-learn打印当前环境版本。新代码一律写from sklearn.model_selection import train_test_splitnormalize参数直接用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_features20000, ngram_range(1, 2))), (svm, SVC(kernellinear, C1.0)) ]) pipeline.fit(X_train, y_train)max_features20000限制特征维度防止内存爆炸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_size100, window5, min_count1, sg0) print(model.wv.most_similar(机器学习))vector_size100是词向量维度window5是上下文窗口大小窗口越大越能捕捉远距离语义min_count1表示出现次数少于 1 的词忽略实际项目中一般设 5 左右过滤低频噪声sg0用 CBOW 训练sg1用 Skip-gram语料少时 CBOW 更快语料大时 Skip-gram 更准。6.3 把自己的流程固化成模板这两个 notebook 最有价值的地方不是算法本身而是它们示范了可复用的流程一个管文本到特征的转换一个管语义到向量的转换。把那套 SVM 文本分类管线抽成一个函数传入不同数据集就能复用把 Word2Vec 训练参数保存成配置字典换语料只改文件名。有一次我偷懒直接复制旧模板忘了换编码参数结果在演示当天反复翻车。从那以后我每次收到新任务都强制走一遍流程先读 README再 Restart Run All最后把所有参数整理成一张表再动手。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站