Подгонка модели логистической регрессии к данным MNIST занимает очень много времени - PullRequest
1 голос
/ 26 апреля 2019

enter image description here Я пытаюсь применить модель LogisticRegression от sklearn к набору данных MNIST, и я разделил данные тренировочного теста на 70-30.

Однако, когда я просто говорю model.fit(train_x, train_y) это занимает очень много времени.

Я не добавил никаких параметров при инициации логистической регрессии.

код:

import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_mldata
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

import tempfile

test_data_home = tempfile.mkdtemp()
mnist = fetch_mldata('MNIST original', data_home = test_data_home)


x_train, x_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size = 0.30, random_state = 0)

lr = LogisticRegression(penalty = 'l2')
lr.fit(x_train, y_train)

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Проблема, которую вы подняли, кажется довольно расплывчатой, но я вполне уверен, что ваша логистическая регрессия не сходится. Я не совсем уверен, почему вы сейчас включаете штрафной санкция «L2», если вы не беспокоитесь о переоснащении. Во всяком случае, если вы посмотрите на sklearn docs , он говорит:

Алгоритм использования в задаче оптимизации.

Для небольших наборов данных «liblinear» - хороший выбор, тогда как «sag» и «saga» быстрее для больших. Для задач мультикласса только 'newton-cg', 'sag', 'saga' и 'lbfgs' обрабатывают многочленовую потерю; «Liblinear» ограничен схемами «один против остальных». «Newton-cg», «lbfgs» и «sag» обрабатывают только штраф L2, тогда как «liblinear» и «saga» обрабатывают штраф L1. Обратите внимание, что быстрая сходимость «sag» и «saga» гарантируется только для функций с примерно одинаковым масштабом. Вы можете предварительно обработать данные с помощью скейлера из sklearn.preprocessing.

Я бы сразу предложил вам добавить параметр `solver = sag '(или любой другой решатель, который может обрабатывать штраф L2), поскольку в документах четко сказано, что только определенные решатели могут обрабатывать штраф L2, а только для решателя по умолчанию liblinear обрабатывает штраф L1 . Вот этот действительно хороший пост о решателях логистической регрессии, который вы можете посмотреть для своего набора данных:
Решатели для логистической регрессии

Имейте в виду, что регуляризация L2 и L1 связана с переоснащением, и поэтому вы даже можете изменить параметр C в своем определении lr. Пожалуйста, посмотрите документацию по sklearn для получения дополнительной информации. Надеюсь это поможет.

0 голосов
/ 26 апреля 2019

Прежде всего, MINST - это не двоичная классификация, а мультикласс. Что касается документации в scikit-learn:

multi_class: str, {‘ovr’, ‘multinomial’, ‘auto’}, по умолчанию: ‘ovr’ If выбрана опция «ovr», тогда бинарная задача подходит для каждого этикетка. Для «полиномиальной» потери сводятся к полиномиальной потере соответствовать всему распределению вероятности, даже когда данные двоичный файл. 'Multinomial' недоступен, когда solver = 'liblinear'. 'авто' выбирает «ovr», если данные являются двоичными, или если решатель = «liblinear», и в противном случае выбирается «многочлен».

Вы должны подчеркнуть это при создании вашей модели.

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

Итак, я бы взял пример Scikitlearn здесь установите параметры обучения и измените код на:

lr = LogisticRegression(C=50. / train_samples,
                         multi_class='multinomial',
                         penalty='l1', solver='saga', tol=0.1)
lr.fit(x_train, y_train)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...