Раньше мои уроки по машинному обучению были скучными рассказами и теориями :) В этом посте я поделюсь своим первым опытом работы с кодом на соревнованиях по искусственному интеллекту. Я попробовал свои базовые навыки машинного обучения на Numerai.

Исходный код Github: https://github.com/andela-ysanni/numer.ai

Согласно веб-сайту их конкурента, Numerai - это глобальный турнир по искусственному интеллекту для прогнозирования фондового рынка. Numerai немного похож на Kaggle, но с чистым и аккуратным набором данных; Вы загружаете данные, строите модель и загружаете свои прогнозы. Довольно сложно найти конкурс, где вы могли бы просто применить любые методы, которые вам нравятся, без особой очистки данных и разработки функций. В этом турнире вы можете сделать именно это.

О да, я изначально начал Введение в машинное обучение Udacity и имел некоторые базовые знания об алгоритмах контролируемого машинного обучения с использованием scikit-learn. Сначала я испугался; Что знает такой новичок, как я, чтобы участвовать в онлайн-соревнованиях с таблицей лидеров? Каковы были шансы, что я не буду внизу таблицы лидеров? Так или иначе, я взял быка за рог.

Пакеты, используемые в этом проекте

Pandas - это пакет, написанный на Python для структур данных и анализа данных, numpy для создания больших многомерных массивов и матриц, вы можете просто установить эти пакеты с помощью pip install Команда. Мы также могли бы импортировать некоторые пакеты из библиотеки sklearn, которая состоит из простых и эффективных инструментов для интеллектуального анализа данных и анализа данных, включая контролируемые и неконтролируемые алгоритмы.

Обзор данных

Для этого турнира у нас было два набора данных: данные для тренировок и данные для тестирования. Я бы порекомендовал вам загружать свои наборы данных с помощью Numbers (по умолчанию он поставляется с Mac OS), чтобы посмотреть, как это выглядит, в противном случае, слава богу, Microsoft Excel. Вы также можете использовать текстовый редактор, например Sublime или Atom, для загрузки набора данных.

Я использовал метод библиотеки panda «read_csv» для синтаксического анализа данных в объект DataFrame. Метод read_csv принимает file_path и некоторые другие необязательные параметры.

import pandas as pd
training_data = pd.read_csv('numerai_training_data.csv')
tournament_data = pd.read_csv('numerai_tournament_data.csv')

Наборы обучающих данных состоит из 22 столбцов. 21 столбец состоит из наших функций в диапазоне от функции 1 до функции 21, а последний столбец является целевым значением; значение 1 или 0, которое будет использоваться для обучения нашего классификатора. У нас около 96321 строки.

Наборы данных турниров - это наш тестовый набор, который также имеет 22 столбца. Столбец 1 - это t_id, который является целевым идентификатором из наших данных обучения. 21 оставшийся столбец - это значения наших функций.

Перекрестная проверка

Перекрестная проверка - это, прежде всего, способ измерения прогностической эффективности статистической модели по независимому набору данных (получено с http://robjhyndman.com). Один из способов измерить прогностическую способность модели - протестировать ее на наборе данных, не используемых в обучающих данных. Разработчики данных называют это тестовым набором, а данные, используемые для оценки, - обучающим набором.

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

Чтобы разработать наш классификатор, мы разделили наш набор данных на два, используя 70 процентов данных для обучения алгоритма. Затем мы запускаем классификатор на оставшихся 30 процентах, пока невидимых, и записываем эти результаты. Это наша собственная версия перекрестной проверки ниже:

from sklearn import cross_validation
features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(training_data.iloc[:,0:21], training_data['target'], test_size=0.3, random_state=0)

Я использовал метод cross_validation из sklearn, чтобы абстрагировать наборы тестов в соотношении 30 процентов от данных обучения. Разрешите пояснить параметры:

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

test_size - это 30-процентное соотношение данных.

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

Наша перекрестная проверка возвращает четыре массива, которые включают 70 процентов функций features_train и labels_train, а оставшиеся 30 процентов - features_test и labels_test.

Реализация и установка классификатора

В этом проекте задача - двоичная классификация, выходные переменные, также известные как наша цель, должны быть 1 или 0. Я буду использовать SVC (классификация опорных векторов) в качестве классификатора. Машина опорных векторов (SVM) - это различающий классификатор, формально определяемый разделяющей гиперплоскостью. Другими словами, с учетом помеченных данных обучения (контролируемое обучение) алгоритм выводит оптимальную гиперплоскость, которая классифицирует новые примеры.

Преимущества машин опорных векторов:

  • Эффективен в пространствах больших размеров.
  • По-прежнему эффективен в случаях, когда количество измерений превышает количество образцов.
  • Использует подмножество обучающих точек в функции принятия решений (называемых опорными векторами), поэтому это также эффективно с точки зрения памяти.
  • Универсальность: для функции принятия решения могут быть указаны различные функции ядра. Предоставляются общие ядра, но также можно указать собственные ядра.
from sklearn.svm import SVC as svc
clf = svc(C=1.0).fit(features_train, labels_train)

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

Метод .fit () соответствует модели SVM в соответствии с заданными обучающими данными, которые представляют собой features_training с поездом меток.

Прогнозы

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

predictions = clf.predict(features_test)

Метод pred () принимает массив и выполняет классификацию массива.

Точность

Точность - это взвешенное среднее арифметическое Точность построенной нами модели. Я буду измерять точность с помощью sklearn. Метод возвращает среднюю точность для заданных тестовых данных и меток.

from sklearn.metrics import accuracy_score
accuracy = accuracy_score(predictions,labels_test)

Precision_score () принимает два массива; предсказания, которые мы сделали ранее, и истинные целевые тестовые данные.

Полученная здесь оценка точности составляет 0,514361849391. Довольно низко, поэтому я решил поднять значение C до 100,0 для лучшей классификации и высокой дисперсии. На самом деле это заняло почти вечность (15 минут) для запуска классификации, но дало оценку 0,518133997785, что немного выше, чем предыдущая оценка. Он все еще низкий, но я рад, что он немного выше среднего. Достаточно честно для новичка :)

Серьезное испытание

Классификатор, который я использовал, довольно медленный, требуется около 10 минут, когда C = 1.0, и 15 минут, когда C = 100.0, чтобы получить лучший результат, это не будет масштабируемым, если наши наборы данных утроятся. Почему? Реализация основана на libsvm. Следовательно, временная сложность подгонки более чем квадратична с числом выборок, что затрудняет масштабирование до набора данных с более чем парой из 10000 выборок.

Улучшение и заключение

В моем следующем посте я расскажу о том, как я точно настроил параметры своего классификатора, а также о том, как я переключился на использование другого алгоритма для оптимизации моего результата. Надеюсь, вам понравился этот урок. Не стесняйтесь оставлять комментарии, вопросы в разделе комментариев. Чао
Обновлено: вот ссылка на финальный урок.