news 2026/9/28 5:33:47

Jupyter Notebook机器学习案例实战:从数据预处理到模型评估

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jupyter Notebook机器学习案例实战:从数据预处理到模型评估

简介:基于Jupyter Notebook的机器学习基本模型算法教程,系统讲解从数据预处理到模型调优的完整流程,适合希望通过Python快速上手数据分析与建模的初学者及开发者。内容围绕NumPy、Pandas、Scikit-learn展开,覆盖线性回归、逻辑回归、决策树、随机森林、支持向量机、K-Means聚类等经典算法,并融入房价预测、贷款违约评估、市场细分及信用评分等实践案例,便于理解算法原理与实际应用场景。压缩包共25个文件,主要包含10个Markdown笔记、8个Jupyter Notebook代码及3个CSV数据集,另附Python脚本和配置文件,方便按步骤复现实验;整体体积约2.97MB,目录按算法模块划分,检索清晰。目前已有2046人学习下载,通过md笔记与ipynb代码结合的方式,可帮助读者构建机器学习项目的基本框架,掌握特征重要性分析与参数调优方法,为后续深入实践打下基础。

1. Jupyter Notebook 学机器学习:这套案例资源到底能直接复现什么

机器学习的入门路径很多,但大部分人卡住的不是算法原理,而是「打开一个 Notebook,面对一堆代码不知道先跑哪个、每个参数改了什么、跑完怎么判断好坏」。这套基于 Jupyter Notebook 的机器学习基本模型算法教学资源,好就好在它是按「数据预处理 → 线性回归 → 逻辑回归 → 决策树 → 随机森林 → SVM → 正则化 → 集成学习 → 文本向量化」的完整路线组织的,每一步都落在真实数据集和可运行的 .ipynb 文件上,不是拿伪代码糊弄人的讲义。我拆完整个资源包之后的感觉是:它更像一套「能照着抄作业」的机器学习实验手册,每个案例的代码、数据集、模型评估项都配齐了。适合两类人:一类是刚装好 Jupyter Notebook 但不知道从哪下手的新手,跟着顺序把每个 cell 跑一遍,能把机器学习的基本流程走通;另一类是有一定基础、想快速复用现成代码做课程设计或项目验证的从业者,直接改数据集路径和特征列就能迁移到自己的任务上。

2. 环境准备与数据预处理:建模前必须做完的两件事

机器学习的项目里,模型训练只占一小部分时间,真正耗时间的是环境折腾和数据准备。这套资源里的案例虽然代码结构清晰,但如果你直接双击 .ipynb 就开跑,大概率会在 import 环节或者数据加载环节卡住。先把环境基线和数据预处理这两件事理顺,后面每一个 demo 才能顺畅复现。

2.1 环境基线:Python 内核与三个核心库的版本选择

Jupyter Notebook 本身只是一个交互式壳子,真正干活的解释器是它背后的 Python 内核。我习惯的做法是用 Miniconda 建一个独立环境给机器学习用,不污染系统 Python,也不跟其他项目的包互相打架。装好之后在终端里执行jupyter notebook,浏览器弹出管理界面,再打开资源包里的 .ipynb 文件,这时候 Notebook 会连到当前 conda 环境的 Python 内核上。

# 创建独立环境,Python 版本控制在 3.9~3.11 之间 # scikit-learn 1.2+ 对旧版 Python 已经停止支持,3.8 会提示版本过旧 conda create -n ml_learning python=3.10 -y conda activate ml_learning # 安装核心库,一次装齐 pip install jupyter numpy pandas scikit-learn matplotlib gensim

参数说明:Python 3.10 是目前兼容性最稳的版本,numpy 和 pandas 的预编译轮子都齐全,不用本地编译。scikit-learn是这套资源的绝对主角,线性回归、逻辑回归、决策树、随机森林、SVM 全部来自它,版本建议 1.2 以上,接口更规范。gensim是给 Word2Vec 案例用的,资源包里那个word2vec.ipynb依赖它。装完环境之后,重新打开 Jupyter Notebook,右上角内核显示Python 3 (ipykernel),再跑代码就不会看到ModuleNotFoundError。

