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

Вы можете найти здесь первую часть (введение и математику): здесь

Вы можете найти здесь вторую часть (соответствие, диагностика проблемы и решение): здесь

Недообучение и переоснащение

Кратко обсудим важный момент. Недообучение и переоснащение.

Цель хорошей модели состоит в том, чтобы она могла хорошо обобщать, когда сталкивается с новыми данными. Эта способность позволяет вашей модели делать прогнозы на основе невидимых данных.

Недообучение – это когда модель не может точно отразить зависимости между зависимыми и независимыми переменными. В общем, это потому, что модель слишком проста или попала в локальный минимум. Как правило, вы замечаете низкий R2 с известными данными и плохие возможности для обобщения невидимых данных. Переоснащение наоборот, модель учится и адаптируется к обучающим данным и изучает зависимости между данными, а также некоторые случайные колебания. В общем, модель слишком сложная. Вы замечаете, что у него идеальный R2 с известными данными, но плохой с невидимыми данными. В частности, ваша модель слишком хорошо усваивает обучающие данные, но теряет способность к обобщению. На практике модель не только учится на данных, но и запоминает тренировочный набор.

Как вы можете видеть на рисунке ниже пример недообучения и переобучения. В этом случае это полиномиальная регрессия (где некоторые члены являются экспоненциальными), но концепция та же. Верхний левый — пример недообучения, верхний правый — возможно, лучший. В то время как два внизу являются более вероятными примерами переобучения.

Регрессия со штрафом: гребень, лассо и эластичная сетка

Итак, каково решение проблемы переобучения? Регуляризация. Давайте обсудим это! Концептуально регуляризация ограничивает набор параметров, чтобы модель не была сложной. Обычно это переводят на уменьшение коэффициентов. Интуитивно, если есть некоторый шум, эти точки данных будут дальше от других, и вам нужно увеличить свои веса, что приведет к переоснащению. Переобучение — это риск, когда у вас слишком много функций (а когда у вас много функций, вы не знаете, какие отбрасывать. Отбрасывание неправильных функций повлияет на производительность алгоритма). В частности, регуляризация наказывает коэффициенты с большими значениями, уменьшая сложность модели. Другими словами, мы меняем функцию потерь, чтобы включить дополнительные затраты на большие коэффициенты. Еще одна проблема, которую решает регуляризация, заключается в том, что если ваши коэффициенты слишком велики, модель становится более чувствительной к входным данным и нестабильной. В любом случае, помните, что добавление регуляризации уменьшает дисперсию, но за счет внесения некоторого смещения. Возможны два варианта регуляризации:

Регрессия гребня (называемая также штрафом L2) и эквивалентна квадрату величины коэффициентов.

Или также:

А если решить это уравнение в матричной записи:

Интересно, если вы помните уравнение смещения и дисперсии, которое становится:

С увеличением λ дисперсия уменьшается, но смещение увеличивается, что приводит к тому, что мы должны выбрать оптимальное значение λ.

Регрессия Лассо (называемая также штрафом L1) добавляет штрафной член, эквивалентный абсолютной величине коэффициентов. λ — штрафной член, константа, определяющая, насколько уменьшается вес. Входной набор данных имеет размерность m, поэтому штраф применяется ко всем весам.

Уравнение обычного наименьшего квадрата можно записать и таким образом:

По сути, мы пытаемся минимизировать разницу между зависимой переменной и произведением x на его вес. Тогда уравнение регрессии лассо также можно переписать так:

Некоторые соображения по поводу двух методов:

  • Вы должны масштабировать свои входные данные перед использованием регуляризации. В гребне масштабирование регрессии гарантирует, что штраф действует одинаково на каждый коэффициент. Масштабирование с помощью z-оценки гарантирует, что стандартное отклонение равно 1 для каждого входа. Стандартное отклонение влияет на штраф.
  • Ридж уменьшает коэффициент до нуля, но, не будучи на самом деле равным нулю, Лассо способствует разреженности. Используя Lasso, многие коэффициенты будут уменьшены до нуля, что позволит вам выбирать функции.
  • Если есть две или более сильно коллинеарных переменных, Лассо выбирает одну из них случайным образом (что не очень хорошо для интерпретации данных).
  • В общем, используйте Ridge, когда у вас мало предикторов (мало признаков) и вы уверены, что все они важны.
  • Как правило, чем выше коэффициент штрафа, тем выше штраф.
  • Ридж работает лучше, когда грузы имеют одинаковые размеры.
  • Эти два метода решают коллинеарность по-разному: Ридж приводит коэффициенты коррелированных предикторов к сходству, в то время как в Лассо один из коррелированных предикторов имеет больший коэффициент, а другие обнуляются.

