机器学习入门必备:经典数据集与数据预处理实战指南
简介面向机器学习入门学习者《1. 机器学习前置知识》配套数据集提供了练习数据加载与预处理的多类型样本。包内共6个文件以csv表格数据为主辅以json与h5格式2.76MB的体积轻量易用适合在Jupyter Notebook或本地环境中快速上手。数据内容涵盖电影评分、新闻标题、咖啡店目录、股票日线及出行订单等场景覆盖结构化表格、半结构化文本与HDF5序列数据可帮助读者熟悉read_csv、read_json、read_hdf等常见读取方式并开展缺失值处理、类型转换、基础统计等实操。资源整体目录清晰按数据用途区分便于按需选取。目前已有4366人学习下载适合机器学习初学者在搭建环境后配合教程同步练习也可作为数据清洗与特征观察的入门素材。1. 机器学习前置知识为什么入门阶段要单独配一套数据集在机器学习课程里前置知识最容易被跳过但恰恰是它决定后续实验能不能跑通。很多初学者直接跳去看算法原理结果连数据长什么样都不知道就开始调参模型报错也不知道去哪排查。这套《1. 机器学习前置知识》配套数据集就是为这个阶段准备的把经典的鸢尾花、红酒、波士顿房价、泰坦尼克、MNIST 等数据统一整理成开箱即用的格式并标注字段含义和推荐用法。它解决三个具体问题省去到处找数据、猜格式的时间数据经过字段说明和版本整理复现时不会因为版本不一致翻车难度梯度排好从表格分类到回归再到图像和文本对应入门课程的知识推进顺序。适合谁看准备学机器学习的学生、想快速验证算法的自学者、要做课程设计但不想在数据准备上耗时间的人。接下来我从实际拆解角度把这份数据集的内容、用法和常见的坑一次说清楚。2. 配套数据集里到底有什么从鸢尾花到 MNIST 的选型逻辑这套配套数据集不是随手堆了一堆 csv而是按机器学习前置知识的推进顺序做的分组。我拆解后发现每一组数据都精确对应一个学习阶段表格分类讲特征与标签的映射图像讲非结构化数据怎么变成向量回归和文本讲连续值预测与序列处理。下面按三组逐个拆。2.1 表格/分类数据集为什么鸢尾花、红酒、乳腺癌是标配Iris 鸢尾花被称为机器学习的“Hello World”150 个样本每个样本有花萼长度、花萼宽度、花瓣长度、花瓣宽度四个数值特征目标是把 Setosa、Versicolor、Virginica 三种鸢尾分开。它进配套数据集的核心原因是样本量小、特征语义清楚、类别均衡没有 GPU 的机器也能秒级跑完整条训练流程。用逻辑回归默认参数就能到 95% 以上这个结果能让新手第一次建立起“模型我能掌控”的信心。配套数据集里的 Iris 做过两处整理去掉原始文件的空白表头并把 species 列从字符串统一编成 0、1、2。拿到之后我一般会让新手先跑下面三行看数据分布再进训练环节import pandas as pd df pd.read_csv(iris.csv) print(df.head()) print(df.info()) print(df.groupby(species).size())head() 看字段是否对齐info() 看类型和缺失值groupby 看类别分布。这三行输出的东西很关键很多课程直接跳到 fit但这三行恰恰是前置知识要训练的观察能力。Iris 类别完全均衡各 50 条后面切分不指定 stratify 也不会太偏可一旦换成泰坦尼克或乳腺癌这类不平衡数据省略这一步就会出大问题。Wine 红酒数据集有 178 个样本、13 个特征包括酒精、苹果酸、灰分、黄酮等化学指标目标是把三个产地的酒分开。它和鸢尾花最大的区别在特征维度13 个特征里数值范围差别极大酒精浓度大概是 11 到 15而脯氨酸能到几百上千。如果不做标准化距离类算法会把“数值大”的特征误当成“更重要”的特征。配套数据集里给了 StandardScaler 的推荐写法但更值得做的是自己对比一次用原始值和标准化后的值分别训练 KNN看准确率差多少。这一步的理解价值比背下公式更大。Breast Cancer 乳腺癌数据集威斯康星版本有 569 个样本、30 个特征二分类任务预测良性还是恶性。它在配套数据里专治一个误区很多人以为“模型越复杂越好”。这 30 个特征之间存在明显相关性直接上逻辑回归会出现系数不稳。配套实验会让正则化参数 C 从 1.0 一路调到 0.001观察训练集和测试集准确率的变化C 越小正则化越强训练集准确率掉一两个点测试集反而更稳。这是理解过拟合与模型复杂度最直观的一课。三个表格数据集放在一起正好覆盖分类任务的三种形态低维均衡Iris、中维需标准化Wine、高维需正则化Breast Cancer。这份配套里给它们的统一格式如下数据集样本数特征数类别数主要知识点Iris15043特征与标签映射、分类边界Wine178133特征缩放、距离度量Breast Cancer569302正则化、高维小样本过拟合2.2 图像数据集MNIST、CIFAR-10 如何辅助理解特征工程图像数据在“机器学习前置知识”里的定位不是让你直接上卷积网络而是让你理解“图像就是一个数组”这句话。MNIST 手写数字是最典型的教学样本每张图 28×28 灰度图像素值范围 0 到 255代表数字 0 到 9。配套数据集里同时保留了原始 28×28 矩阵和拉平成 784 维向量的两个版本。为什么要有两个版本因为很多初学者没法把“一张二维图像”和“一个特征向量”对应起来。当你执行 image.reshape(1, -1) 之后这张图就变成了 784 个特征的向量可以直接丢给逻辑回归或 SVM。配合 matplotlib 显示前几张图你会直观看到“数字 1”的像素集中在中间一小片区域“数字 0”的像素分布更均匀。这种观察比单纯背一句“图像是 28×28×1”有用得多。CIFAR-10 的加入则是对特征工程的一次“降温”。它同样是图像分类图片是 32×32 彩色图有飞机、汽车、鸟、猫等 10 个类别用 MNIST 同款拉平方法可能只能得到 40% 左右的准确率。为什么差距这么大因为彩色图像里的背景、光照、角度带来的干扰远不是简单像素值能描述的。配套数据里把 CIFAR-10 设计成“给足挫败感”的实验你先跑完 MNIST 的 92%再跑 CIFAR-10 的 40%自己体会到特征表示的重要性然后才有动力学 HOG、颜色直方图这些手工特征。需要说清楚的是如果你后面往目标检测走MNIST 和 CIFAR-10 就只是起点。工业里常见的 CCPD 车牌检测、HRSC2016 遥感舰船、DOTA 航空图像这些数据集的标签格式完全不同读入、切分、评估的基本功还是得在 MNIST 这种小数据上先练扎实。配套数据集的边界就在这它负责把地基打牢不负责把上层建筑盖完。一般建议的操作路径是先用 matplotlib 画一个 4×4 网格把 MNIST 前 16 张图展示出来看手写数字的不同形态然后选定两张图分别打印 reshape 之后的向量和像素统计值均值、标准差在笔记里写下“图像变成了数字数字组成了特征”这句话。这套流程走完再开始调模型心里会踏实很多。2.3 回归与文本场景波士顿房价、泰坦尼克、IMDB 各自卡在哪个环节波士顿房价是课程里出现频率最高的回归数据集506 个样本、13 个特征预测房屋中位价格。它的坑在于特征分布不均衡LSTAT低收入人口比例和 B 的取值相差悬殊直接跑线性回归会出现系数差异巨大但解释性差的问题。配套数据集里保留了原始列同时给了一版经过 log 变换的特征列。实验时对比原始数据和 log 数据分别训练线性回归的 R²就能直观看到单调变换对连续值预测的影响。泰坦尼克数据集则是最接近现实业务的数据891 个样本、12 列包含乘客 ID、姓名、舱位、票价、年龄、性别等目标是预测是否幸存。它和前面几个最大的不同是真实数据很少是“干净矩阵”。Age 有 177 个缺失值Cabin 有 687 个缺失值Embarked 还有 2 个缺失值你得自己决定是删除、插值还是单独编码成“未知”。这个决策过程就是前置知识里最值钱的练习。配套数据针对泰坦尼克固定了一道题性别、年龄、票价、舱位等级、登船港口做特征Survived 做标签先用 .isnull().sum() 看缺失分布再做年龄均值填充、港口众数填充最后把性别用 0/1 编码。一套流程下来DataFrame 索引对齐、缺失值处理、类别编码全练到了。从建模效果看这套固定配法得到的逻辑回归大约能到 78% 左右足够验证“清洗对效果有影响”这个结论。IMDB 影评数据是文本分类入门代表5 万条评论正面 2.5 万负面 2.5 万。它的卡点在于“文本不能直接进模型”。配套数据集里给的通用流程是先用 CountVectorizer 把评论转成词频矩阵再叠加 TF-IDF 做权重调整最后交给逻辑回归。这里有一个参数值得单独说max_features5000只保留词频最高的 5000 个词。保留全部几万个词不但训练慢很多低频词对分类毫无帮助5000 是在效果和开销之间常见的平衡点后续想提升再逐步加到 1 万或 2 万。把三个场景连起来看是在模拟一条完整的产业链路回归遇到分布偏态表格遇到缺失值和字符串文本遇到非结构化数据。前置知识阶段不是要把每个问题做到最优化而是让你知道每个环节会卡在哪个位置后面学模型时才有对照物。3. 把配套数据集跑起来加载、切分与预处理的标准三步很多人拿到数据集第一反应是打开看两眼然后直接 train_test_split。这个顺序是错的。配套数据集最应该养成的习惯是加载后先做结构检查再做切分最后做预处理三步之间不跳步尤其不要先对整个数据集做标准化再切分。3.1 用 pandas 和 sklearn 一次性加载并查看数据分布我一般会在项目根目录建 data/ 文件夹把数据集统一放进去然后用一个 load_data.py 做统一入口。这个文件不只是读数据而是在做最基础的“体检”import pandas as pd def load_iris(): df pd.read_csv(data/iris.csv) assert not df.isnull().any().any(), 存在缺失值 print(f样本量: {df.shape[0]}, 特征数: {df.shape[1] - 1}) print(df.describe().T[[mean, std, min, max]]) return df df load_iris()assert 是一个低成本护栏专门防止后续步骤带着缺失值往下走。describe() 输出每列的均值、标准差、最小值和最大值一眼能看出特征范围是否差距过大。比如 Iris 的花瓣长度标准差是 1.76花萼宽度标准差只有 0.43这种差异直接提示你后续可能需要标准化。输出不是给你看的是给你判断下一步动作用的偏态太大就先 log范围差异大就先 StandardScaler。另一个我必用的检查是类别分布print(df[species].value_counts(normalizeTrue))normalizeTrue 把次数转成比例。如果某个类别只占 10%后续切分就必须用 stratify 参数否则测试集里可能抽不到该类别样本。这部分看似简单但很多新手在这个位置漏掉等训练完看分类报告才发觉测试集缺了一整个类别。3.2 训练集 / 验证集 / 测试集切分比例与随机种子切分有两条原则分三层固定随机种子。前置知识阶段很多实验只有两三百个样本更不适合一次性把数据切成两半。常见做法是训练、验证、测试按 70%、15%、15% 切先切一次留出测试集再在训练集内部切出验证集。from sklearn.model_selection import train_test_split X df.drop(species, axis1) y df[species] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.15, random_state42, stratifyy ) X_train, X_val, y_train, y_val train_test_split( X_train, y_train, test_size0.15 / 0.85, random_state42, stratifyy_train ) print(X_train.shape, X_val.shape, X_test.shape)第二行的 test_size0.15 / 0.85 可能让人困惑第一次切完后训练集占 85%要从这 85% 里拿出 15% 的样本作为验证集计算方式就是 0.15 除以 0.85这样最终原始数据被均匀分成 70:15:15。stratifyy 保证每个类别在训练、验证、测试中的比例一致对 Iris 影响不大但对幸存率只有 38% 的泰坦尼克作用非常明显。random_state42 不是玄学它决定切分时的随机序列。固定它别人复现实验时能得到一模一样的训练集和测试集。如果你在调参时每次跑出来的结果都不一样先检查有没有传 random_state。这是前置知识阶段最容易被忽略、也最容易引发“为什么准确率忽高忽低”的根源。3.3 数值标准化与类别编码一套可复用的预处理模板配套数据集里表格型数据的特征是混着的比如泰坦尼克里有 Age、Fare 这类数值列又有 Sex、Embarked 这类字符串列。传统做法是手动分离再分别处理但 sklearn 的 ColumnTransformer 可以用一份代码把两类处理全部完成from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler, OneHotEncoder numeric_cols [Age, Fare] categorical_cols [Sex, Embarked] preprocessor ColumnTransformer([ (num, StandardScaler(), numeric_cols), (cat, OneHotEncoder(handle_unknownignore), categorical_cols) ]) X_processed preprocessor.fit_transform(X_train) X_val_processed preprocessor.transform(X_val) X_test_processed preprocessor.transform(X_test) print(X_processed.shape)关键点有两个。第一fit 只放在训练集上transform 放在验证集和测试集上。因为验证集和测试集模拟的是“未来未知数据”不能把它们的统计量混进标准化参数里否则构成数据泄漏。第二OneHotEncoder 的 handle_unknownignore 意思是如果测试集里出现训练集中没见过的类别不会报错而是把该维度全部置 0。真实上线时 Embarked 很可能出现新港口这个参数能让模型不至于一遇到新类别就崩。这套模板可以直接复制到任何表格型实验上。如果你只是快速验证也可以用 pandas 的 get_dummies 做类别编码但要记住 get_dummies 不会记录列名顺序训练和测试的列顺序一不小心就不一致。ColumnTransformer 则把列的变换规则绑在对象里训练和预测用同一套规则更不容易出错。4. 避坑处理配套数据集时最常翻车的六个场景以下六条来自我在实际帮人排错时遇到最多的几类问题。前置知识阶段踩坑不可怕怕的是踩了坑不知道怎么定位。每一条都按现象、原因、解决的顺序写你可以直接对号入座。4.1 数据泄漏归一化放在切分之前看似没问题实则废了现象训练集准确率很高比如 98%但测试集只有 60% 多换了好几个模型都没有改善。原因很多新手拿到数据后先对整个 DataFrame 做标准化再切分训练集和测试集。这时测试集的均值、方差已经参与了 StandardScaler 的 fit模型在训练时等于“偷看”了测试集的分布信息测试结果被高估一到真实环境就崩。解决标准化必须拆成 fit 和 transform 两步fit 只作用于训练集。正确写法是重新实例化 scaler只喂训练集 fit再分别 transformscaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)4.2 类别不平衡准确率 90% 不代表模型真的好现象泰坦尼克实验里输出 90% 的准确率但分类报告里“幸存”那个类别的召回率只有 30%。原因泰坦尼克幸存者只占 38% 左右模型把所有样本都判成“未幸存”时准确率就已经是 62%。如果某个数据里负样本占 90%模型全部猜负样本也能拿到 90% 的准确率看起来漂亮实则毫无意义。解决不要只看准确率。配套数据集里专门加了 classification_report 的用法用精确率、召回率、F1 一起看。如果数据确实不平衡切分时加 stratifyy训练时给正类更高的权重例如在逻辑回归里设 class_weightbalanced。这些参数改变的是模型对少数类的关注度直接反映在召回率上。4.3 索引错位reset_index 忘了用标签全对不上现象做完缺失值填充或数据筛选之后某个特征的顺序和标签完全错开训练出来的模型预测结果乱成一团。原因DataFrame 在 dropna()、fillna()、query() 之后索引会保留原来的位置。比如删掉第 5 行索引变成 0、1、2、3、6、7……当 X df[[Age]] 同时 y df[Survived] 时如果中途漏了 reset_index两个对象的行并不一一对应。解决在做任何行筛选或填充之后第一时间执行 df df.reset_index(dropTrue)。dropTrue 表示不把原索引保留成新列索引从 0 开始连续排列。另一个稳妥做法是始终从同一个 DataFrame 对象同时取特征和标签不要东拼西凑。4.4 随机种子不一致同一份数据每次跑出不同结论现象同一个模型关掉程序再跑一次准确率差了三五个点并且每次都在变。原因train_test_split 和很多模型的初始化都带随机性。没有指定 random_state每次运行都会生成不同的序列切出的训练集、测试集不同模型性能自然有波动。解决在训练入口统一设置一个 seed 变量例如 seed 42所有涉及随机过程的地方都要传入。如果用 PyTorch、TensorFlow还需要增加 torch.manual_seed 和 tf.random.set_seed 这类调用只在 sklearn 里固定还不够。这也是为什么配套数据集里的脚本都从一个 config 变量读取随机种子而不是在每个函数里写死。4.5 缺失值处理粗暴直接 dropna 丢掉了大量有效样本现象泰坦尼克训练出来的效果很平怎么调参数都没用。查数据才发现建模时把有缺失值的行全删了样本量从 891 掉到 204。原因直接 dropna() 是最省事的做法但会把大量有用信息一起丢掉。比如 Cabin 缺失率很高但“缺失本身”可能就是一个信号头等舱乘客更可能有舱位号。年龄缺失的样本里其他字段全是完整的全删非常可惜。解决先按列统计缺失率低于 5% 的用均值或中位数填充高于 20% 的单独编码成一列 missing_flag。比如 Age 缺失 177 行用中位数填充并加一个 is_age_missing 特征通常比直接删除效果更好。配套数据集里的泰坦尼克实验模板就是用的这种处理方式可以对比一版全是 dropna 的结果差距会很明显。4.6 图像数据集路径问题Windows 与 Linux 分隔符不一致现象在 Windows 本机跑的 MNIST 加载代码放到 Linux 服务器上就报 FileNotFoundError。原因Windows 路径用反斜杠 .\data\mnist.npzLinux 用正斜杠 ./data/mnist.npz。代码里写死路径分隔符换平台就得改代码。解决用 pathlib 或 os.path.join 拼接路径。配套数据集里统一约定用 pathlibfrom pathlib import Path DATA_DIR Path(data) mnist_path DATA_DIR / mnist.npz print(mnist_path.exists())这样无论在哪个系统下路径拼接都会自动生成正确的分隔符。还有一个同样常见的问题中文目录或带空格的文件名先把路径 print 出来并 exists() 确认一下再继续能省去大量排查时间。5. 用配套数据集验证模型完整的最小可复现流程前几章把数据准备工作做扎实了这一步就是真正的建模验证。配合这套数据集我给你一条最小可复现流程逻辑回归跑通、决策树对比、评估指标选择。三条线走完一份课程设计的前置实验部分基本就成型了。5.1 逻辑回归跑通鸢尾花12 行代码走完训练与评估先拿 Iris 做一次完整训练。逻辑回归是前置知识里最值得先跑的模型它训练快、参数少、结果容易解释。代码如下from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, accuracy_score model LogisticRegression(max_iter200) model.fit(X_train, y_train) y_pred model.predict(X_test) print(准确率:, accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred))max_iter200 是把迭代上限调高因为 sklearn 默认的 100 次在部分数据上可能不收敛输出警告但不会报错。classification_report 会同时给出精确率、召回率、F1 和各类别的样本数这样你能看到模型在三个类别上的表现是否均衡。Iris 上这个实验通常能稳定到 95% 以上少数时候分错的是 Versicolor 和 Virginica 这两类因为它们的花瓣参数有重叠。5.2 决策树与随机森林对比什么时候过拟合一目了然配套数据集的价值在于让你对比不同模型的拟合行为。决策树是经典的高方差模型在 Wine 数据上很容易出现过拟合随机森林则通过集成减弱了波动。对比写法如下from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier tree DecisionTreeClassifier(random_state42) forest RandomForestClassifier(n_estimators100, random_state42) tree.fit(X_train, y_train) forest.fit(X_train, y_train) for name, model in [(决策树, tree), (随机森林, forest)]: train_acc model.score(X_train, y_train) test_acc model.score(X_test, y_test) print(f{name} 训练集: {train_acc:.4f}, 测试集: {test_acc:.4f})默认参数的决策树在训练集上经常拿 100% 准确率测试集只有 85%随机森林的 n_estimators100 会让训练集准确率降到 98% 左右但测试集能上到 90% 以上。这个对比就是“过拟合”最直观的证据。如果你想进一步限制决策树可以加 max_depth3训练集准确率立刻下降但测试集可能反而上升。这组结果写进实验报告里比单纯贴一个 0.95 的准确率有说服力得多。5.3 评估指标的选择准确率、精确率、召回率、F1 怎么配前置知识阶段最容易犯的错是全程只看准确率。真实业务中准确率经常没有参考意义医疗筛查关心召回率别漏掉病人垃圾邮件拦截关心精确率别误删正常邮件。配套数据集里三种场景给你演示了三种选择鸢尾花三类分布均衡准确率就够用但要同时看每个类别的 F1。乳腺癌二分类不平衡重点看正类恶性的召回率宁可误报也不要漏报。泰坦尼克幸存者占少数建议综合看 F1并比较 class_weightbalanced 前后的变化。一份完整的实验记录应该把四个指标都打出来代码只需要这样写from sklearn.metrics import precision_score, recall_score, f1_score print(精确率:, precision_score(y_test, y_pred, averageweighted)) print(召回率:, recall_score(y_test, y_pred, averageweighted)) print(F1:, f1_score(y_test, y_pred, averageweighted))averageweighted 是按各类别样本量加权的汇总值适合多分类。如果只关心二分类中的正类把 average 去掉直接传入 pos_label 就行。我把这套指标打印模板直接放进了配套脚本里以后任何实验都可以复用。6. 最后一个习惯把数据集清单和版本一起写进 README建模做完后很多人会把代码一存就完事。但真正到期末复习、课程设计验收或者几个月后回看时最先遗忘的往往是数据本身这个字段是什么意思缺失值处理规则是什么数据从哪里来所以最后一个技巧是在项目里养成写数据 README 的习惯。6.1 数据字典每个字段的类型、范围、缺失率拿到配套数据集后先做一张数据字典表而不是急着跑模型。我一般用 pandas 自动生成import pandas as pd df pd.read_csv(titanic.csv) meta pd.DataFrame({ 字段: df.columns, 类型: df.dtypes.values, 非空数: df.notna().sum().values, 缺失率: (df.isnull().mean() * 100).round(2).values, 唯一值数: df.nunique().values }) print(meta.to_string())这张表直接粘贴进 README 的“数据字典”小节。缺失率一列能提醒你哪些列需要单独处理唯一值数能看出哪些列是类别变量还是连续变量。后续再看数据时不需要重新打开 csv 回忆一份表全搞定。6.2 版本与来源记录为什么这份记录比代码更重要我见过太多人因为数据版本不一致导致同一个实验在两个人手里结果对不上。你可以把数据集按日期和来源整理成固定格式数据集版本来源/说明处理状态iris.csvv1.0sklearn 内置数据导出已编码标签 0/1/2titanic.csvv1.0Kaggle 公开数据Age 中位数填充Cabin 保留缺失mnist.npzv1.0原始 28×28未增强已提供 flatten 版本这份记录写清楚之后别人复现你的实验时才不会拿错文件。从那以后我每次拿到一套新数据集都强制走一遍这个流程数据字典、切分种子、预处理管线、版本清单四样写进 README 再开始建模。这套配套数据集本身已经替你省去了大部分整理时间但你自己把数据出处和版本留下才是真正能一直用的资产。希望帮到你。本文还有配套的精品资源点击获取