这套资源里的案例代码多数是教学向的,没有用到特别新的语法,所以版本不用追求最新。反而是版本太新会踩坑:比如新版本 scikit-learn 里某些参数名做了调整,旧代码跑起来会报警告。我的原则是「跑通优先」,装好一套稳定版本之后就不要频繁升级了。

2.2 用 Pandas 读 CSV:清洗、类型转换与特征标准化

资源包里带了DecisionTree.csv和kaggle_credict.ipynb用到的信用评分数据,这类表格数据的第一步永远是read_csv,但这里有一个新手最容易踩的细节:Pandas 读入数据后会自动生成一列Unnamed: 0索引列,如果不处理,它会被当成一个特征喂给模型。

import pandas as pd # 方式一:明确指定第一列是索引列(csv 里带了行号) df = pd.read_csv('DecisionTree.csv', index_col=0) # 方式二:先用 head 看结构,再决定怎么处理 df_preview = pd.read_csv('DecisionTree.csv') print(df_preview.head()) print(df_preview.info()) print(df_preview.isnull().sum())

逻辑说明:index_col=0是告诉 Pandas「文件里的第一列是行索引,不是业务特征」。很多课程数据在导出时都会带一列序号,不指定的话它会混进X特征矩阵,导致模型多出一个无意义维度。info()用来查看每一列的数据类型和缺失值情况,isnull().sum()统计每列缺失数量。拿到真实数据后,我一般先跑这三行,确认列名、类型、缺失情况之后才动手建模。

数据清洗完之后,还有一个关键步骤是标准化。决策树和随机森林对特征尺度不敏感,但线性回归、逻辑回归、SVM 对特征数值范围非常敏感,尤其是像cnews_demo这种文本分类场景,特征矩阵的数值跨度可能非常大。

from sklearn.preprocessing import StandardScaler # 先分离特征和标签 X = df.drop(columns=['label']).values y = df['label'].values # 标准化:让每个特征都变成均值为0、方差为1的分布 scaler = StandardScaler() X_scaled = scaler.fit_transform(X)

逻辑说明:fit_transform在训练集上计算均值和标准差,然后用这套参数完成转换。注意这里必须只用训练集fit,测试集只做transform,不能拿全量数据去fit,否则会造成信息泄漏——测试集的信息提前混进了预处理参数里,评估结果会虚高。这一点在资源包的回归和分类案例里反复出现,是机器学习流程里最常见的隐含错误之一。

数据预处理没有固定模板,但清洗缺失值、去掉多余的索引列、数值型特征做标准化,这三步是表格类数据建模前的固定动作。这套资源里的每个案例都默认你做好了这些前置工作,直接跑建模的 cell 才能得到课件里展示的指标。

3. 线性回归、逻辑回归与正则化:从系数预测到分类决策边界

这一章是整套资源里代码密度最高的部分。线性回归负责「预测连续数值」,逻辑回归负责「预测二分类概率」,正则化则是在两种回归模型的基础上解决过拟合问题。三个案例放在一起学,能完整看到「建模 → 评估 → 调优」的完整链路。

3.1 线性回归:房价预测与系数解读

线性回归的核心假设是目标值y与特征X之间存在线性关系。资源里的 Linear Regression demo 用的是最经典的房价预测场景,特征是房屋面积和卧室数量这类连续或离散变量。建模代码本身非常简单,难的是理解模型的输出和验证结果是否可靠。

import numpy as np 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 已有面积、卧室数、房价三列 X = df[['area', 'bedrooms']].values y = df['price'].values 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) # 评估:RMSE 越小越好,R2 越接近1越好 rmse = mean_squared_error(y_test, y_pred, squared=False) r2 = r2_score(y_test, y_pred) print(f"RMSE: {rmse:.2f}") print(f"R2: {r2:.2f}") print("系数:", model.coef_, "截距:", model.intercept_)

逻辑说明:train_test_split中test_size=0.2表示预留 20% 数据做最终验证,random_state=42固定随机种子,保证每次运行划分结果一致,这是可复现的关键。mean_squared_error默认返回 MSE,加squared=False得到 RMSE,单位与原始目标值一致,更好解释。R2衡量模型解释了多少比例的目标方差,0.8 以上算不错的基线模型。

