Реализация квадратичной функции риска для классификаторов sklearn, регрессоров и keras/tensorflow
Привет, что случилось? дела идут отлично? надеюсь на это.
как в старые добрые времена, сегодня мы обсудим кое-что новое!.
Что нового?
— — — — — — Компромисс дисперсии смещения, может быть, вы думаете, что это старая вещь, но применяли ли вы ее когда-нибудь в своем реальном случае использования мл?
90% нет. мы просто прочитали теорию вот и все. Это не сработает! Давайте изучим эту классную функцию, которая выделит нас впереди других :)
Небольшой обзор: компромисс между погрешностью и дисперсией
Вики: В статистике и машинном обучении компромисс между смещением и дисперсией — это свойство модели, при котором дисперсия параметра оценивается по выборкам. можно уменьшить, увеличив смещение в оценочных параметрах. Дилемма отклонения-отклонения или проблема отклонения-отклонения — это конфликт в попытках одновременно минимизировать эти два источника ошибки, которые не позволяют алгоритмам обучения с учителем обобщаться за пределы их возможностей. тренировочный набор: [1][2]
- Ошибка предвзятость — это ошибка из-за ошибочных предположений в алгоритме обучения. Высокое смещение может привести к тому, что алгоритм упустит соответствующие отношения между функциями и целевыми выходными данными (недообучение).
- Дисперсия — это ошибка чувствительности к небольшим колебаниям обучающей выборки. Высокая дисперсия может быть результатом алгоритма, моделирующего случайный шум в обучающих данных (переобучение).
Чтобы использовать более формальные термины для смещения и дисперсии, предположим, что у нас есть точечная оценка θ ^ (тета-шляпа) некоторого параметра или функции θ. Затем смещение обычно определяется как разница между ожидаемым значением оценщика и параметром, который мы хотим оценить:
Смещение = E[θ^]-θ. Смещение = E[θ^]-θ.
Если смещение больше нуля, мы также говорим, что оценщик имеет положительное смещение, если смещение меньше нуля, оценщик имеет отрицательное смещение, а если смещение равно нулю, то оценщик является несмещенным. Точно так же мы определяем дисперсию как разницу между математическим ожиданием, возведенным в квадрат, и квадратным математическим ожиданием, полученным оценщиком:
Var(θ^)=E[θ²]−(E[θ^])2.Var(θ^)=E[θ²]−(E[θ^])2.
Обратите внимание, что в контексте этой лекции будет удобнее записать дисперсию в ее альтернативной форме:
Var(θ^)=E[(E[θ^]−θ^)2].
Слышали о MSE? конечно у вас было! что за глупый вопрос
MSE — это функция риска, соответствующая ожидаемому значению квадрата потерь из-за ошибки. Тот факт, что MSE почти всегда строго положительный (а не нулевой), объясняется случайностью или тем, что оценщик не учитывает информацию, которая могла бы дать более точную оценку.
MSE может относиться к эмпирическому риску (средняя потеря в наблюдаемом наборе данных) как к оценке истинной MSE (истинный риск: средняя потеря на фактическом Распределение населения)
MSE является вторым моментом (о происхождении) ошибки и, таким образом, включает в себя как дисперсию оценщика (насколько широко разбросаны оценки от одной выборки данных к другой), так и ее смещение (насколько далеко от среднего оценочного значения). от истинного значения)
Для несмещенной оценки MSE – это дисперсия оценки. Как и дисперсия, MSE имеет те же единицы измерения, что и квадрат оцениваемой величины.
более подробная информация: https://en.wikipedia.org/wiki/Mean_squared_error
Мы пропустим теорию, есть тонны информации и статей по этому поводу. Нам больше интересно посмотреть, как применять наши модели машинного обучения.
Простые слова: квадратичный риск = дисперсия + погрешность²
Давайте начнем!
Разложение смещения-дисперсии потерь 0–1
Обратите внимание, что разложение потерь 0–1 на компоненты смещения и дисперсии не так просто, как для квадратичных потерь ошибок. Процитируем Педро Домингоса, известного исследователя машинного обучения и профессора Вашингтонского университета:
«Несколько авторов предложили разложение смещения-дисперсии, связанное с потерей ноль-единица (Kong & Dietterich, 1995; Breiman, 1996b; Kohavi & Wolpert, 1996; Tibshirani, 1996; Friedman, 1997). Однако каждое из этих разложений имеет существенные недостатки».
Напомним, что потеря 0–1, LL, равна 0, если метка класса предсказана правильно, и единице в противном случае.
Пример 1. Декомпозиция дисперсии смещения классификатора дерева решений
from mlxtend.evaluate import bias_variance_decomp from sklearn.tree import DecisionTreeClassifier from mlxtend.data import iris_data from sklearn.model_selection import train_test_split
X, y = iris_data() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123, shuffle=True, stratify=y)
tree = DecisionTreeClassifier(random_state=123)
avg_expected_loss, avg_bias, avg_var = bias_variance_decomp( tree, X_train, y_train, X_test, y_test, loss='0-1_loss', random_seed=123)
print('Average expected loss: %.3f' % avg_expected_loss) print('Average bias: %.3f' % avg_bias) print('Average variance: %.3f' % avg_var)
Для сравнения, декомпозиция смещения-дисперсии классификатора пакетов, который интуитивно должен иметь более низкую дисперсию по сравнению с одним деревом решений:
from sklearn.ensemble import BaggingClassifier
tree = DecisionTreeClassifier(random_state=123) bag = BaggingClassifier(base_estimator=tree, n_estimators=100, random_state=123)
avg_expected_loss, avg_bias, avg_var = bias_variance_decomp( bag, X_train, y_train, X_test, y_test, loss='0-1_loss', random_seed=123)
print('Average expected loss: %.3f' % avg_expected_loss) print('Average bias: %.3f' % avg_bias) print('Average variance: %.3f' % avg_var)
Пример 2. Декомпозиция дисперсии смещения регрессора дерева решений
from mlxtend.evaluate import bias_variance_decomp from sklearn.tree import DecisionTreeRegressor from mlxtend.data import boston_housing_data from sklearn.model_selection import train_test_split
X, y = boston_housing_data() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123, shuffle=True)
tree = DecisionTreeRegressor(random_state=123)
avg_expected_loss, avg_bias, avg_var = bias_variance_decomp( tree, X_train, y_train, X_test, y_test, loss='mse', random_seed=123)
print('Average expected loss: %.3f' % avg_expected_loss) print('Average bias: %.3f' % avg_bias) print('Average variance: %.3f' % avg_var)
Для сравнения ниже показано разложение по смещению и дисперсии регрессора бэггинга, которое интуитивно должно иметь меньшую дисперсию, чем одно дерево решений:
from sklearn.ensemble import BaggingRegressor
tree = DecisionTreeRegressor(random_state=123) bag = BaggingRegressor(base_estimator=tree, n_estimators=100, random_state=123)
avg_expected_loss, avg_bias, avg_var = bias_variance_decomp( bag, X_train, y_train, X_test, y_test, loss='mse', random_seed=123)
print('Average expected loss: %.3f' % avg_expected_loss) print('Average bias: %.3f' % avg_bias) print('Average variance: %.3f' % avg_var)
Пример 3 — Поддержка TensorFlow/Keras
Начиная с версии mlxtend v0.18.0, bias_variance_decomp
теперь поддерживает модели Keras. Обратите внимание, что исходная модель сбрасывается в каждом раунде (перед ее повторной подгонкой к образцам начальной загрузки).
from mlxtend.evaluate import bias_variance_decomp from mlxtend.data import boston_housing_data from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import tensorflow as tf import numpy as np
np.random.seed(1) tf.random.set_seed(1)
X, y = boston_housing_data() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123, shuffle=True)
model = tf.keras.Sequential([ tf.keras.layers.Dense(32, activation=tf.nn.relu), tf.keras.layers.Dense(1) ])
optimizer = tf.keras.optimizers.Adam() model.compile(loss='mean_squared_error', optimizer=optimizer)
model.fit(X_train, y_train, epochs=100, verbose=0)
mean_squared_error(model.predict(X_test), y_test)
32.69300595184836
Обратите внимание, что настоятельно рекомендуется использовать то же количество тренировочных эпох, которое вы использовали бы в исходном тренировочном наборе, чтобы обеспечить сходимость:
np.random.seed(1) tf.random.set_seed(1)
avg_expected_loss, avg_bias, avg_var = bias_variance_decomp( model, X_train, y_train, X_test, y_test, loss='mse', num_rounds=100, random_seed=123, epochs=200, # fit_param verbose=0) # fit_param
print('Average expected loss: %.3f' % avg_expected_loss) print('Average bias: %.3f' % avg_bias) print('Average variance: %.3f' % avg_var)
Repo:http://rasbt.github.io/mlxtend/user_guide/evaluate/bias_variance_decomp/
Ну вот и все!
Tспасибо команде mlxtend и мне тоже? за то, что рассказал вам об этом?
Я надеюсь, что вы найдете эту статью полезной для ваших случаев машинного обучения и статистики. Точно так же я постараюсь найти новые пути под девизом «любопытство ведет к инновациям» :)
Ознакомьтесь с реализацией kaggle: https://www.kaggle.com/code/rupakroy/bias-variance-decomposition
Еще раз спасибо за уделенное время. Если вам понравилась эта короткая статья, в моем среднем репозитории есть множество тем по расширенной аналитике, науке о данных и машинному обучению. https://medium.com/@bobrupakroy
Некоторыми из моих альтернативных интернет-присутствий являются Facebook, Instagram, Udemy, Blogger, Issuu, Slideshare, Scribd и другие.
Также доступно на Quora @ https://www.quora.com/profile/Rupak-Bob-Roy
Дайте мне знать, если вам нужно что-нибудь. Говорите Скоро.