Кросс-валидация с линейными моделями

Beginner

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

Введение

В этом практическом занятии мы будем использовать кросс-валидацию с линейными моделями. Мы будем использовать датасет о диабете и применять GridSearchCV для нахождения наилучшего значения альфа для регрессии Lasso. Затем мы построим графики ошибок и используем LassoCV, чтобы понять, насколько можно доверять выбору альфа.

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

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

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

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

Загрузка и подготовка датасета

Сначала мы загрузим и подготовим датасет о диабете. Для этого упражнения мы будем использовать только первые 150 образцов.

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets

X, y = datasets.load_diabetes(return_X_y=True)
X = X[:150]
y = y[:150]

Применение GridSearchCV

Далее мы применим GridSearchCV, чтобы найти наилучшее значение альфа для регрессии Lasso. Мы будем использовать диапазон значений альфа от 10^-4 до 10^-0.5 с 30 значениями между ними. Мы будем использовать 5 фолдов для кросс-валидации.

from sklearn.linear_model import Lasso
from sklearn.model_selection import GridSearchCV

lasso = Lasso(random_state=0, max_iter=10000)
alphas = np.logspace(-4, -0.5, 30)

tuned_parameters = [{"alpha": alphas}]
n_folds = 5

clf = GridSearchCV(lasso, tuned_parameters, cv=n_folds, refit=False)
clf.fit(X, y)

Построение графиков ошибок

Теперь мы построим графики ошибок, чтобы увидеть наилучшее значение альфа. Мы построим средние значения тестовых оценок и стандартные ошибки этих оценок.

scores = clf.cv_results_["mean_test_score"]
scores_std = clf.cv_results_["std_test_score"]

plt.figure().set_size_inches(8, 6)
plt.semilogx(alphas, scores)

std_error = scores_std / np.sqrt(n_folds)

plt.semilogx(alphas, scores + std_error, "b--")
plt.semilogx(alphas, scores - std_error, "b--")

plt.fill_between(alphas, scores + std_error, scores - std_error, alpha=0.2)

plt.ylabel("CV score +/- std error")
plt.xlabel("alpha")
plt.axhline(np.max(scores), linestyle="--", color=".5")
plt.xlim([alphas[0], alphas[-1]])

Использование LassoCV для проверки выбора альфа

Наконец, мы будем использовать LassoCV, чтобы понять, насколько можно доверять выбору альфа. Мы будем использовать KFold с 3 фолдами.

from sklearn.linear_model import LassoCV
from sklearn.model_selection import KFold

lasso_cv = LassoCV(alphas=alphas, random_state=0, max_iter=10000)
k_fold = KFold(3)

print("Answer to the bonus question:", "how much can you trust the selection of alpha?")
print()
print("Alpha parameters maximising the generalization score on different")
print("subsets of the data:")
for k, (train, test) in enumerate(k_fold.split(X, y)):
    lasso_cv.fit(X[train], y[train])
    print(
        "[fold {0}] alpha: {1:.5f}, score: {2:.5f}".format(
            k, lasso_cv.alpha_, lasso_cv.score(X[test], y[test])
        )
    )

print()
print("Answer: Not very much since we obtained different alphas for different")
print("subsets of the data and moreover, the scores for these alphas differ")
print("quite substantially.")

Резюме

В этом практическом занятии мы узнали, как использовать кросс-валидацию с линейными моделями. Мы использовали GridSearchCV, чтобы найти наилучшее значение альфа для регрессии Lasso, и построили графики ошибок, чтобы визуализировать выбор. Мы также использовали LassoCV, чтобы проверить выбор альфа.