参数说明:特征列用.values转成 numpy 数组,而不是直接传 DataFrame 列。这是一个小但有用的习惯——Pandas DataFrame 在 sklearn 旧版本里会触发DataConversionWarning,直接用 numpy 数组能避免这类警告干扰注意力。如果特征不止一列,LinearRegression会自动做多元回归,不需要额外处理。

跑完线性回归后,我最关心的两个数是系数和 RMSE。系数告诉你「面积每增加 1 平米,房价平均涨多少」,这是线性模型独有的可解释性优势。如果 RMSE 远大于房价均值,说明线性假设不成立,常见做法是换随机森林这类非线性模型继续尝试,而不是在同一个模型上调参。

3.2 逻辑回归:从回归跨界到分类

逻辑回归虽然名字带「回归」,实际是分类算法。它的输出是「样本属于正类的概率」,默认以 0.5 作为分界阈值。资源里的 Logistic Regression demo 用的场景是用户购买预测,这属于典型的二分类问题。逻辑回归的代码骨架跟线性回归非常相似,但多了标准化的前置步骤和惩罚项设置。

from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report, roc_auc_score # 特征标准化:逻辑回归的损失函数对特征尺度敏感 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # C 是正则化强度的倒数,数值越小正则化越强 clf = LogisticRegression(C=1.0, max_iter=1000, random_state=42) clf.fit(X_train_scaled, y_train) y_pred = clf.predict(X_test_scaled) y_prob = clf.predict_proba(X_test_scaled)[:, 1] print(classification_report(y_test, y_pred)) print("AUC:", roc_auc_score(y_test, y_prob))

逻辑说明:C=1.0是默认值,表示正则化强度适中。max_iter=1000是逻辑回归最常踩的坑——sklearn 默认只有 100 次迭代,特征多或数据量大时经常不收敛,直接改 1000 能规避绝大部分ConvergenceWarning。predict_proba返回每个类别的概率,取第二列得到正类概率,计算 AUC 时需要它,不能用 predict 的硬标签。

参数说明:classification_report会输出精确率、召回率、F1 值。这三个指标在分类任务里比准确率更有参考价值,尤其是正负样本不均衡时,准确率会被多数类带偏,F1 才是真实水平。

线性回归和逻辑回归都适用正则化,对应资源包里的RidgeCV.ipynb和LassoCV.ipynb。两者的区别是:Ridge 用 L2 惩罚,系数被均匀压缩但不会变成零;Lasso 用 L1 惩罚,能把不重要的特征系数压到零,起到特征选择作用。CV后缀代表它内置交叉验证自动选参,不需要手动试 alpha。

from sklearn.linear_model import RidgeCV, LassoCV # alpha 候选范围设置成对数等距,覆盖多个数量级 alphas = np.logspace(-3, 3, 20) ridge = RidgeCV(alphas=alphas, cv=5) ridge.fit(X_train_scaled, y_train) print("Ridge 最优 alpha:", ridge.alpha_) lasso = LassoCV(alphas=alphas, cv=5, max_iter=10000) lasso.fit(X_train_scaled, y_train) print("Lasso 最优 alpha:", lasso.alpha_) print("Lasso 零系数个数:", sum(lasso.coef_ == 0))

逻辑说明:cv=5表示五折交叉验证,把训练集分成五份,轮流用四份训练一份验证,最终选出平均误差最小的 alpha。交叉验证比单次train_test_split更稳定,因为它不依赖某一次随机划分的运气。LassoCV跑完后看coef_里有多少个零,这是它做特征选择的最直观证据。

这套资源把线性和逻辑回归放在目录前面是有道理的——它们是理解后面所有复杂模型的基石。系数怎么读、分类指标怎么选、正则化参数怎么调,这三个问题弄明白之后,学决策树和随机森林会顺畅很多。

4. 决策树、随机森林、SVM 与 Word2Vec:从表格到文本的模型路线

