Саморазвитие

Изучаем Kaggle

Время прочтения: 4 мин.

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

 В качестве конкурса мы выбрали соревнование Categorical Feature Encoding Challenge II на международной площадке kaggle.com.

Kaggle идеальное место для начала своего пути в ML и участия в соревнованиях по машинному обучению. Конкурсы можно выбирать по уровню сложности. На сайте Kaggle представлена среда для обработки данных Kaggle Kernels «Notebook». Также Kaggle выгодно отделяет то, что можно улучшать свой результат и подгружать в день до 5 вариантов решений. Так же, можно поделиться своим решением или изучить практики других участников, в разделе Notebook.

С чего начать и какие основные этапы?

Обзор.

В описании задания указано, что необходимо найти котов в представленных данных (лозунг конкурса «Cat in the Dat»). Целью этого конкурса является изучение различных стратегий кодирования данных. Есть возможность попробовать разные схемы кодирования для разных алгоритмов, чтобы сравнить, как они работают.

Метрика.

Оценка задания проводится по площади под кривой ROC (area under the ROC curve).

Данные.

В разделе «Data» можно ознакомиться со структурой и содержанием представленных данных. Изначально данные представлены в виде: бинарных, номинальных, ординарных признаков (features), а также признаков в виде даты и месяца.

В соревновании, необходимо предсказать целевой признак (в датасете обозначается колонкой с названием «target»). Речь идет о задаче классификации, т.е. нам необходимо предсказать вероятность к какому классу относится объект [от 0 до 1].

Решение.

Примечание: Для изучения опыта других участников рекомендуется заглянуть в раздел «Discussion«.

Заходим в Kaggle Kernels, представленный на сайте Kaggle (можно воспользоваться средой Jupiter notebook, облачным сервисом Google Colab, или другим удобным сервисом) и импортируем библиотеки, с которыми предполагаем работать:

import numpy as np # linear algebra
import pandas as pd # data processing

Примечание: Если вы работаете в Kaggle Kernels, то необходимые Датасеты уже будут подгружены в папку «input».

Обработка данных.

В нашем Датасете представленные признаки относятся к категориальным. Однако структура их неоднородна (часть представлена в числовом, часть в строковом формате). Предсказательные модели лучше понимают числа, нежели текст, поэтому мы применяем функцию LabelEncoder из библиотеки Scikit-Learn для преобразования всех данных в числа. Важно заметить, что данная функция должна быть применена как к обучающему (train), так и к тестовому (test) датасету, чтобы преобразовать их к единому виду.

Вызываем LabelEncoder из библиотеки sklearn.preprocessing:

from sklearn.preprocessing import LabelEncoder

Датасет может содержать значения «Nan» (пропущенные значения). Так как алгоритмы машинного обучения не работают с данными, в которых имеются пропущенные значения, нам необходимо подготовить наши данные. Есть несколько вариантов действий: удаление строк (axis=0) со значениями «Nan», либо их замена.  

Мы выбрали способ замены значений «Nan» методом fillna() с аргументом «Mode», так как этот способ больше всего подходит для категориальных признаков, то есть, проще говоря, заменим значение «Nan» самым популярным (медийным) значением в колонке.

Существуют разные методы заполнения значений Nan, по моде, среднему значению или медиане. Используйте тот, который подходит под вашу задачу.

Самое популярное значение в колонке с признаками, можно распознать функцией Mode. Реализовать замену «Nan» и функцию LabelEncoder, можно в одном цикле. Таким образом, мы автоматизируем этот процесс.

for column in train_df.columns[1:-1]:#создаем цикл с атрибутом column
mode = train_df[column].mode().values[0]#ищем значение моды по всем колонкам датафрейма
train_df[column].fillna(mode,inplace=True)#применяем метод .fillna для замены значений Nan значениями Mode в тренировочном датасете
test_df[column].fillna(mode,inplace=True)#аналогичную процедуру применяем к тестовому датасету

LE = LabelEncoder() 
train_df[column] = LE.fit_transform(train_df[column])#применяем LabelEncoder() для преобразования всех признаков в числа в тренировочном датасете
try: # Для обработки исключений используем конструкцию  try - excep
    test_df[column] = LE.transform(test_df[column])#применяем LabelEncoder() к тестовому датасету  
except:
    print(column)

Обучение.

В библиотеке Scikit-learn существует множество алгоритмов машинного обучения: Random forest, Naive Bayes Classifier (NBC), логистическая регрессия, и другие алгоритмы. Выбирайте тот, с помощью которого сможете решить задачу с наивысшим Score (score – показатель качества модели, по которому вы рейтингуетесь в конкурсе). После множества вариаций, в качестве обучающей модели мы выбрали Naive Bayes — Наивный байесовский классификатор, про него и расскажем.

Формируем обучающий набор.

x_train = train.drop('target', axis=1)
y_train = train['target']

Импортируем алгоритм из библиотеки, и обучаем нашу модель с помощью метода «fit».  В качестве аргументов, передаем наш обучающий набор:

from sklearn.naive_bayes import CategoricalNB
clf = CategoricalNB()
clf.fit(x_train, y_train)

После того, как модель обучена, мы можем предсказывать значение целевого признака по входным признакам для новых объектов выборки «test». Делаем это с помощью метода «predict».

y_test_pred = clf.predict_proba(x_test)[:, 1]

Лидерборд.

После этого, датасет с предсказанными значениями целевого признака в колонке «target», размещаем на странице конкурса в разделе «Submit Predictions», и на основании нашего Score, смотрим какое место мы занимаем в LeaderBoard (таблица рейтингования участников).

Пробуйте, экспериментируйте и совершенствуйте свои навыки!

Советуем почитать