scikit-learn 物种分布数据集(Species Distribution Dataset)完全指南:从 fetch 加载到分布密度建模 📅 发布时间:2026/9/19 21:07:45 👁 浏览次数: scikit-learn 物种分布数据集Species Distribution Dataset完全指南从 fetch 加载到分布密度建模【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn本文基于 scikit-learn 内置的真实世界数据集之一——物种分布数据集Species distribution dataset系统讲解它的数据结构、加载方式、网格重建原理并结合仓库源码与官方示例演示如何基于该数据集完成物种地理分布密度建模Species Distribution ModelingSDM。读完本文你将掌握fetch_species_distributions的完整用法、返回 Bunch 中每个字段的含义以及如何用 One-Class SVM 与核密度估计KDE对只有正样本的生态观测数据构建分布预测模型。数据集概述两种南美哺乳动物的地理分布物种分布数据集见文档 species_distributions.rst记录的是中美洲与南美洲两种哺乳动物的地理分布信息。该数据最初由 Phillips et al. (2006) 在最大熵Maximum Entropy物种分布建模研究中整理提供现被收录进 scikit-learn 的sklearn.datasets模块作为真实世界数据集之一在 real_world.rst 用户指南中被介绍。数据集包含的两种物种分别是Bradypus variegatus即褐喉树懒Brown-throated Sloth分布于中美洲与南美洲的热带雨林Microryzomys minutus又称森林小稻鼠Forest Small Rice Rat是一种栖息于秘鲁、哥伦比亚、厄瓜多尔与委内瑞拉的啮齿类动物。这两种物种的观测记录出现点坐标共同构成了train与test两个记录数组同时数据集中还包含用于描述环境背景的 14 个环境变量栅格coverage这是后续构建物种分布密度图的核心材料。非典型数据结构为什么没有 data 与 target绝大多数 scikit-learn 数据集加载函数会返回一个包含data和target两个属性的Bunch对象用于监督学习。但物种分布数据集不是一个典型数据集fetch_species_distributions返回的Bunch中并不包含data/target属性而是提供了一系列地理信息允许使用者自行构建一张物种密度图density map。这一点在 species_distributions.rst 中有明确说明。这种设计的根本原因在于生态观测数据通常只有正样本物种被观测到的位置没有明确的负样本未观测到并不代表不存在。因此该数据集不适合直接喂给分类器做X, y式的监督学习而更适合密度估计类任务。官方示例正是利用这一特性将问题转化为单类密度估计来处理。加载数据fetch_species_distributions 的完整用法加载函数定义在 sklearn/datasets/_species_distributions.py 中并在 sklearn/datasets/init.py 中作为公开 API 导出from sklearn.datasets import fetch_species_distributions species fetch_species_distributions()函数签名与参数说明fetch_species_distributions的全部参数均为关键字参数keyword-only通过validate_params做了类型校验参数类型默认值说明data_homestr / path-like / NoneNone指定数据下载与缓存的目录。默认情况下所有 scikit-learn 数据存放在~/scikit_learn_data子目录下由get_data_home决定download_if_missingboolTrue若为False且本地不存在缓存数据则直接抛出OSError而不是从源站点下载n_retriesint≥13遇到 HTTP 错误时的重试次数1.5 版本新增delayfloat01.0每次重试之间的等待秒数1.5 版本新增例如离线环境下显式禁用下载species fetch_species_distributions(data_home/tmp/skdata, download_if_missingFalse)底层下载与缓存机制从源码实现看_species_distributions.py数据加载流程如下两份远程数据源SAMPLES物种出现点样本figshare 5976075 文件与COVERAGES14 个环境变量栅格figshare 5976078 文件均带 SHA-256 校验和由_fetch_remote负责下载与完整性校验解析样本文件按 CSV 解析为 record array_load_csv栅格文件按带 6 行头部的网格格式解析_load_coverage缺失值以-9999标记缓存解析完成后组装成Bunch以species_coverage.pkz为名通过joblib.dump(..., compress9)落盘下次调用若缓存已存在则直接joblib.load不再重复下载。因此首次调用会触发网络下载之后全部走本地缓存速度很快。返回的 Bunch 结构与字段详解fetch_species_distributions返回的Bunch包含以下属性属性形状 / 类型含义coverages[14, 1592, 1212]的int16数组14 个环境特征在网格每个点上的取值缺失数据用-9999表示海洋区域trainrecord array(1624,)训练点每条记录含三个字段species物种名如bmicroryzomys_minutus、dd long经度度、dd lat纬度度testrecord array(620,)测试点格式与train相同Nxint1212网格沿 x 轴经度方向的点数Nyint1592网格沿 y 轴纬度方向的点数x_left_lower_cornerfloat-94.8网格左下角 x 坐标经度单位度y_left_lower_cornerfloat-56.05网格左下角 y 坐标纬度单位度grid_sizefloat0.05网格相邻点之间的步长单位度这里需要特别强调Nx是 1212、Ny是 1592而coverages的形状是[14, 1592, 1212]注意顺序是 y 在前、x 在后每个网格点对应一份 14 维环境特征向量。train/test中的经纬度坐标并不直接落在整数网格索引上因此使用前需要借助下文介绍的construct_grids将坐标映射到网格。快速查看数据结构import numpy as np species fetch_species_distributions() print(species.coverages.shape) # (14, 1592, 1212) print(species.train.shape) # (1624,) print(species.train[:3]) # array([(bmicroryzomys_minutus, -64.7 , -17.85 ), # (bmicroryzomys_minutus, -67.8333, -16.3333), # (bmicroryzomys_minutus, -67.8833, -16.3 )], # dtype[(species, S22), (dd long, f4), (dd lat, f4)]) print(species.Nx, species.Ny, species.grid_size) # 1212 1592 0.05重建地图网格construct_grids 的原理文档指出地图网格可以通过x_left_lower_corner、y_left_lower_corner、Nx、Ny、grid_size五个属性重建。仓库在 sklearn/datasets/_species_distributions.py 中提供了construct_grids辅助函数完成这一换算其实现逻辑为def construct_grids(batch): # x,y coordinates for corner cells xmin batch.x_left_lower_corner batch.grid_size xmax xmin (batch.Nx * batch.grid_size) ymin batch.y_left_lower_corner batch.grid_size ymax ymin (batch.Ny * batch.grid_size) # x coordinates of the grid cells xgrid np.arange(xmin, xmax, batch.grid_size) # y coordinates of the grid cells ygrid np.arange(ymin, ymax, batch.grid_size) return (xgrid, ygrid)关键点解读网格单元左下角偏移一个grid_size即坐标点取的是每个栅格单元的中心位置而不是左下角本身xgrid/ygrid是 1 维数组长度分别为Nx与Ny代表所有网格点在经纬度坐标系下的坐标序列组合出经纬度范围后可用np.meshgrid生成覆盖南美洲的二维平面用于等值线contour绘图或作为预测评估的背景点。实战一用 One-Class SVM 建模物种分布密度生态观测只有正样本这一特性决定了官方示例 plot_species_distribution_modeling.py 采用OneClassSVM将问题转化为密度估计已知物种在某地被观测到建模哪些环境条件下该物种可能出现。完整建模流程如下from time import time import numpy as np import matplotlib.pyplot as plt from sklearn import metrics, svm from sklearn.datasets import fetch_species_distributions data fetch_species_distributions() xgrid, ygrid construct_grids(data) X, Y np.meshgrid(xgrid, ygrid[::-1]) # 提取某物种的观测点与其对应的 14 维环境特征 def create_species_bunch(species_name, train, test, coverages, xgrid, ygrid): bunch Bunch(name .join(species_name.split(_)[:2])) species_name species_name.encode(ascii) points dict(testtest, traintrain) for label, pts in points.items(): pts pts[pts[species] species_name] bunch[pts_%s % label] pts ix np.searchsorted(xgrid, pts[dd long]) iy np.searchsorted(ygrid, pts[dd lat]) bunch[cov_%s % label] coverages[:, -iy, ix].T return bunch BV_bunch create_species_bunch( bradypus_variegatus_0, data.train, data.test, data.coverages, xgrid, ygrid ) # 标准化特征 mean BV_bunch.cov_train.mean(axis0) std BV_bunch.cov_train.std(axis0) train_cover_std (BV_bunch.cov_train - mean) / std # 拟合 OneClassSVM clf svm.OneClassSVM(nu0.1, kernelrbf, gamma0.5) clf.fit(train_cover_std)步骤要点提取物种点用record array的species字段做等值过滤再用np.searchsorted把经纬度映射到网格索引从而取出每个观测点的 14 维环境特征coverages[:, -iy, ix]注意 y 轴方向取反特征标准化对训练用环境特征做 z-score 标准化消除 14 个变量量纲差异训练单类模型OneClassSVM(nu0.1, kernelrbf, gamma0.5)拟合物种可能出现的环境超球面。预测与评估利用土地掩膜与背景点计算 AUC预测时不需要对全部网格点打分——coverages[6]这一层记录的是所有陆地点的测量值见 plot_species_distribution_modeling.py -9999即表示陆地海洋直接置为无效值-9999land_reference data.coverages[6] Z np.ones((data.Ny, data.Nx), dtypenp.float64) idx (land_reference -9999).nonzero() coverages_land data.coverages[:, idx[0], idx[1]].T pred clf.decision_function((coverages_land - mean) / std) Z[idx[0], idx[1]] pred Z[land_reference -9999] -9999由于没有真实的负样本官方示例采用背景点 测试点策略评估模型在南美洲范围内随机采样 10000 个背景网格点作为伪负样本与物种测试点合并后计算 ROC 曲线与 AUC示例中np.random.seed(13)保证可复现。这是物种分布建模中常用的评估范式。实战二用核密度估计KDE可视化物种分布第二个官方示例 plot_species_kde.py 展示了纯可视化用法——不训练任何分类模型而是直接在经纬度球面坐标上对观测点做核密度估计观察物种的分布形态import numpy as np from sklearn.neighbors import KernelDensity from sklearn.datasets import fetch_species_distributions data fetch_species_distributions() Xtrain np.vstack([data[train][dd lat], data[train][dd long]]).T ytrain np.array( [d.decode(ascii).startswith(micro) for d in data[train][species]], dtypeint, ) Xtrain * np.pi / 180.0 # 经纬度转弧度 kde KernelDensity( bandwidth0.04, metrichaversine, kernelgaussian, algorithmball_tree ) kde.fit(Xtrain[ytrain 0])技术要点Haversine 度量经纬度是球面坐标直接用欧氏距离会失真示例使用metrichaversine计算球面大圆距离配合algorithmball_tree构建球面 Ball Tree是 scikit-learn 在 neighbors 模块中提供的经典地理空间方案坐标转换输入前须把经纬度从度转换为弧度乘以π/180掩膜评估与 One-Class SVM 示例相同只在陆地掩膜coverages[6] -9999覆盖的网格点上计算score_samples海洋区域填-9999避免在无意义的洋面上绘制密度该示例不做任何学习其定位与分类式示例互补二者引用的是同一份数据。参考资料与进一步阅读数据来源文献Phillips, Anderson Schapire, Maximum entropy modeling of species geographic distributions,Ecological Modelling, 190:231-259, 2006。该数据集即为文献中 Maxent 方法所用的样本与覆盖栅格_species_distributions.py中注明了原始数据出处用户指南真实世界数据集列表 中将fetch_species_distributions与其他大规模数据集加载函数并列介绍官方示例plot_species_distribution_modeling.py——One-Class SVM 密度建模 AUC 评估plot_species_kde.py——Haversine 球面核密度估计可视化源码实现sklearn/datasets/_species_distributions.py 中fetch_species_distributions的完整 docstring 自带 doctest 示例测试侧通过 sklearn/conftest.py 中的fetch_species_distributions_fxtfixture 复用加载逻辑并在 test_public_functions.py 中保证该函数属于公开 API。小结物种分布数据集是 scikit-learn 中形态非常特殊的一个真实世界数据集它不提供现成的data/target监督信号而是给出物种出现点坐标、环境栅格与网格几何参数让使用者自行组装密度图。理解coverages、train/test与Nx、Ny、x_left_lower_corner、y_left_lower_corner、grid_size这几个字段的含义以及construct_grids的网格中心换算规则是正确使用该数据集的前提。无论是用 One-Class SVM 做单类密度建模还是用 Haversine KDE 做球面分布可视化它都是练习仅正样本生态建模这一经典问题的理想数据载体。【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考