这一章是资源包的进阶部分。决策树解决「模型可解释性」,随机森林解决「单棵树不够稳」,SVM 解决「高维数据分类」,Word2Vec 解决「文本怎么变成向量」。四个案例组合在一起,覆盖了从结构化表格数据到非结构化文本数据的完整建模路径。

4.1 决策树的可解释性与超参数陷阱

决策树模型用一套 if-else 规则把样本一层层划分开。它的魅力在于训练完可以直接把树画出来,看到每次划分用了哪个特征、阈值是多少。资源包里那个DecisionTree.csv配对的DecisionTree.ipynb,完整演示了「训练 → 画树 → 读特征重要性」的流程,这也让它成了对比机器学习跟「玄学」的最佳教材。

from sklearn.tree import DecisionTreeClassifier, plot_tree import matplotlib.pyplot as plt # 训练一棵深度受限的决策树 dt = DecisionTreeClassifier(max_depth=4, min_samples_split=10, random_state=42) dt.fit(X_train, y_train) # 树的可视化:直接画出划分逻辑 plt.figure(figsize=(16, 10)) plot_tree(dt, filled=True, feature_names=['area', 'bedrooms'], class_names=['0', '1']) plt.show() # 特征重要性:哪个特征贡献最大 importance = pd.Series(dt.feature_importances_, index=['area', 'bedrooms']).sort_values() importance.plot(kind='barh')

参数说明:max_depth=4限制树的深度,防止无限分裂导致过拟合。min_samples_split=10规定内部节点至少要有 10 个样本才继续划分,这两个参数是决策树防过拟合的核心开关。如果不设置它们,决策树会一直划分到每个叶子都是纯类别,训练集准确率接近 100%,测试集一塌糊涂,这是新手最常犯的错误。

使用逻辑说明:plot_tree画出的树里,每个节点会显示「划分特征、阈值、样本数、类别分布、基尼系数」。读树的时候优先看根节点的第一个划分特征——它是模型认为区分能力最强的变量。feature_importances_是决策树对每个特征重要性的量化,取值范围 0 到 1,加起来等于 1,数值越大表示该特征在划分中被用得越多。

4.2 随机森林与模型集成:用投票机制抵消单棵树的不稳定

随机森林的出发点很朴素:单棵决策树可能学过拟合,那训练几十上百棵树,最后取平均或投票,噪音就被抵消了。资源包里的RandomForestRegression.ipynb和kaggle_credict.ipynb分别展示了回归场景和信用评分竞赛场景下的集成方法。后者是 Kaggle 经典入门赛题的复现版,核心套路是「多模型融合 + 交叉验证评估」。

from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC # 随机森林:200棵树,每棵深度限制为8 rf = RandomForestClassifier(n_estimators=200, max_depth=8, random_state=42) rf.fit(X_train, y_train) print("RandomForest Accuracy:", rf.score(X_test, y_test)) # 模型集成:逻辑回归 + 随机森林 + SVM 投票 voting = VotingClassifier( estimators=[ ('lr', LogisticRegression(max_iter=1000)), ('rf', RandomForestClassifier(n_estimators=100, max_depth=8)), ('svm', SVC(probability=True, random_state=42)) ], voting='soft' ) voting.fit(X_train_scaled, y_train) print("Voting Accuracy:", voting.score(X_test_scaled, y_test))

逻辑说明:n_estimators=200越大,单个模型之间的随机性被平均得越干净,但训练时间线性增长,200 是一个性价比不错的值。max_depth=8给每棵树限高,让树之间保持差异性——如果每棵树都长到全深,所有树学到的模式完全相同,投票就退化成单棵树。voting='soft'表示软投票,按每个模型输出的概率取平均;voting='hard'是硬投票,直接按每个模型的最终类别标签投票。软投票一般表现更好,因为它保留了置信度信息。

Kaggle 信用评分类任务的实际套路我一般在资源包基础之上叠加这三步:先跑一个最简单的逻辑回归当基线,再上随机森林看提升幅度,最后用 VotingClassifier 融合三个差异大的模型。集成学习的收益来自「好而不同」——每个模型性能不能太差,但它们的犯错模式要尽量不相关。

