物种分布建模

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习如何使用机器学习对物种的地理分布进行建模。这是保护生物学中的一个重要问题,因为它有助于我们了解不同物种的分布情况,并设计有效的保护策略。我们将使用一个包含两种南美哺乳动物的数据集,其中有过去的观测数据以及14个环境变量。我们将使用scikit-learn库中的OneClassSVM算法对这两个物种的地理分布进行建模。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向Labby提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/UtilitiesandDatasetsGroup -.-> sklearn/utils("Utilities") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/utils -.-> lab-49298{{"物种分布建模"}} sklearn/datasets -.-> lab-49298{{"物种分布建模"}} ml/sklearn -.-> lab-49298{{"物种分布建模"}} end

导入库

在这一步中,我们将导入分析所需的库。我们将导入用于机器学习的scikit-learn库、用于数值计算的numpy库以及用于可视化的matplotlib库。

from time import time

import numpy as np
import matplotlib.pyplot as plt

from sklearn.utils import Bunch
from sklearn.datasets import fetch_species_distributions
from sklearn import svm, metrics

加载数据

在这一步中,我们将从scikit-learn库中加载数据。我们将使用fetch_species_distributions函数来加载包含两种南美哺乳动物过去观测数据以及14个环境变量的数据。

## 加载压缩数据
data = fetch_species_distributions()

构建地图网格

在这一步中,我们将根据数据对象构建地图网格。我们将创建一个名为construct_grids的函数,该函数以数据对象作为输入,并返回xgrid和ygrid。

def construct_grids(batch):
    """从批次对象构建地图网格

    参数
    ----------
    batch : 批次对象
        fetch_species_distributions返回的对象

    返回
    -------
    (xgrid, ygrid) : 一维数组
        与batch.coverages中的值相对应的网格
    """
    ## 角点单元格的x、y坐标
    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坐标
    xgrid = np.arange(xmin, xmax, batch.grid_size)
    ## 网格单元格的y坐标
    ygrid = np.arange(ymin, ymax, batch.grid_size)

    return (xgrid, ygrid)

## 构建地图网格
xgrid, ygrid = construct_grids(data)

创建物种集合物

在这一步中,我们将创建一个包含特定生物体信息的集合物。我们将创建一个名为create_species_bunch的函数,该函数以物种名称、训练集、测试集、覆盖范围、x网格和y网格作为输入,并返回一个集合物对象。

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(test=test, train=train)

    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
)
MM_bunch = create_species_bunch(
    "microryzomys_minutus_0", data.train, data.test, data.coverages, xgrid, ygrid
)

拟合单类支持向量机(OneClassSVM)

在这一步中,我们将把单类支持向量机(OneClassSVM)模型拟合到训练数据上。我们将对特征进行标准化处理,然后将OneClassSVM模型拟合到训练数据上。

## 标准化特征
mean = BV_bunch.cov_train.mean(axis=0)
std = BV_bunch.cov_train.std(axis=0)
train_cover_std = (BV_bunch.cov_train - mean) / std

## 拟合OneClassSVM
clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.5)
clf.fit(train_cover_std)

预测物种分布

在这一步中,我们将使用单类支持向量机(OneClassSVM)模型预测物种分布。我们将使用训练数据预测物种分布并绘制结果。

## 使用训练数据预测物种分布
Z = np.ones((data.Ny, data.Nx), dtype=np.float64)

## 我们仅对陆地点进行预测。
idx = np.where(data.coverages[6] > -9999)
coverages_land = data.coverages[:, idx[0], idx[1]].T

pred = clf.decision_function((coverages_land - mean) / std)
Z *= pred.min()
Z[idx[0], idx[1]] = pred

levels = np.linspace(Z.min(), Z.max(), 25)
Z[data.coverages[6] == -9999] = -9999

## 绘制预测的等高线
plt.contourf(X, Y, Z, levels=levels, cmap=plt.cm.Reds)
plt.colorbar(format="%.2f")

## 绘制训练/测试点的散点图
plt.scatter(
    BV_bunch.pts_train["dd long"],
    BV_bunch.pts_train["dd lat"],
    s=2**2,
    c="black",
    marker="^",
    label="train",
)
plt.scatter(
    BV_bunch.pts_test["dd long"],
    BV_bunch.pts_test["dd lat"],
    s=2**2,
    c="black",
    marker="x",
    label="test",
)
plt.legend()
plt.title(BV_bunch.name)
plt.axis("equal")

计算AUC

在这一步中,我们将计算相对于背景点的ROC曲线下面积(AUC)。我们将使用测试数据和背景点预测物种分布,并计算AUC。

## 计算相对于背景点的AUC
background_points = np.c_[
    np.random.randint(low=0, high=data.Ny, size=10000),
    np.random.randint(low=0, high=data.Nx, size=10000),
].T

pred_background = Z[background_points[0], background_points[1]]
pred_test = clf.decision_function((BV_bunch.cov_test - mean) / std)
scores = np.r_[pred_test, pred_background]
y = np.r_[np.ones(pred_test.shape), np.zeros(pred_background.shape)]
fpr, tpr, thresholds = metrics.roc_curve(y, scores)
roc_auc = metrics.auc(fpr, tpr)
plt.text(-35, -70, "AUC: %.3f" % roc_auc, ha="right")
print("\n ROC曲线下面积 : %f" % roc_auc)

绘制物种分布

在这一步中,我们将使用我们创建的函数和模型来绘制两个物种的物种分布。

## 绘制物种分布
plot_species_distribution()
plt.show()

总结

在这个实验中,我们学习了如何使用机器学习对物种的地理分布进行建模。我们使用了scikit-learn库中的单类支持向量机(OneClassSVM)算法,根据过去的观测数据和14个环境变量,对两种南美哺乳动物的地理分布进行建模。我们还学习了如何绘制物种分布,并计算ROC曲线下的面积,以评估我们模型的性能。