Документирование моего пути к fast.ai: ПРОЕКТ «20 ЛЕТ ИГР». СОВМЕСТНАЯ ФИЛЬТРАЦИЯ И ТАБЛИЧНЫЕ МОДЕЛИ.

В проекте Урок 4 я решил использовать то, что мы узнали о табличных моделях, для обработки некоторых наборов данных, доступных на k aggle.

Здесь я использовал набор данных 20 ​​Years of Gaming, который, как следует из названия, охватывает 20 лет игр и содержит более 18 000 строк, включая дату выпуска, платформу, жанр и оценку IGN. Код доступен здесь.

Предостережение temptor: это не полная история успеха, как это было с нашими проектами компьютерного зрения.

1. Получение данных.

1.1. Каггл Настройка.

Перво-наперво. Нам нужно получить данные. Fastai предоставляет очень полезное руководство о том, как получать наборы данных непосредственно из kaggle, используя его API.

Сначала нам нужно установить kaggle API с помощью следующей команды.

! pip install kaggle --upgrade

Затем мы должны войти в наш профиль kaggle, где, если мы нажмем на изображение нашего профиля, мы увидим «Моя учетная запись». Там мы сможем создать ключ API и загрузить файл kaggle.json.

Затем мы должны загрузить этот файл в каталог, в котором работает блокнот.

! mkdir -p ~/.kaggle/
! mv kaggle.json ~/.kaggle/

Совет: если вы столкнулись с ошибками прав доступа, попробуйте эту команду:

! chmod 600 /home/jupyter/.kaggle/kaggle.json

1.2. Загрузка данных.

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

Мы можем сделать это, как в наших предыдущих проектах:

path = Path('data/ign')
path.mkdir(parents=True, exist_ok=True)
path

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

! kaggle datasets download -d egrinstein/20-years-of-games -f ign.csv -p {path}
! unzip -q -n {path}/ign.csv.zip -d {path}

2. Табличные модели.

2.1. Данные.

В исходном наборе данных есть 10 столбцов, содержащих:

‘score_phrase’, ‘title’, ‘url’,’platform’,’score’,’genre’,
 ‘editors_choice’,’release_year’,’release_month’, ‘release_day’

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

df[‘one_hot_score’] = df[‘score’].map(lambda x: 0 if x < 7 else 1)

Эта строка создает столбец с именем 'one_hot_score', заполняя его значениями с помощью лямбда-функции. В частности, лямбда-функция проходит через столбец 'score' и устанавливает для строки one_hot_score значение 0, если оценка по обзору ниже 7, или 1. , если оценка выше.

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

dep_var = ‘one_hot_score’
#Here we do not include ‘score_phrase’ or ‘editors_choice’ as factors
cat_names = [‘title’, ‘platform’, ‘genre’, 
‘release_year’, ‘release_month’, ‘release_day’]
procs = [FillMissing, Categorify, Normalize]

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

test = TabularList.from_df(df.iloc[800:1000].copy(), path=path, cat_names=cat_names)
data = (TabularList.from_df(df, path=path, cat_names=cat_names, procs=procs)
 .split_by_idx(list(range(800,1000)))
 .label_from_df(cols=dep_var)
 .add_test(test, label=0)
 .databunch())

Наконец, мы также можем взглянуть на 10 строк нашего пакета данных.

data.show_batch(rows=10)

2.2. Обучение.

Для обучения модели мы использовали только одну эпоху со скоростью обучения 1e-2.

Обратите внимание, что мы уже переоснащаем с точностью 60%. Наши результаты становятся немного лучше при скорости обучения 1e-1.

Как вы можете заметить, ранее мы не включали 'score_phrase' или 'editors_choice' в качестве категориальных переменных, поскольку они будут действовать как подсказки для наша модель. Вы хотите увидеть, какие намеки?

Здесь речь идет о копировании прямо из учебника с точностью до 1. Это настолько реалистично:

выйдет в декабре 2018.

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

Обратите внимание, что наша точность немного хуже, хотя мы переоснащаемся на ту же величину.

2.3 Вывод.

Для полноты картины мы можем попытаться предсказать счет игры. Если мы выберем вторую строку со следующей строкой:

row = df.iloc[1]
row

Это следующая игра:

Мы можем сделать вывод,

learn.predict(row)

который выводит следующий результат:

Первое число говорит нам, что оно предсказывает результат выше 7. Оно также выводит метку и вычисленные вероятности.

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