信用评分场景里还需要特别注意类别不均衡问题。如果正例(违约用户)只占 5%,模型全预测负例也有 95% 准确率,但这种模型毫无价值。常见做法是在class_weight='balanced'参数下重新训练,或者用StratifiedKFold保证交叉验证的每一折里正负比例一致。

4.3 SVM 与 Word2Vec:核函数升维与文本向量化

SVM 的原理概括成一句话就是「在高维空间找一个最大间隔的超平面来分割数据」。它的核心参数是核函数。资源包里的 SVM 目录下搭了一个cnews_demo文本分类示例,新闻文本天然是高维稀疏数据,很适合展示 SVM 的威力。但 SVM 对特征尺度极其敏感,文本 TF-IDF 向量化后如果直接丢给SVC,容易收敛得慢或者分类边界偏移。

from sklearn.svm import SVC from sklearn.feature_extraction.text import TfidfVectorizer # 文本向量化:用 TF-IDF 把新闻转成数值矩阵 tfidf = TfidfVectorizer(max_features=5000, stop_words='english') X_text_vec = tfidf.fit_transform(cnews_texts) # RBF 核是最常用的默认选择,处理非线性边界 svm = SVC(kernel='rbf', C=1.0, gamma='scale', probability=True, random_state=42) svm.fit(X_text_vec, y_text)

参数说明:kernel='rbf'是径向基核函数,能处理非线性分类边界,也是绝大多数场景的首选。C=1.0是误分类惩罚,调大则模型更倾向拟合训练集,调小则更重视泛化。gamma='scale'让算法根据特征数量自动计算核函数宽度,比手动指定gamma=0.1更省心,这也是新版本推荐的做法。

probability=True允许 SVM 输出概率,代价是训练耗时增加,但如果后面要接 VotingClassifier 做集成,概率输出是必须的。SVM 的训练复杂度是样本数的平方到立方级别,超过 1 万条数据后训练会非常慢,文本分类场景下我一般先用 TF-IDF 把特征压缩到 5000 维以内,既能控制维度爆炸,又能保留重要词汇信息。

文本处理的另一条路线是 Word2Vec,资源包里对应word2vec.ipynb。Word2Vec 和 TF-IDF 的差别是:TF-IDF 输出一个稀疏的「词是否出现」向量,语义相近但写法不同的词完全无法关联;Word2Vec 训练后能用一个稠密向量表示每个词,并且「国王 - 男人 + 女人 ≈ 女王」这类语义操作真正可用。

from gensim.models import Word2Vec # 输入是句子列表,每条句子是已经分好词的列表 sentences = [ ['机器学习', '模型', '训练'], ['数据', '清洗', '特征', '工程'], ['模型', '评估', '交叉验证'] ] # 训练一个 128 维的词向量模型 w2v = Word2Vec( sentences, vector_size=128, window=5, min_count=1, epochs=20, sg=0 # sg=0 用 CBOW,sg=1 用 Skip-gram ) # 查看语义相似词 similar_words = w2v.wv.most_similar('模型', topn=5) print(similar_words)

参数说明:vector_size=128是词向量维度,维度越高能捕捉的语义信息越丰富,但训练时间和内存开销也越大,128 是中等规模语料的常用起点。window=5表示上下文窗口,只看当前词前后 5 个词,窗口越大越能捕捉长距离依赖。min_count=1表示出现次数少于 1 次的词直接忽略,语料小的时候设 1 保证所有词都有向量。sg=0用 CBOW 算法,训练速度快且对高频词友好;如果语料足够大,sg=1的 Skip-gram 对低频词效果更好。

Word2Vec 训练完之后要把词向量合并成语义向量,常见做法是「词向量求平均」:把一条文本里所有词的向量加总取平均,得到一个固定长度的向量表示,再做分类。这套流程在标题分类、情感分析这类任务里非常实用,是 SVM 之外的另一种文本建模思路。

5. 避坑与排查:五个高频翻车记录与定位思路