На рисунке ниже показано, что происходит при использовании разных значений лямбда для разных коэффициентов (бета). Как видите, Ридж уменьшает коэффициент, увеличивая λ, но на самом деле он не становится равным нулю, в то время как Лассо уменьшает до нуля различные коэффициенты.

Что, если мы объединим эти два метода? Эластичная сеть! Эластичная сеть работает с комбинацией пенализации L2 и L1, и формула такова:

Интересно, что вы можете использовать λ для выбора силы наказания. Где ноль означает отсутствие штрафов, 1 означает полный штраф, а ноль в основном равен простой линейной регрессии. Часто используется очень меньшее значение λ (например, 0,001). Чтобы понять, как работает λ:

Эластичный чистый убыток = убыток + (λ * elastic_net_penalty)

Вы также можете выбрать параметр α, который управляет соотношением между штрафами l1 и l2 (где α = 0 соответствует регрессии Риджа, а α = 1 соответствует регрессии Лассо). При промежуточном значении α некоторые коэффициенты уменьшаются, а некоторые становятся равными нулю. Чтобы понять, как работает альфа:

Эластичный чистый штраф = (α * l1_penalty) + ((1 — α) * l2_penalty)

Одно соображение:

  • Вы можете контролировать баланс двух типов штрафов, что в некоторых случаях обычно приводит к повышению производительности.

Теперь мы увидим это на практике с нашим набором данных.

from sklearn.linear_model import Ridge
model = Ridge(alpha = 0.05)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
print('coefficient of determination:', model.score(X_test, y_test))

и для лассо:

from sklearn.linear_model import Lasso
model = Lasso(alpha = 0.05)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
print('coefficient of determination:', model.score(X_test, y_test))

Мы говорим перед тем, что Лассо сводит к нулю коэффициенты, вы можете видеть, сколько коэффициентов теперь отличны от нуля

coefs = model.coef_.flatten()
names = X_train.columns
genes = list(zip(names, coefs))
feature =pd.DataFrame(genes, columns = ["genes", "coefs"])
feature0 = feature.loc[(feature!=0).any(axis=1)]
feature0 = feature[(feature != 0).all(1)]
feature0.shape, feature.shape

Затем мы можем построить коэффициенты.

coefs =feature0.sort_values(by=['coefs'])
plt.figure(figsize=(20, 15))
g = sns.barplot(x="genes", y="coefs", data=coefs, color= "lightblue")
g.figsize=(16,10)
plt.xticks(rotation=45)

Используя цикл, мы можем изменить штраф и посмотреть, сколько коэффициентов все еще не равно нулю, мы также можем распечатать коэффициент детерминации, чтобы увидеть, какая модель является лучшей.

y = [0.5, 0.1, 0.05, 0.01, 0.005, 0.001]
for i in y:
    model = Lasso(alpha = i, max_iter = 10000)
    model.fit(X_train, y_train)
    coefs = model.coef_.flatten()
    names = X_train.columns
    genes = list(zip(names, coefs))
    x = "coef" + "_lr1_" + str(i)
    feature1 =pd.DataFrame(genes, columns = ["genes", x])
    feature = pd.merge(feature, feature1, 
              left_on='genes',right_on='genes',how='outer')
    feature0 = feature1[(feature1 != 0).all(1)]
    print(model.alpha), print(feature0.shape)
    print('coefficient of determination:', model.score(X_test,
           y_test))

Теперь давайте посмотрим на эластичную сеть:

from sklearn.linear_model import ElasticNet
model = ElasticNet(alpha=0.5, l1_ratio=0.5)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
print('coefficient of determination:', model.score(X_test, y_test))

мы можем оценить модель, используя перекрестную проверку и сообщив среднее значение среднего абсолютного значения.

Перекрестная проверка — это процедура, которую с помощью повторной выборки вы используете для оценки модели машинного обучения с ограниченной выборкой данных. Существует только один параметр, который необходимо учитывать, k, который определяет количество раз, когда выборка данных разбивается (обычно k = 10). Процедура начинает случайным образом перемешивать набор данных, а затем разбивать его на разные группы (количество групп равно k). Для каждой уникальной группы группа сохраняется в качестве тестового набора, а оставшаяся группа является обучающим набором. Затем он подбирает модель в тренировочном наборе, оценивает оценку и отбрасывает модель. После того, как группы выбраны, они не меняются, а это означает, что каждое наблюдение используется для обучения моделей k-1. Как правило, вы суммируете со средним значением и стандартным отклонением оценку, полученную для k моделей.

Учтите, что из-за стохастичности алгоритма (в эластичной сети используется стохастический градиентный спуск) результаты немного меняются при каждом прогоне.

