Перспективы ваших разделов данных

Разделение данных и призрак в машине

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

Использовать Python для разделения данных очень просто с помощью функции train_test_split в scikit-learn. Помимо указания размера обучающей выборки (или тестовой выборки) и, если это проблема классификации, вам больше всего нужно стратифицировать переменную ответа. Осталось только установить значение random_state, которое случайным образом определяет, какие строки идут на обучение, а какие - на тестирование.

Раньше для случайных начальных значений я использовал:

  1. 42 (дань уважения Дугласу Адамсу)
  2. 451 (Рэй Брэдбери)
  3. 2001, 2010 и 2061 гг. (Артур Кларк)
  4. 314159 (только в день Пи)
  5. Мое наиболее частое случайное семя = 1

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

В нашей машине (обучении) есть призрак, и он называется дисперсией.

Смещение и отклонение

Но прежде чем мы наденем наши протонные пакеты охотников за привидениями, чтобы справиться с этим призраком, давайте рассмотрим математические основы предвзятости и дисперсии, чтобы найти путь вперед. Ожидаемое остаточное значение, обычно выражаемое как среднеквадратичная ошибка, на тестовых данных для данного значения случайной величины X может быть разложено на три элемента: 1) дисперсия, 2) квадрат смещения и 3) дисперсия остатков. (Джеймс, Виттен, Хасти и Тибширани, 2013 г.). См. Рисунок 1 для получения более подробной информации.

Дисперсия, которая сама по себе является случайной функцией, добавляет степень неопределенности к каждой модели прогнозирования независимо от алгоритма обучения, и мы можем использовать эту случайность для построения более надежных моделей. Чтобы сделать такой скачок, давайте рассмотрим другое уравнение, объясняющее дисперсию (Abu-Mostafa, Magdon-Ismail, & Lin, 2012). См. Рисунок 2 для получения более подробной информации:

В этой концептуализации ожидаемое остаточное значение случайной величины X в бесконечном количестве наборов данных, на которые действует обучающая модель «g», требует вычитания оценочного прогноза из среднего всех оцененных значений, и в этом заключается наше решение!

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

Но в первую очередь это был концептуальный инструмент, поскольку он предполагал, что ожидаемые остатки собираются путем многократной оценки функции обучения по бесконечному количеству наборов данных и для каждого случайного X. Но есть другой способ использовать эту концепцию, путем моделирования множество наборов данных, которые представляют собой случайные отклонения одного и того же набора данных. Построив соотношение точность теста / точность обучения в качестве метрики и повторяя случайное начальное значение разделения поезд / тест, мы можем визуализировать нестабильность модели обучения ( Abu-Mostafa et al., 2012), поскольку они относятся к конкретному набору данных; это местный способ проверки дисперсии. То, что было чисто теоретической концепцией, может стать новым важным шагом в шаблоне для бизнес-аналитического моделирования.

Определение среднего отклонения

Дисперсия зависит от модели и содержит как уменьшаемую, так и неснижаемую ошибку, поэтому при любой попытке визуализировать эту случайную функцию следует использовать предполагаемый алгоритм моделирования. На рисунке 3 показаны среднее значение дисперсии и график для 200 итераций набора данных двоичной классификации IBM HR Analytics Employee Attrition & Performance с перекрестно проверенной моделью логистической регрессии, и вы можете увидеть, как разбиение на среднее уменьшает колебания амплитуды дисперсии и может уменьшить масштабы отклонений от времени. Предварительная обработка данных была минимальной (отбросить малоинформативные переменные и однозначно закодировать категориальные переменные), и настройка не требуется, поскольку мы стремимся не к точности, а к нестабильности, которая существует во всех прогнозных моделях, поэтому ожидается использование настроек гиперпараметров по умолчанию.

Блоки кода 1 и 2 показывают, как это может быть выполнено для двоичной классификации с f1_score в качестве показателя точности. Использование 200 моделей произвольно; он был выбран как баланс между временем выполнения и захватом всего диапазона дисперсии, из которых самый большой всплеск произошел выше random_state = 125 для этого набора данных + модель.

# Code Block 1
from sklearn.linear_model import LogisticRegressionCV
model = LogisticRegressionCV(random_state=1, max_iter=5000)
size = 0.5
# Code Block 2
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, balanced_accuracy_score, precision_score, recall_score
import matplotlib.pyplot as plt
Var = []
for i in range(1, 200):
    train_X, test_X, train_y, test_y = train_test_split(X, y,
test_size = size, stratify=y, random_state = i)
    model.fit(train_X, train_y)
    train_pred = model.predict(train_X)
    test_pred = model.predict(test_X)
    train_error = f1_score(train_y, train_pred)
    test_error = f1_score(test_y, test_pred)
    variance = test_error/train_error
    Var.append(variance)
    
rs_value = np.average(Var)
def find_nearest(array, value):
    array = np.asarray(array)
    idx = (np.abs(array - value)).argmin()
    return array[idx]
nearest = find_nearest(Var, rs_value)
print('random_state = ', Var.index(nearest))

# Code Block 3 for plotting the variance graph
plt.figure(figsize=(10,8))
plt.plot(range(1, 200), Var, color='royalblue', label="Variance")
plt.plot([0, 200], [rs_value, rs_value], color='darkorange', linewidth=3)
plt.text(0,rs_value, rs_value, fontsize=15, color='black')
plt.legend(loc='lower center', shadow=True, fontsize='medium')
plt.show()

Изменение этого кода для регрессионных моделей представляет собой простое преобразование: удалите «stratify = y» из раздела данных и измените меру ошибки (например, среднеквадратичную ошибку, среднюю абсолютную ошибку и т. Д.). Кодовый блок 1 устанавливает алгоритм моделирования и размер теста, в то время как кодовый блок 2 собирает информацию о дисперсии, вычисляет ее среднее значение и находит ближайшее значение случайного состояния к среднему значению дисперсии для программирования разделения поезд / тест. Блок кода 3 отображает дисперсию и ее среднее значение.

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

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

Ссылки

Абу-Мостафа, Ю.С., Магдон-Исмаил, М., и Лин, Х.-Т. (2012). Изучение данных (том 4). AMLBook Нью-Йорк, Нью-Йорк, США:

Джеймс, Г., Виттен, Д., Хасти, Т., и Тибширани, Р. (2013). Введение в статистическое обучение (том 112). Springer.