这一章是从这套资源包和真实项目经验里沉淀下来的踩坑记录。每一个都是实际跑代码时会遇到的问题,按照「现象 → 原因 → 解决」写,方便对照排查。

5.1 数据侧的坑:索引列混入、数据类型错位与标准化遗漏

第一个高频问题:训练完模型后,发现特征矩阵里多了一列全是 0、1、2、3 这样的顺序数字。原因是read_csv时没指定索引列,Pandas 自动把文件自带的行号读成了Unnamed: 0列。解决方法是加载时加index_col=0,或者在建模前用df.drop(columns=['Unnamed: 0'], inplace=True)手动删掉。这个坑在资源包的DecisionTree.csv里尤其典型,因为这份 CSV 第一列正好就是行号。

第二个问题:特征列看着是数字,但df.info()显示类型是object。往往是 CSV 里混入了NA、null或者空字符串,Pandas 直接整列读成字符串。表现是StandardScaler报错,或fit时报could not convert string to float。解决方法是读入后先把缺失值统一成np.nan,再pd.to_numeric()强制转换,最后用中位数或均值填充。

第三个问题是标准化只对训练集做了fit_transform,测试集也用fit_transform而不是transform。表现是测试集评估指标比想象中好,但部署后表现明显下滑。原因是测试集的信息被混入预处理参数,属于数据泄漏。解决方法是严格分离训练集和测试集,训练集fit_transform,测试集只transform。

5.2 模型侧的坑:不收敛、过拟合与版本不兼容

逻辑回归和 SVM 最常见的问题是警告ConvergenceWarning。现象是训练结束后模型准确率很低,警告提示迭代次数不够。原因是max_iter=100是 sklearn 的默认值,特征维度上来之后梯度下降走不完。解决方法是把max_iter调到 1000,同时配合特征标准化,能解决 80% 的收敛问题。如果调大后仍然不收敛,再检查是不是有离散特征被直接塞进了模型而没有做独热编码。

决策树和随机森林的坑集中在过拟合上。现象是训练集准确率接近 100%,测试集准确率差一截。原因是树深度没有限制,模型把训练集的噪声当成规律学了下来。解决方法是给决策树加max_depth和min_samples_split,随机森林加max_depth并把n_estimators提高到 100 以上。这类问题在资源包的RandomForestRegression.ipynb里有过体现,推荐在跑完模型后先比较训练集和测试集的分数差,差距大于 5 个点就要考虑收紧限制条件。

Word2Vec 的坑在版本兼容性上。老教程里写的是Word2Vec(sentences, size=128),但 gensim 4.0 之后size参数改成了vector_size。直接跑老代码会报TypeError: __init__() got an unexpected keyword argument 'size'。解决方法是确认自己的 gensim 版本,4.0 以上统一用vector_size。这类因版本升级导致的 API 变更非常隐蔽,代码逻辑没有任何问题,纯粹是名称变了。排查的顺序一般是:先看报错信息里的关键词,是参数名不识别还是函数不存在,再去查对应版本文档,最后对照搜索结果改代码。

6. 进阶验证技巧:交叉验证与可复现的 Notebook 交付规范

资源包最后的Model Ensemble和Regularization两个模块里都用到了交叉验证,但把它们当成独立工具掌握,收益会大得多。交叉验证的核心价值是「用有限数据做多次验证」,比单次train_test_split的评估结果更可信。尤其是数据集比较小的时候,单次划分的随机性可能导致评估结果大幅波动,同一套代码换一个random_state分数能差 5 个百分点以上。

from sklearn.model_selection import cross_val_score, StratifiedKFold from sklearn.ensemble import RandomForestClassifier # 五折分层交叉验证:每折的正负样本比例与整体一致 cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score( RandomForestClassifier(n_estimators=100, max_depth=8, random_state=42), X_train_scaled, y_train, cv=cv, scoring='f1' ) print("每折 F1:", scores) print("平均 F1: {:.3f} ± {:.3f}".format(scores.mean(), scores.std()))