from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold
from sklearn.linear_model import ElasticNet
from numpy import absolute
X = df.drop("MYC", 1)
y = df["MYC"]
# define model
model = ElasticNet(alpha=0.5, l1_ratio=0.5)
# define model evaluation method
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate model
scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)
# force scores to be positive
scores = absolute(scores)
np.mean(scores), np.std(scores)

До сих пор мы просто случайным образом выбирали гиперпараметры (альфа, l1_ratio). Мы не знаем, является ли это лучшей комбинацией. Мы будем использовать поиск по сетке. Различные комбинации будут запускаться в сочетании с перекрестной проверкой. Мы используем подмножество, потому что это довольно затратно в вычислительном отношении.

from numpy import arange
from pandas import read_csv
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RepeatedKFold
from sklearn.linear_model import ElasticNet
# define model
model = ElasticNet()
# define model evaluation method
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# define grid
grid = dict()
grid['alpha'] = [1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 0.0, 1.0, 10.0, 100.0]
grid['l1_ratio'] = arange(0, 1, 0.01)
# define search
search = GridSearchCV(model, grid, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)
# perform the search
results = search.fit(X.iloc[:, 0:100], y)
# summarize
print('MAE: %.3f' % results.best_score_)
print('Config: %s' % results.best_params_)

Давайте попробуем эти параметры и построим график.

from sklearn.linear_model import ElasticNet
model = ElasticNet(alpha=0.01, l1_ratio=0.03)
model.fit(X_train.iloc[:, 0:100], y_train)
y_pred = model.predict(X_test.iloc[:, 0:100])
x_ax = range(len(X_test))
plt.figure(figsize=(15, 5))
plt.scatter(x_ax, y_test, color = "blue", label ="real")
plt.plot(x_ax, y_pred, color = "red", label ="prediction")
plt.legend()
plt.show()

Похоже ли это на колебания эластика?

Это была последняя часть урока.

Другие ресурсы

Об открытии регрессии: здесь

Стохастический градиентный спуск: здесь

по расчету смещения и дисперсии: здесь

по регуляризации: здесь

о допущениях и графиках регрессии: здесь

про разбор сюжета: тут

учебник по полиномиальной регрессии: здесь

о мультиколлинеарности: здесь

по выбору модели с помощью АИК и БИК: здесь

о дистанции Кука: здесь

о регрессии Риджа и Лассо: здесь

другой источник о регрессии Риджа и Лассо: здесь

про эластичную сетку: здесь

на k-кратной перекрестной проверке: здесь

Библиография

1. Sidey-Gibbons JAM, Sidey-Gibbons CJ. Машинное обучение в медицине: практическое введение. Методология медицинских исследований BMC (2019 г.) 19: 64. дои: 10.1186 / с 12874–019–0681–4

2. Эстева А., Купрель Б., Новоа Р.А., Ко Дж., Светтер С.М., Блау Х.М., Трун С. Классификация рака кожи на уровне дерматологов с глубокими нейронными сетями. Природа (2017) 542: 115–118. дои: 10.1038 / природа21056

3. Warnat-Herresthal S, Perrakis K, Taschler B, Becker M, Baßler K, Beyer M, Günther P, Schulte-Schrepping J, Seep L, Klee K, et al. Масштабируемое прогнозирование острого миелоидного лейкоза с использованием многомерного машинного обучения и транскриптомики крови. iScience (2019) 23: doi:10.1016/j.isci.2019.100780

4. Wang C, Zhang J, Yin J, Gan Y, Xu S, Gu Y, Huang W. Альтернативные подходы к нацеливанию Myc для лечения рака. Signal Transduct Target Ther (2021) 6:117. doi: 10.1038 / s41392–021–00500-y

5. Wang C, Fang H, Zhang J, Gu Y. Нацеливание на «нелекарственный» белок c-Myc с помощью синтетической летальности. Front Med (2021) doi:10.1007/s11684–020–0780-y

6. Carter JL, Hege K, Yang J, Kalpage HA, Su Y, Edwards H, Hüttemann M, Taub JW, Ge Y. Ориентация на несколько сигнальных путей: новый подход к терапии острого миелоидного лейкоза. Signal Transduct Target Ther (2020) 5:288. doi: 10.1038/s41392–020–00361-x

7. Бенетатос Л., Бенетатоу А., Вартоломатос Г. Длинные некодирующие РНК и ассоциация MYC при гематологических злокачественных новообразованиях. Энн Хематол (2020) 99: 2231–2242. doi: 10.1007 / s00277–020–04166–4

8. Бернхэм К.П., Андерсон Д.Р. Выбор модели и мультимодельный вывод: практический информационно-теоретический подход. Springer Science & Business Media (2003).