scikit-learn Olivetti Faces 数据集完全指南:fetch_olivetti_faces 的加载、预处理与实战应用 scikit-learn Olivetti Faces 数据集完全指南fetch_olivetti_faces 的加载、预处理与实战应用【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn本指南深入剖析 scikit-learn 内置的 Olivetti Faces 人脸数据集从它在 1992–1994 年间由 ATT Laboratories Cambridge 采集的历史渊源到fetch_olivetti_faces函数的下载、缓存、归一化全流程再到其在 PCA/NMF 分解与人脸补全等经典任务中的用法帮助你全面掌握这份机器学习入门的黄金标准人脸数据。数据集背景ATT 实验室的人脸采集工程Olivetti Faces 数据集也称 ORL 人脸库的图片于1992 年 4 月至 1994 年 4 月之间在 ATT Laboratories Cambridge剑桥 ATT 实验室拍摄由sklearn.datasets.fetch_olivetti_faces函数负责下载并缓存数据归档。仓库内对应的描述文档为 sklearn/datasets/descr/olivetti_faces.rst加载器源码位于 sklearn/datasets/_olivetti_faces.py。按照原始网站的描述该数据集的采集规范如下共有40 位不同的受试者subject每人拍摄10 张不同图像对部分受试者图像在不同时间拍摄并有意变化了光照、面部表情睁眼/闭眼、微笑/不微笑与面部细节戴眼镜/不戴眼镜所有图像均以深色均匀背景拍摄受试者保持直立、正面的姿态允许少量侧移容差。这是一组刻意引入真实世界变异性光照、表情、配饰的人脸样本因此非常适合验证算法对类内变化的鲁棒性。数据特征一览原文档给出了该数据集的官方特征表属性数值Classes类别数40Samples total样本总数400Dimensionality维度4096Features特征类型real取值介于 0 与 1 之间关于原始格式与预处理原文档明确说明原始图像被量化到256 级灰度以无符号 8 位整数uint8存储加载器会把整数转换为[0, 1] 区间上的浮点值这更便于众多算法直接处理数据集中的target是从0 到 39的整数标识每张图中的人物身份由于每个类别仅有 10 个样本这个体量相对较小的数据集从无监督或半监督视角来看更有研究价值原始数据集图像尺寸为92×112而本仓库提供的版本为64×64图像。加载方式与返回结构基本调用from sklearn.datasets import fetch_olivetti_faces olivetti_faces fetch_olivetti_faces() # 扁平化特征矩阵(400, 4096) print(olivetti_faces.data.shape) # 原始 64x64 图像张量(400, 64, 64) print(olivetti_faces.images.shape) # 标签人物 ID0-39(400,) print(olivetti_faces.target.shape)首次调用时函数会打印下载信息downloading Olivetti faces from https://ndownloader.figshare.com/files/5976027 to ~/scikit_learn_data默认情况下函数返回一个字典风格的Bunch对象见 sklearn/utils/_bunch.py包含以下属性属性形状说明data(400, 4096)每行是一条**展平ravelled**的 64×64 人脸图像images(400, 64, 64)保持二维空间结构的人脸图像对应 40 位受试者target(400,)每张图对应的标签取值 0–39即 Subject IDDESCRstr数据集完整描述文本若设置return_X_yTrue自 0.22 版本起支持则直接返回(data, target)二元组适合直接接入fit(X, y)接口。fetch_olivetti_faces 完整参数详解从源码 sklearn/datasets/_olivetti_faces.py 可以看到函数的完整签名全部参数均以关键字形式传递*之后def fetch_olivetti_faces( *, data_homeNone, shuffleFalse, random_state0, download_if_missingTrue, return_X_yFalse, n_retries3, delay1.0, ):参数默认值说明data_homeNone指定数据集下载与缓存目录默认存放在~/scikit_learn_data子目录中由get_data_home解析见 sklearn/datasets/_base.pyshuffleFalse为True时打乱数据集顺序避免同一人的图像连续排列random_state0控制打乱的随机数生成传入整数可获得跨多次调用可复现的输出download_if_missingTrue为False且本地无数据时抛出OSError而不是尝试联网下载return_X_yFalse为True时返回(data, target)元组0.22 版本新增n_retries3遇到 HTTP 错误时的重试次数1.5 版本新增delay1.0每次重试之间的等待秒数1.5 版本新增值得注意的是n_retries与delay两个参数在 1.5 版本才引入用于增强下载过程的网络健壮性。所有参数都经过validate_params装饰器做类型校验见 sklearn/utils/_param_validation.py例如n_retries必须是 1的整数、delay必须是 0的实数。数据缓存机制源码展示了一个精妙的缓存管线sklearn/datasets/_olivetti_faces.py数据主文件元数据FACES是一个RemoteFileMetadata对象记录了文件名olivettifaces.mat、下载地址与SHA-256 校验和b612fb967f2dc77c9c62d3e1266e0c73d5fca46a4b8906c18e454d41af987794用于校验下载完整性首次调用时下载 MATLAB 格式的olivettifaces.mat用scipy.io.loadmat解析后立即删除原始.mat文件并将人脸矩阵以joblib.dump(..., compress6)压缩序列化为olivetti.pkz缓存后续调用检测到缓存文件存在时直接joblib.load不再访问网络。源码级预处理管线从 uint8 到 [0,1] 浮点加载完成后数据会经过统一的预处理sklearn/datasets/_olivetti_faces.py# 转为 float32原始 uint8 只有 1 字节精度float32 已足够 faces np.float32(faces) # 全局最小-最大归一化到 [0, 1] faces faces - faces.min() faces / faces.max() # 恢复 64x64 空间结构并转置修正轴向 faces faces.reshape((400, 64, 64)).transpose(0, 2, 1) # 每类 10 张图类别连续排列target i // 10 target np.array([i // 10 for i in range(400)])这段代码揭示了三个关键技术点数据精度由于原始数据只有 1 字节8 bit灰度精度float32足够承载全部信息避免了不必要的内存开销归一化通过最小-最大缩放将像素值映射到[0, 1]这正是原文档特征表中Features: real, between 0 and 1的来源标签构造target i // 10意味着在未打乱的情况下每连续 10 张图属于同一位受试者shuffleTrue则会用check_random_state(random_state).permutation打乱样本与标签的对应顺序。数据获取的工程细节与测试验证测试覆盖仓库为这一加载器提供了专门的单元测试 sklearn/datasets/tests/test_olivetti_faces.py验证内容包括返回对象为Bunch且包含data、images、target、DESCR四个键形状分别为(400, 4096)、(400, 64, 64)、(400,)target的独立取值恰好为np.arange(40)即覆盖全部 40 个类别DESCR以.. _olivetti_faces_dataset:开头说明它直接装载了本文所解析的 RST 描述文件return_X_yTrue行为符合数据集通用约定。网络测试开关由于该数据集需要联网下载测试基建在 sklearn/conftest.py 中提供了fetch_olivetti_faces_fxtfixture默认设置download_if_missingFalse仅当环境变量SKLEARN_SKIP_NETWORK_TESTS0时才真正联网获取数据否则跳过网络相关测试——这是 CI 环境如 build_tools/github/test_script.sh中保证测试可离线运行的标准做法。实战案例一人脸分解Eigenfaces / NMF / ICA由于每类样本极少10 张Olivetti Faces 最经典的用途是无监督降维与分解。官方示例 examples/decomposition/plot_faces_decomposition.py 在同一份数据上对比了多种矩阵分解方法from numpy.random import RandomState from sklearn import cluster, decomposition from sklearn.datasets import fetch_olivetti_faces rng RandomState(0) faces, _ fetch_olivetti_faces(return_X_yTrue, shuffleTrue, random_staterng) n_samples, n_features faces.shape # 全局中心化按特征均值 局部中心化按样本均值 faces_centered faces - faces.mean(axis0) faces_centered - faces_centered.mean(axis1).reshape(n_samples, -1) # 本征脸PCA 随机化 SVD pca decomposition.PCA(n_components6, svd_solverrandomized, whitenTrue) pca.fit(faces_centered) # 非负矩阵分解要求数据非负直接作用于原始数据 nmf decomposition.NMF(n_components6, tol5e-3) nmf.fit(faces) # 独立成分分析 ica decomposition.FastICA(n_components6, max_iter400, whitenarbitrary-variance, tol15e-5) ica.fit(faces_centered)示例中还依次演示了MiniBatchSparsePCA、MiniBatchDictionaryLearning、MiniBatchKMeans聚类中心与FactorAnalysis的应用每种方法抽取 6 个 4096 维分量再以 64×64 图像形式可视化直观对比本征脸与字典原子的差异。注意 PCA/ICA/字典学习前通常需要中心化而 NMF 要求非负输入因此直接使用归一化后的原始数据。实战案例二多输出回归的人脸补全另一个经典应用是用上半张脸预测下半张脸展示多输出回归器。官方示例 examples/miscellaneous/plot_multioutput_face_completion.py 的核心流程from sklearn.datasets import fetch_olivetti_faces from sklearn.ensemble import ExtraTreesRegressor from sklearn.linear_model import LinearRegression, RidgeCV from sklearn.neighbors import KNeighborsRegressor data, targets fetch_olivetti_faces(return_X_yTrue) # 按人物身份划分前 30 人训练后 10 人测试测试集人物完全独立 train data[targets 30] test data[targets 30] n_pixels data.shape[1] # 输入上半张脸输出下半张脸均为 2048 维多输出目标 X_train train[:, : (n_pixels 1) // 2] y_train train[:, n_pixels // 2 :] X_test test[:, : (n_pixels 1) // 2] y_test test[:, n_pixels // 2 :] for name, estimator in { Extra trees: ExtraTreesRegressor(n_estimators10, max_features32, random_state0), K-nn: KNeighborsRegressor(), Linear regression: LinearRegression(), Ridge: RidgeCV(), }.items(): estimator.fit(X_train, y_train)该示例还有一个值得借鉴的建模原则按人物 ID 划分训练/测试集targets 30与targets 30确保测试时面对的是训练中从未出现过的人脸从而真实评估模型的泛化能力。类似的按人划分思路也出现在 examples/cluster/plot_dict_face_patches.py 中。使用注意事项存储位置默认数据缓存在~/scikit_learn_data下olivetti.pkz文件可通过data_home参数指定其他目录网络依赖首次加载需要联网下载约数 MB 的 MATLAB 数据文件离线环境请预先缓存或设置download_if_missingFalse此时本地无数据会抛出OSError引用致谢按原文档要求使用这些图像时请注明出处并致谢 ATT Laboratories CambridgeDESCR属性中同样包含这一说明数据尺寸加载后务必以images400, 64, 64形态查看原始空间结构以data400, 4096形态用于算法拟合适用场景由于每类仅 10 个样本、总体仅 400 张它更适合人脸分解、特征学习、字典学习、半监督/无监督研究等任务而非直接作为大规模监督分类基准。小结Olivetti Faces 是 scikit-learn 中最具代表性的人脸数据集之一40 位受试者、每人 10 张、64×64 灰度、像素值归一化到 [0,1]。通过fetch_olivetti_faces及其完备的参数体系shuffle、random_state、return_X_y、n_retries等你可以一键获得缓存完备、格式统一、可直接进入机器学习管线的数据。结合 sklearn/datasets/_olivetti_faces.py 的源码与 examples/decomposition/plot_faces_decomposition.py、examples/miscellaneous/plot_multioutput_face_completion.py 等示例无论是入门人脸分解、验证降维算法还是研究多输出回归与半监督学习它都是一份可靠、轻量且富有历史意义的实验数据。【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考