逻辑说明:StratifiedKFold比普通KFold多一步保持每折类别比例一致,处理不均衡数据集时必须用它。scoring='f1'指定用 F1 作为评估指标,比 accuracy 更能反映分类真实水平。输出的分数均值是模型能力的估计,标准差则是稳定性估计——标准差超过 0.05 说明模型对数据划分方式敏感,需要回头检查数据质量或模型复杂度。

模型评估用哪类指标,我一般按这张表来选:

任务场景首选指标原因
普通二分类(正负样本均衡)accuracy简单直接,容易解释
正负样本不均衡F1 / AUC防止多数类带偏评估
欺诈检测 / 罕见病筛查Recall漏判代价高于误判
信用评分AUC不依赖阈值选择,排序能力更强
回归任务RMSE / MAE单位与目标值一致

交叉验证之后,最后一个环节是把训练好的模型保存下来,这是很多人会忽略的步骤。训练模型消耗了时间和算力,直接丢掉的话下次复现又要重新跑一遍,数据变了结果也就不一样了。我这里习惯用 joblib 保存,加载之后直接调用,中间不经过序列化转换,对 sklearn 模型兼容性最好。

import joblib # 保存模型和标准化参数到本地 joblib.dump(reg_model, 'model/reg_model.pkl') joblib.dump(scaler, 'model/scaler.pkl') # 新数据进来时,先加载再预测 loaded_model = joblib.load('model/reg_model.pkl') loaded_scaler = joblib.load('model/scaler.pkl') X_new_scaled = loaded_scaler.transform(X_new) pred = loaded_model.predict(X_new_scaled)

从那以后我每次做机器学习项目都强制自己走一遍这套流程:交叉验证评估模型稳定性、joblib 固化模型和预处理器、Notebook 里记录随机种子和库版本。这套习惯从第一个课程设计用到现在的实际项目,帮我在「测试集上分数很好、上线后表现崩盘」这类问题上省了太多回头路。建模不是 Jupyter Notebook 里跑通代码就算完,可复现、可保存、可验证才是工程闭环。希望帮到你。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 5:32:52

威尔逊电流镜与维德拉电流源:从原理到版图的模拟偏置设计指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 5:32:04

WebSocket实战:从轮询到实时双向推送的完整方案

1. 先从一次线上事故说起:轮询把服务打爆了我之前接手过一个内部数据看板项目,需求听起来很简单:后端有一批任务在跑,前端要实时看到进度。第一版图省事,前端用setInterval每 2 秒拉一次接口,当时页面少、用…

作者头像 李华
网站建设 2026/9/28 5:31:55

杂记07 XSS 跨站脚本攻击

XSS 的本质只有一句话:浏览器把攻击者输入的"数据",当成了"代码"来执行。 本文从基础概念讲到三个靶场实战:属性逃逸、JSONP 劫持、登录框反射型。⚠️ 本文所有测试均在授权靶场中完成,仅用于安全学习与防御…

作者头像 李华
网站建设 2026/9/28 5:31:11

基于SSM+JSP+MySQL的健身俱乐部网站毕业设计:搭建到答辩全攻略

简介:一套基于SSMMySQL架构的健身俱乐部网站完整毕业设计资源,面向计算机相关专业毕业生、课程设计及需要项目实战的Java学习者。项目核心覆盖管理员与用户两大模块,包括课程种类、教练、课程、器材管理、教室安排,以及用户端课程…

作者头像 李华
网站建设 2026/9/28 5:31:11

EOS 8.3.3流程表单下拉联动暂存后字典不翻译的根因与解决

1. 问题现场:A选完B没翻译,这个“小毛病”折腾了一下午各位做普元EOS开发的朋友,尤其是从8.x版本一路用过来的老伙计,肯定对这种场景不陌生:流程表单里放两个下拉选择组件,A和B,数据源都挂的业务…

作者头像 李华
网站建设 2026/9/28 5:31:11

木马排查与应急响应实战:从webshell查杀到内网攻防防护

半夜两点被值班电话叫醒,说网站页面全部变成了乱码,数据库被人写了“到此一游”,登录后台一看,多了一个从未见过的管理员账号。这种场景,做过运维和安全的人都不陌生:中木马了。更麻烦的是,很多…

作者头像 李华