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

Подход, который я выбрал, читая Twitter и некоторые другие материалы, посвященные ML, заключался в том, чтобы пройти курс FastAI, который на сегодняшний день кажется наиболее рекомендуемым курсом для ML (пока я полностью согласен). Одним из столпов FastAI и Книги метаобучения Радека Осмульски (одного из известных выпускников FatAI) является применение знаний на практике. Так как у меня нет никаких низко висящих плодов, чтобы применить ML в своей работе (в настоящее время), я решил попробовать Kaggle, так как это именно идея реальной проблемы от реальной компании, которая готова вложить немного денег. есть решение.

Я пробовал Kaggle, но сначала это немного пугало. И соревнования на игровой площадке были не такими уж крутыми, но и пугающими. Но я нашел спин-офф kaggle в Бразилии под названием SigmaGeek. Призы намного ниже, и кажется, что конкуренция намного меньше, поэтому для новичка это выглядело менее пугающим.

Я смотрю на это как на упражнение курса FastAI и стараюсь изо всех сил набрать как можно больше баллов. У меня пока нет хороших результатов, но я повторяю как можно быстрее. Я надеюсь просмотреть этот пост в будущем и увидеть ошибки, которые я сделал, как ошибки нуба.

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

Начальные шаги

Для начала я загружаю данные и делаю некоторые базовые исследования. В зависимости от того, где вы это делаете (Kaggle, Collab, локально), вам, возможно, придется выполнить некоторые различные приготовления (например, отключить диск Google для совместной работы, некоторые конфигурации kaggle или выбрать использование GPU/TPU). Я пробовал все три, но продолжил локально из-за проблем с памятью.

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

dataset_model.describe(include=[np.number]).columns
dataset_model.isna().sum()

Выбор функций

Изучив набор данных и просмотрев словарь данных, я в конечном итоге стал рассматривать все как категориальную переменную, поскольку у меня есть только идентификаторы, логические значения и категории (в виде текста). Итак, я создаю загрузчик данных следующим образом:

splits = RandomSplitter(valid_pct=0.2)(range_of(dataset_model))
dls = TabularPandas(dataset_model, procs=[Categorify, FillMissing],
                   cat_names = cat_names,
                   y_names='acertou',y_block = CategoryBlock(),
                   splits=splits).dataloaders(path=".", bs=64)

y_block = CategoryBlock() был важным шагом, который я пропустил раньше. Поскольку переменная прогнозирования является бинарной зависимой переменной (1 или 0), я должен сообщить модели построить модель классификации, а не модель регрессии. Я думаю, я мог бы просто отправить результаты в сигмовидную функцию в конце, на случай, если я не добавлю эту строку, но я просто пошел по более простому пути.

Еще одна ошибка, которую я совершил раньше, заключалась в том, что я рассматривал некоторые переменные как числовые, а не как категориальные. Я понял, что это неправильно, когда я увидел dls.show_batch(), столбцы, которые должны были быть 0 или 1, имели реальные числа, поскольку они были нормализованы.

Подготовка модели

Для модели я просто выбрал самый простой способ FastAI:

f1score_ins = F1Score(average="macro")
learn = tabular_learner(dls, metrics=[accuracy, f1score_ins])
learn.lr_find(suggest_funcs=(slide, valley))
learn.fit(2, lr=0.01)

Я использую F1Score, потому что это функция оценки соревнований. Но я просто использую его как метрику, так как пока не знаю, как я могу каким-то образом включить его в функцию потерь (что я не думаю, что это возможно).

Я использую средство поиска Learning Rate от FastAI для использования на этапе подбора. Это довольно просто и быстро, но позже я обнаружил, что должен использовать более высокое значение, рекомендованное функцией, поскольку оно очень консервативно.

Каждая эпоха занимает около 50 минут на моем процессоре. В некоторых тестах, которые я проводил на графическом процессоре Collab, каждая эпоха занимала ~3 минуты, но я использовал все свои кредиты графического процессора. Я все еще думаю, что мне не хватает многих улучшений скорости.

Создание файла отправки

Создать файл отправки довольно просто, но есть некоторые соображения.

Прежде всего, вам нужно подготовить набор данных, выполнив ту же разработку функций, что и с набором обучающих данных. В моем случае я не делал ничего, кроме фильтрации столбцов. Затем вы можете использовать функцию test_dl() из FastAI для выполнения всех других подготовительных действий, которые она выполняет в загрузчике данных (заполнение отсутствующих, категоризация и т. д.):

tst_dl = learn.dls.test_dl(submit[cat_names])
preds,_ = learn.get_preds(dl=tst_dl)
submit['acertou'] = (preds[:,1]>0.5).int()
sub_df = submit[['acertou']]

Я делаю шаг «>0,5», потому что все прогнозы являются реальными значениями, поэтому мне нужно их бинаризировать. Мне также нужен последний шаг, специфичный для этой платформы, на которой работает соревнование, а именно удаление всех заголовков и имен строк. Вы можете сделать это вручную, но в пандах это:

sub_df.to_csv("first_submission.csv", index=None, header=None)

Проблемы с памятью

У меня были проблемы с памятью на графическом процессоре, постоянно заканчивалась память CUDA в Collab и Kaggle. Я пока этого не понимаю, потому что набор данных достаточно мал, поэтому я не понимаю, почему он разорвал 15 ГБ ОЗУ. Я посмотрю на это дальше.

Следующие идеи

Для следующих шагов я планирую тестирование:

  • Случайный лес. Что, согласно Уроку 6 курса FastAI, подходит для решения табличных задач. И с ним очень сложно испортить (переоснащение или что-то еще).
  • Особенности инженерии. Я не занимался разработкой каких-либо функций, но это кажется хорошей идеей, поскольку у меня есть много текстовых столбцов, из которых я могу извлечь смысл.
  • Больше смотрите на метрики. У меня не было никаких соображений относительно метрики F1Score. Я знаю, что плохо повышать точность, если я теряю память. Но я пока не знаю, как это контролировать с помощью функции потерь.
  • Попробуйте более быстрые модели. 50 минут по эпохам (на случай, если я не решу проблему с графическим процессором) — это МНОГО времени. Мне действительно нужны более быстрые альтернативы для более быстрой итерации.