Введение
В этом практическом занятии мы научимся выбирать модель с использованием Гауссовых смесей (Gaussian Mixture Models, GMM) с использованием критериев теории информации. Выбор модели включает в себя как тип ковариации, так и количество компонентов в модели. Мы будем использовать критерий информационного качества Акаике (Akaike Information Criterion, AIC) и критерий Байеса (Bayes Information Criterion, BIC) для выбора наилучшей модели. Мы сгенерируем две компоненты путём случайного выборки из стандартного нормального распределения. Одна компонента остаётся сферической, но сдвинутой и перемасштабированной. Другая деформируется, чтобы иметь более общий матрицу ковариации.
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook, чтобы получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится. Валидация операций не может быть автоматизирована из-за ограничений в Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Генерация данных
Мы генерируем две компоненты (каждая из которых содержит n_samples), случайным образом выбирая из стандартного нормального распределения, возвращаемого функцией numpy.random.randn. Одна компонента остаётся сферической, но сдвинутой и перемасштабированной. Другая деформируется, чтобы иметь более общий матрицу ковариации.
import numpy as np
n_samples = 500
np.random.seed(0)
C = np.array([[0.0, -0.1], [1.7, 0.4]])
component_1 = np.dot(np.random.randn(n_samples, 2), C) ## general
component_2 = 0.7 * np.random.randn(n_samples, 2) + np.array([-4, 1]) ## spherical
X = np.concatenate([component_1, component_2])
Визуализация
Мы можем визуализировать разные компоненты с использованием Matplotlib.
import matplotlib.pyplot as plt
plt.scatter(component_1[:, 0], component_1[:, 1], s=0.8)
plt.scatter(component_2[:, 0], component_2[:, 1], s=0.8)
plt.title("Gaussian Mixture components")
plt.axis("equal")
plt.show()
Обучение и выбор модели
Мы изменяем количество компонентов от 1 до 6 и тип параметров ковариации для использования:
"full"(полный): каждая компонента имеет свою собственную общую матрицу ковариации."tied"(общий): все компоненты используют одну и ту же общую матрицу ковариации."diag"(диагональный): каждая компонента имеет свою собственную диагональную матрицу ковариации."spherical"(сферический): каждая компонента имеет свою собственную единичную дисперсию.
Мы оцениваем разные модели и выбираем наилучшую (с наим. значением BIC). Это делается с использованием GridSearchCV и пользовательской функции оценки, которая возвращает отрицательный показатель BIC. Лучшие параметры и оценщик сохраняются в best_parameters_ и best_estimator_ соответственно.
from sklearn.mixture import GaussianMixture
from sklearn.model_selection import GridSearchCV
def gmm_bic_score(estimator, X):
"""Callable to pass to GridSearchCV that will use the BIC score."""
## Make it negative since GridSearchCV expects a score to maximize
return -estimator.bic(X)
param_grid = {
"n_components": range(1, 7),
"covariance_type": ["spherical", "tied", "diag", "full"],
}
grid_search = GridSearchCV(
GaussianMixture(), param_grid=param_grid, scoring=gmm_bic_score
)
grid_search.fit(X)
Построение графиков показателей BIC
Мы создаём pandas.DataFrame на основе результатов кросс-валидации, выполненной сетевым поиском. Мы переворачиваем знак показателя BIC, чтобы показать эффект минимизации его. Мы используем seaborn для построения графиков показателей BIC.
import pandas as pd
import seaborn as sns
df = pd.DataFrame(grid_search.cv_results_)[
["param_n_components", "param_covariance_type", "mean_test_score"]
]
df["mean_test_score"] = -df["mean_test_score"]
df = df.rename(
columns={
"param_n_components": "Number of components",
"param_covariance_type": "Type of covariance",
"mean_test_score": "BIC score",
}
)
df.sort_values(by="BIC score").head()
sns.catplot(
data=df,
kind="bar",
x="Number of components",
y="BIC score",
hue="Type of covariance",
)
plt.show()
Построение графика для наилучшей модели
Мы строим эллипс, чтобы показать каждый гауссовский компонент выбранной модели. Для этого необходимо найти собственные значения матриц ковариации, возвращаемых атрибутом covariances_. Форма таких матриц зависит от covariance_type:
"full": (n_components,n_features,n_features)"tied": (n_features,n_features)"diag": (n_components,n_features)"spherical": (n_components,)
from matplotlib.patches import Ellipse
from scipy import linalg
color_iter = sns.color_palette("tab10", 2)[::-1]
Y_ = grid_search.predict(X)
fig, ax = plt.subplots()
for i, (mean, cov, color) in enumerate(
zip(
grid_search.best_estimator_.means_,
grid_search.best_estimator_.covariances_,
color_iter,
)
):
v, w = linalg.eigh(cov)
if not np.any(Y_ == i):
continue
plt.scatter(X[Y_ == i, 0], X[Y_ == i, 1], 0.8, color=color)
angle = np.arctan2(w[0][1], w[0][0])
angle = 180.0 * angle / np.pi ## convert to degrees
v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
ellipse = Ellipse(mean, v[0], v[1], angle=180.0 + angle, color=color)
ellipse.set_clip_box(fig.bbox)
ellipse.set_alpha(0.5)
ax.add_artist(ellipse)
plt.title(
f"Selected GMM: {grid_search.best_params_['covariance_type']} model, "
f"{grid_search.best_params_['n_components']} components"
)
plt.axis("equal")
plt.show()
Резюме
В этом практическом занятии мы узнали, как выполнять подбор модели с использованием гауссовских смесей (Gaussian Mixture Models, GMM) с использованием критериев теории информации. Мы использовали критерий информационного качества Акаике (Akaike Information Criterion, AIC) и критерий Байеса (Bayes Information Criterion, BIC) для выбора наилучшей модели. Мы сгенерировали два компонента путём случайного выборки из стандартного нормального распределения. Один компонент оставался сферическим, но был сдвинут и перемасштабирован. Второй был деформирован, чтобы иметь более общую матрицу ковариации. Мы визуализировали разные компоненты, обучили и выбрали наилучшую модель, построили графики показателей BIC и построили график для наилучшей модели.