scikit-learn Forest Covertypes 数据集(fetch_covtype)完整指南:下载加载、参数解析与源码实现
【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn
导读
本文围绕 scikit-learn 内置的真实世界数据集 Forest Covertypes(森林覆盖类型)展开,系统讲解该数据集的背景、数据规模与特征结构,以及通过sklearn.datasets.fetch_covtype完成下载、缓存、加载与格式转换的完整流程。读者读完本文后将掌握:该数据集在 scikit-learn 中的精确定位与用途、fetch_covtype全部参数(含shuffle、return_X_y、as_frame、n_retries等)的语义与默认值、底层下载与磁盘缓存机制,以及基于源码与测试用例的验证方法,可直接用于多分类任务的基准实验。
一、数据集背景:UCI Covertype 是什么
Forest Covertypes 是一个经典的多分类(multiclass classification)基准数据集,由 Jock A. Blackard 与科罗拉多州立大学(Colorado State University)整理提供。scikit-learn 在 sklearn/datasets/_covtype.py 的模块 docstring 中明确了其来源与用途:
A classic dataset for classification benchmarks, featuring categorical and real-valued features.
数据集的样本对应美国境内 30m×30m 的森林斑块(patches),任务目标是预测每个斑块的覆盖类型,即优势树种(dominant species of tree)。官方描述文件 sklearn/datasets/descr/covtype.rst 给出的核心特征如下:
| 特性 | 数值 |
|---|---|
| 类别数(Classes) | 7 |
| 样本总数(Samples total) | 581012 |
| 特征维度(Dimensionality) | 54 |
| 特征类型(Features) | int |
这份数据集统计表同时被fetch_covtype的函数 docstring 直接引用(见 sklearn/datasets/_covtype.py),是理解该数据规模的第一手依据。
二、特征结构:10 个测量特征 + 4 个荒地指示 + 40 个土壤类型指示
从源码的FEATURE_NAMES定义(sklearn/datasets/_covtype.py)可以看出 54 个特征的构成方式:
FEATURE_NAMES = [ "Elevation", # 海拔 "Aspect", # 坡向 "Slope", # 坡度 "Horizontal_Distance_To_Hydrology",# 到水文的水平距离 "Vertical_Distance_To_Hydrology", # 到水文的重直距离 "Horizontal_Distance_To_Roadways", # 到道路的水平距离 "Hillshade_9am", # 9 点阴影 "Hillshade_Noon", # 正午阴影 "Hillshade_3pm", # 15 点阴影 "Horizontal_Distance_To_Fire_Points", # 到火点的水平距离 ] FEATURE_NAMES += [f"Wilderness_Area_{i}" for i in range(4)] # 4 个荒地指示变量 FEATURE_NAMES += [f"Soil_Type_{i}" for i in range(40)] # 40 个土壤类型指示变量 TARGET_NAMES = ["Cover_Type"]54 个特征的具体构成如下:
- 10 个连续/离散测量特征:海拔、坡向、坡度、水文距离(水平/垂直)、道路距离、三个时段的 Hillshade 阴影值(9am / Noon / 3pm)、火点距离;
- 4 个布尔指示变量
Wilderness_Area_0~Wilderness_Area_3:指示样本属于哪一类荒地(Wilderness Area),为 one-hot 编码; - 40 个布尔指示变量
Soil_Type_0~Soil_Type_39:指示土壤类型,同样为 one-hot 编码。
这与描述文档中“部分特征是布尔指示变量,其余是离散或连续测量值”(sklearn/datasets/descr/covtype.rst)的说明完全对应。目标变量Cover_Type的取值范围为1~7,对应七种森林覆盖类型。
三、加载数据:fetch_covtype 的返回结构
描述文档明确指出(sklearn/datasets/descr/covtype.rst):
sklearn.datasets.fetch_covtypewill load the covertype dataset; it returns a dictionary-like 'Bunch' object with the feature matrix in thedatamember and the target values intarget.
fetch_covtype默认返回一个字典风格的Bunch对象,各成员如下(依据函数 docstring 与 sklearn/datasets/_covtype.py 的返回逻辑):
| 成员 | 形状 | 说明 |
|---|---|---|
data | (581012, 54) | 特征矩阵,每行对应一个样本的 54 个特征 |
target | (581012,) | 目标值,取值 1~7 的七个覆盖类型之一 |
feature_names | list | 54 个特征名称(见上文 FEATURE_NAMES) |
target_names | list | 目标列名称["Cover_Type"] |
DESCR | str | 数据集描述文本,即本仓库中的 covtype.rst |
frame | (581012, 55) | 仅当as_frame=True时存在,合并了data与target |
最小调用示例(可直接运行):
>>> from sklearn.datasets import fetch_covtype >>> cov_type = fetch_covtype() >>> cov_type.data.shape (581012, 54) >>> cov_type.target.shape (581012,) >>> cov_type.feature_names[:4] ['Elevation', 'Aspect', 'Slope', 'Horizontal_Distance_To_Hydrology']DESCR文本通过load_descr("covtype.rst")从包内的描述文件加载(sklearn/datasets/_covtype.py),因此cov_type.DESCR.startswith(".. _covtype_dataset:")恒为真——这正是测试 sklearn/datasets/tests/test_covtype.py 所断言的行为。
四、完整参数解析:8 个关键字参数逐一说明
fetch_covtype的全部参数都是**仅关键字(keyword-only)**参数,签名与默认值如下(sklearn/datasets/_covtype.py):
def fetch_covtype( *, data_home=None, download_if_missing=True, random_state=None, shuffle=False, return_X_y=False, as_frame=False, n_retries=3, delay=1.0, ):data_home(str/ path-like,默认None):指定数据集的下载与缓存目录。默认为None时使用get_data_home()得到的路径,即~/scikit_learn_data下的子目录(sklearn/datasets/_covtype.py)。实际缓存位置为<data_home>/covertype/(见 sklearn/datasets/_covtype.py)。download_if_missing(bool,默认True):数据本地不可用时是否自动联网下载。若为False且本地无数据,直接抛出OSError("Data not found and download_if_missing is False")(sklearn/datasets/_covtype.py),适合离线环境或 CI 中严格控制网络访问的场景。random_state(int/RandomState/None,默认None):仅当shuffle=True时用于控制打乱顺序的随机数生成,传入整数值可保证多次调用结果可复现。类型由check_random_state规范化处理(sklearn/datasets/_covtype.py)。shuffle(bool,默认False):是否对样本进行洗牌。注意原始下载的样本并非随机排列,若要做交叉验证等对样本顺序敏感的实验,建议置为True。return_X_y(bool,默认False,自 0.20 版本加入):为True时直接返回(data, target)二元组,而非Bunch对象,便于与模型 API 的无缝衔接(sklearn/datasets/_covtype.py)。as_frame(bool,默认False,自 0.24 版本加入):为True时data与target转换为 pandas DataFrame / Series,并额外提供包含两者的frame成员。该选项要求环境中已安装 pandas,否则抛出ImportError(见下文“测试验证”一节)。n_retries(int,默认3,自 1.5 版本加入):下载过程遇到 HTTP 错误时的最大重试次数,最小值为 1。delay(float,默认1.0,自 1.5 版本加入):两次重试之间的等待秒数,必须大于 0。
所有参数都经过validate_params声明式校验(sklearn/datasets/_covtype.py),非法类型会在进入函数体前即被拒绝,这体现了 scikit-learn 统一的参数校验机制。
4.1 参数组合的典型用法
(1)X / y 二元组直接交给模型:
from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import fetch_covtype from sklearn.model_selection import train_test_split X, y = fetch_covtype(return_X_y=True, shuffle=True, random_state=42) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) clf = RandomForestClassifier(n_jobs=-1, random_state=42) clf.fit(X_train, y_train)(2)pandas DataFrame 风格探索:
bunch = fetch_covtype(as_frame=True, shuffle=True, random_state=42) frame = bunch.frame # 形状 (581012, 55),含全部特征列与 Cover_Type 列 print(frame["Elevation"].describe())五、源码级原理:下载、解析、缓存与洗牌链路
5.1 数据来源与校验和
数据文件通过RemoteFileMetadata描述(sklearn/datasets/_covtype.py):
ARCHIVE = RemoteFileMetadata( filename="covtype.data.gz", url="https://ndownloader.figshare.com/files/5976039", checksum="614360d0257557dd1792834a85a1cdebfadc3c4f30b011d56afee7ffb5b15771", )下载时_fetch_remote会根据该 SHA-256 校验和验证文件完整性,避免网络传输损坏(sklearn/datasets/_base.py)。
5.2 一次完整加载的执行链路
fetch_covtype的执行流程可拆解为(sklearn/datasets/_covtype.py):
- 确定缓存目录:
covtype_dir = join(get_data_home(data_home), "covertype"),数据与目标分别缓存为samples、targets两个 pickle 文件(_pkl_filepath会附加.pkl后缀)。 - 本地命中判断:两个 pickle 文件同时存在即视为已缓存;若未命中且
download_if_missing=True,进入下载分支。 - 原子化下载:在目标目录下创建临时子目录(
TemporaryDirectory),下载 gzip 压缩的原始数据后用np.genfromtxt按逗号分隔解析为Xy;最后一列切出为目标y并转为int32(sklearn/datasets/_covtype.py)。 - 压缩落盘:特征与目标分别用
joblib.dump(..., compress=9)写入临时文件,再通过os.rename原子移动到最终路径。注释中特别说明:临时目录建在目标目录内部,可保证二者在同一文件系统上,从而os.rename是原子的(sklearn/datasets/_covtype.py),避免半写入状态。 - 洗牌:若
shuffle=True,生成np.arange(n)的排列索引并同时重排X、y,随机源由random_state决定(sklearn/datasets/_covtype.py)。 - 返回组装:按
as_frame/return_X_y组合生成 DataFrame 或Bunch。
正是这种“下载一次、pickle 缓存、后续直接joblib.load”的设计(sklearn/datasets/_covtype.py),让 58 万样本的大数据集在重复实验中不会反复消耗网络与解析时间。
六、测试验证:如何确认加载行为符合预期
仓库为 covtype 加载器编写了专门的测试套件 sklearn/datasets/tests/test_covtype.py,覆盖三类关键行为:
test_fetch:验证洗牌后数据形状为(581012, 54)与(581012,);两个不同random_state洗牌结果总和一致(内容相同、顺序不同);DESCR以.. _covtype_dataset:开头;return_X_y返回结构符合约定(sklearn/datasets/tests/test_covtype.py)。test_fetch_asframe:as_frame=True时frame形状为(581012, 55),且Wilderness_Area_0..3、Soil_Type_0..39的枚举列名全部正确生成(sklearn/datasets/tests/test_covtype.py)。test_pandas_dependency_message:未安装 pandas 时调用as_frame=True会抛出包含fetch_covtype with as_frame=True requires pandas的ImportError(sklearn/datasets/tests/test_covtype.py)。
此外,测试夹具fetch_covtype_fxt定义于 sklearn/conftest.py,会读取环境变量SKLEARN_SKIP_NETWORK_TESTS:默认(值为1)跳过需要联网的用例;显式设置SKLEARN_SKIP_NETWORK_TESTS=0时才真正下载数据运行测试。因此你在本地复现这些测试时,网络用例默认会被跳过:
# 默认跳过网络用例 pytest sklearn/datasets/tests/test_covtype.py # 允许联网下载数据后再运行完整测试 SKLEARN_SKIP_NETWORK_TESTS=0 pytest sklearn/datasets/tests/test_covtype.py七、在文档与示例中的使用定位
- 在 scikit-learn 用户指南的 doc/datasets/real_world.rst 中,
fetch_covtype被列为真实世界数据集(real world datasets)之一;该文档通过.. include:: ../../sklearn/datasets/descr/covtype.rst直接内嵌了本描述文档(doc/datasets/real_world.rst),说明 covtype 属于官方推荐的“真实世界数据集”体验入口。 fetch_covtype已在 sklearn/datasets/init.py 中导出,并纳入__all__公开 API 列表(sklearn/datasets/init.py),因此可以通过from sklearn.datasets import fetch_covtype直接导入。- 从源码结构看,该数据集主要用于:多分类算法基准测试、类别不平衡研究(7 类分布不均)、混合特征(连续 + 大量 one-hot 指示变量)场景下的特征工程与模型评估。
八、实操清单与注意事项
- 首次调用会自动下载约数十 MB 的 gzip 数据,需保证网络可达 figshare 镜像;后续调用走本地 pickle 缓存,不再联网。
- 默认不洗牌。数据按原始顺序组织,进行
train_test_split、交叉验证或依赖样本顺序的实验时,务必设置shuffle=True并配合固定random_state保证可复现。 as_frame=True依赖 pandas,未安装时抛ImportError;返回的frame包含全部 54 个特征列与Cover_Type目标列。- 离线环境请使用
download_if_missing=False,此时若缓存缺失会得到明确的OSError,便于在 CI 中快速失败而非静默挂起。 - 目标取值是 1~7 而非 0~6,训练前如算法对标签起始值敏感,可自行做
y - 1映射。 - 数据总量 581012 样本 × 54 维,适合演示随机森林、梯度提升等强分类器;对内存敏感的脚本,可考虑
HistGradientBoostingClassifier等低内存实现。
总结
Forest Covertypes 是 scikit-learn 内置的经典真实世界多分类数据集:7 类目标、581012 个样本、54 维混合特征。本文从 描述文档 出发,结合 加载器源码 与 测试用例,完整覆盖了fetch_covtype的参数语义、Bunch 返回结构、下载缓存链路与测试验证方式,帮助你快速将其接入分类基准实验,并理解 scikit-learn 数据集加载器的通用设计模式。
【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考