Избежание адского переобучения: введение регуляризации против увеличения объема данных для обучения

Вопрос или проблема

Я пытаюсь выявить шумные интервалы в геомагнитных данных, используя логистическую регрессию и работая с библиотекой scikit-learn.

Вот типичный спектр данных, с которыми я работаю:
введите описание изображения здесь

В этом примере данные между 16:00 и 20:00 UTC – когда местная железнодорожная система останавливается на ночь – предполагаются “чистыми” (1), в то время как остальные данные предполагаются “шумными” (0). Этот интервал немного меняется изо дня в день, поэтому необходим метод, позволяющий автоматически различать чистые и шумные данные.

Я обучаю свою модель на данных за 2 года. Чтобы получить одинаковое количество чистых и шумных образцов, для каждого дня я выбираю 10 спектров с ~08:00 до ~09:40 в качестве своих шумных данных и 10 спектров с ~17:00 до ~18:40 в качестве своих чистых данных. В результате я получаю массив признаков X, содержащий 14,600 образцов (365x2x10x2):

for idx in np.arange(number_of_days):
               date=start_date+datetime.timedelta(int(idx))
               rd=RawData() 
               rd.populate(station_id,date,data_type, decimation_level)
               
               pxx,  freq, t, cax = plt.specgram(rd.decimated_data, Fs=decimated_frequency, detrend='mean', cmap='jet', scale="dB")              
               
               noisy_data=pxx[:,44:54]
               clean_data=pxx[:,94:104]                         

               if idx==0:
                    X_noisy=np.transpose(noisy_data)
                    X_clean=np.transpose(clean_data)
               else:
                    X_noisy=np.vstack((X_noisy,np.transpose(noisy_data)))
                    X_clean=np.vstack((X_clean,np.transpose(clean_data)))

 X=np.vstack((X_noisy,X_clean))
 y_noisy=np.zeros((X_noisy.shape[0]))
 y_clean=np.ones((X_clean.shape[0]))
 y=np.hstack((y_noisy,y_clean))

Затем я “осветляю” свои данные и провожу сплит на обучающую и тестовую выборки в соотношении 80/20:

      X_scaled = preprocessing.scale(X)
      X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2)

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

      clf = LogisticRegression()
      clf.fit(X_train, y_train)
      print("Точность модели: {:.2f}%".format(clf.score(X_test, y_test)*100))

Увы, результат, который я получаю, близок к 99%, что, насколько я понимаю, означает, что я переобучаю свои данные. Я знаю два способа борьбы с переобучением:

1) Ввести регуляризацию:

clf = LogisticRegression(C=regularization)

Независимо от того, какое значение C я выбираю, я всё равно остаюсь на уровне ~99%.

2) Увеличить размер обучающего набора данных

Если в каждый день я рассматриваю 12 чистых спектров (с 08:00 до 10:00 UTC) и 12 шумных спектров (с 17:00 до 19:00 UTC), вместо 10 изначально выбранных, точность снижается с ~99% до ~68%. При рассмотрении этого немного увеличенного набора данных эффект регуляризации становится заметным, с линейным увеличением точности с увеличением C:

введите описание изображения здесь

Я должен быть довольно доволен тем, что нашёл это решение, но меня удивляет, как резко точность падает с увеличением размера набора данных всего на 20%. Плюс есть что-то странное: если я рассматриваю немного другие интервалы (скажем, с 07:40 до 09:40 UTC вместо с 08:00 до 10:00 UTC), я возвращаюсь к точности 99%. Что я делаю не так?

Если вы получаете 99% точности на тестовом наборе данных, вы не переобучаете свою модель, вы построили высокопроизводительную модель. Вы ничего не делаете неправильно, модель имеет исключительно высокую обобщающую способность к невиданным данным.

Ответ или решение

Спасение от переобучения: регуляризация vs увеличение объёма обучающей выборки

Введение

Вопрос о переобучении является актуальным для многих специалистов в области анализа данных и машинного обучения. В контексте вашей задачи, связанной с анализом геомагнитных данных с использованием логистической регрессии, возникает дилемма: какие подходы можно использовать для уменьшения переобучения? Вы озвучили два основных метода — регуляризацию и увеличение объёма данных. Давайте рассмотрим их более подробно и определим, какой из них может быть более эффективным в вашем случае.

Понимание переобучения

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

Регуляризация

Регуляризация — это стандартный метод борьбы с переобучением, который внедряет штрафные функции в целевую функцию обучения, направленные на упрощение модели. Логистическая регрессия в scikit-learn поддерживает регуляризацию через параметр C:

  1. C < 1: Увеличение регуляризации, что приводит к более простой модели.
  2. C > 1: Уменьшение регуляризации, что позволяет модели быть более гибкой.

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

Увеличение объёма обучающей выборки

Увеличение объёма данных — ещё один способ борьбы с переобучением. Чем больше данных вашей модели, тем больше разнообразия, на котором она может учиться. При экспериментах, когда вы увеличили количество чистых и шумных образцов, вы заметили, что точность модифицировалась значительно, что указывает на большое значение разнородности данных для успешного обучения.

Парадоксальная зависимость от интервалов

Ваши наблюдения о том, что небольшие изменения в интервалах (например, с 08:00 до 10:00 вместо 07:40 до 09:40) приводят к заметной разнице в точности, также интересны. Это может указывать на то, что определённые временные интервалы в ваших данных содержат специфические паттерны, которые модель может легко запомнить, но не способна обобщить. Это делает мониторинг и настройку данных критически важными.

Рекомендации

  1. Дополнительная проверка данных: Проанализируйте, насколько стабильны временные интервалы, которые вы выбираете. Возможно, стоит исследовать другой подмножество данных или использовать более длинные временные промежутки для настройки модели.

  2. Кросс-валидация: Рассмотрите возможность применения кросс-валидации для более надёжной оценки производительности модели. Это поможет выявить, насколько хорошо ваша модель обобщается на различных подвыборках данных.

  3. Исследование других моделей: Попробуйте различные алгоритмы машинного обучения, такие как SVM, деревья решений или ансамбли, чтобы оценить их эффективность для вашей задачи.

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

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...