Моделирование распределения видов

Beginner

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

Введение

В этом лабораторном занятии мы научимся моделировать географическое распространение видов с использованием машинного обучения. Это важная задача в биологии охраны, так как помогает нам понять распределение различных видов и разработать эффективные стратегии охраны. Мы будем использовать набор данных о двух южноамериканских млекопитающих, имея предыдущие наблюдения и 14 переменных окружающей среды. Мы будем использовать алгоритм OneClassSVM из библиотеки scikit-learn для моделирования географического распределения этих двух видов.

Советы по использованию ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук, чтобы получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений в Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импорт библиотек

В этом шаге мы импортируем необходимые библиотеки для нашего анализа. Мы импортируем библиотеку 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 переменных окружающей среды.

## Load the compressed data
data = fetch_species_distributions()

Построение сетки карты

В этом шаге мы построим сетку карты из объекта данных. Мы создадим функцию construct_grids, которая принимает объект данных в качестве входных данных и возвращает xgrid и ygrid.

def construct_grids(batch):
    """Construct the map grid from the batch object

    Parameters
    ----------
    batch : Batch object
        The object returned by fetch_species_distributions

    Returns
    -------
    (xgrid, ygrid) : 1-D arrays
        The grid corresponding to the values in batch.coverages
    """
    ## 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)

## Construct the map grid
xgrid, ygrid = construct_grids(data)

Создание бичука с информацией о видах

В этом шаге мы создадим бичук с информацией о конкретном организме. Мы создадим функцию create_species_bunch, которая принимает название вида, тренировочные и тестовые данные, покрытия, xgrid и ygrid в качестве входных данных и возвращает объект бичука.

def create_species_bunch(species_name, train, test, coverages, xgrid, ygrid):
    """Create a bunch with information about a particular organism

    This will use the test/train record arrays to extract the
    data specific to the given species name.
    """
    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():
        ## choose points associated with the desired species
        pts = pts[pts["species"] == species_name]
        bunch["pts_%s" % label] = pts

        ## determine coverage values for each of the training & testing points
        ix = np.searchsorted(xgrid, pts["dd long"])
        iy = np.searchsorted(ygrid, pts["dd lat"])
        bunch["cov_%s" % label] = coverages[:, -iy, ix].T

    return bunch

## Create species 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 на тренировочные данные.

## Standardize features
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

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

Предсказание распределения видов

В этом шаге мы будем предсказывать распределение видов с использованием модели OneClassSVM. Мы будем предсказывать распределение видов с использованием тренировочных данных и построить результаты.

## Predict species distribution using the training data
Z = np.ones((data.Ny, data.Nx), dtype=np.float64)

## We'll predict only for the land points.
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

## plot contours of the prediction
plt.contourf(X, Y, Z, levels=levels, cmap=plt.cm.Reds)
plt.colorbar(format="%.2f")

## scatter training/testing points
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")

Вычисление площади под ROC-кривой (AUC)

В этом шаге мы вычислим площадь под ROC-кривой (AUC) по отношению к точкам фона. Мы будем предсказывать распределение видов с использованием тестовых данных и точек фона, и вычислять AUC.

## Compute AUC with regards to background points
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 Area under the ROC curve : %f" % roc_auc)

Построение分布图 вида

В этом шаге мы построим分布图 вида для обоих видов с использованием функций и моделей, которые мы создали.

## Plot species distribution
plot_species_distribution()
plt.show()

Резюме

В этом практическом занятии мы научились моделировать географическое распределение видов с использованием машинного обучения. Мы использовали алгоритм OneClassSVM из библиотеки scikit - learn для моделирования географического распределения двух южноамериканских млекопитающих на основе прошлых наблюдений и 14 переменных окружающей среды. Мы также научились строить分布图 вида и вычислять площадь под ROC - кривой для оценки эффективности нашей модели.