Во время учебы я прошел несколько курсов по искусственному интеллекту (ИИ), но никогда ничего не делал вне класса. Машинное обучение (ML) и ИИ в целом сейчас являются наиболее актуальной темой на технической сцене.

И не зря. Мы живем в эпоху демократизации ИИ. Разрабатываются и популяризируются инструменты, предназначенные для использования всеми, а не только небольшим академическим сообществом. Если вы хотите познакомиться с внутренней работой машинного обучения и получить интуитивное представление о том, как все работает, я не могу порекомендовать Курс машинного обучения от Andrew Ng. Я попытаюсь объяснить здесь основную теорию, но я просто изучаю / изучаю, поэтому будьте осторожны :)

Немного теории

Искусственный интеллект (AI) - это «надмножество» машинного обучения (ML), а Neural Networks (NN) - вычислительная модель, используемая в ML. . NN - это метод контролируемого обучения, который означает, что для «обучения» модели необходим набор данных с несколькими примерами с «правильными ответами». Чтобы добраться до NN, мы должны определить еще кое-что по пути.

Линейная регрессия

проблема регрессии означает, что мы должны предсказать результат с действительной оценкой. Например, давайте воспользуемся (типичным) примером ценообразования дома, где у нас есть только 1 характеристика (характеристика), площадь дома, и мы хотим спрогнозировать цену дома. Учитывая набор пар площадь (X) / цена дома (Y) (набор данных), мы можем построить следующий график (где каждая оранжевая точка - это пара площадь / цена дома):

Из базовой линейной алгебры мы знаем, что уравнение прямой имеет вид Y = θ0 + θ1 * X. Это называется гипотезой, и мы ищем значения для θ0 и θ1 (называемые параметрами). Если мы найдем хороший набор θ0, θ1, тогда мы сможем предсказать цену дома, учитывая площадь любого дома. Для этого сначала нам нужно определить ошибку / стоимость, которая является отличием нашей гипотезы от фактического значения:

Есть много способов рассчитать функцию стоимости, одним из самых популярных является среднеквадратичная ошибка. Затем все, что нам нужно сделать, это начать с (в большинстве случаев случайного) начального назначения θ0, θ1 и использовать итеративный алгоритм оптимизации (например, Gradient Descent ), чтобы минимизировать стоимость нашей гипотезы, повторяя наш набор данных.

Логистическая регрессия

Но что, если нам не нужен результат с реальной оценкой, а нам нужна вероятность? Мы можем использовать логистическую регрессию, когда гипотеза выводит действительные числа от 0 до 1. Для этого мы можем использовать сигмовидную функцию для отображения любого действительного числа нашей гипотезы на (0, 1 ) интервал:

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

Нейронные сети

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

Каждый узел в графе, кроме входного слоя, представляет собой простую логистическую регрессию с входными входными ребрами и выходными выходными рёбрами. Самый правый узел, выходной слой, даст нам окончательную вероятность с учетом входных характеристик (функций).

Общие проблемы и набор для проверки

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

TensorFlow + Керас

Если вы следите за новостями на каком-либо сайте технических новостей, вы, вероятно, слышали о TensorFlow. Это фреймворк машинного обучения Google, открытый в 2015 году и имевший огромный успех со стороны сообщества разработчиков ПО. К сожалению, фреймворк, хотя и мощный, но высокотехнологичен, и его трудно использовать посторонним аналитикам данных / машинному обучению. Здесь на помощь приходит Keras, слой более высокого уровня (= более удобный для пользователя) поверх TensorFlow (и других фреймворков машинного обучения), который позволяет вам делать машинное обучение, а точнее нейронные сети (NN), быстрее и проще.

Настраивать

Я использовал дистрибутив Anaconda Python и обнаружил, что настройка среды разработки относительно проста. После установки Anaconda для вашей платформы (вы также можете попробовать Minicoda для более легкой версии, если у вас мало места), компакт-диск в каталог bin дистрибутива и запустите (Linux и MacOS):

./pip установить тензор потока
./pip установить keras
./pip установить панды

Вот и все, если все работает нормально, все готово. Вы можете попробовать отличную PyCharm Community Edition, если вы являетесь поклонником семейства IDE JetBrains.

Изучить Python

Но я же не знаю питона! Я слышу, как ты говоришь. Я тоже. Я только что изучил основы и продолжаю учиться. Для своего знакомства с языком я использовал интерактивный PyCharm Edu, который представляет собой настольное приложение с IDE и интерпретатором Python с единственной целью в жизни - познакомить вас с Python. Базовое руководство состоит из набора модульных тестов, небольшую часть которых вы должны выполнить, чтобы они успешно запустились. Я обнаружил, что Python в целом очень приятный в использовании язык.

Набор данных

Начнем с самого сценария. Я использовал Неявку на прием к врачу из Kaggle в качестве набора данных для этого эксперимента. Это набор данных, который содержит 300 тыс. Посещений врача с характеристиками (особенностями) пациентов, а также с указанием того, явился ли пациент на прием или нет. Мы попытаемся создать нейронную сеть, которая с учетом характеристик пациента предсказывает вероятность его появления.

Предварительно обработать набор данных

Первый шаг - подготовить наши данные перед обучением нашей модели. Мы читаем наши данные и разделяем их на X и Y; X - характеристики (особенности) пациента, а Y - явится ли пациент или нет. Используйте следующее, чтобы получить представление о структуре нашего набора данных:

import pandas as pds

dataframeX = pds.read_csv('No-show-Issue-Comma-300k.csv', usecols=[0, 1, 4, 6, 7, 8, 9, 10, 11, 12, 13])
dataframeY = pds.read_csv('No-show-Issue-Comma-300k.csv', usecols=[5])

print(dataframeX.head())
print(dataframeY.head())

Как видите, некоторые функции не представлены в виде числовых значений. Мы можем изменить это с помощью мощной библиотеки Pandas:

def weekdayToInt(weekday):
    return {
        'Monday': 0,
        'Tuesday': 1,
        'Wednesday': 2,
        'Thursday': 3,
        'Friday': 4,
        'Saturday': 5,
        'Sunday': 6
    }[weekday]

def genderToInt(gender):
    if gender == 'M':
        return 0
    else:
        return 1

def statusToInt(status):
    if status == 'Show-Up':
        return 1
    else:
        return 0

dataframeX.DayOfTheWeek = dataframeX.DayOfTheWeek.apply(weekdayToInt)
dataframeX.Gender = dataframeX.Gender.apply(genderToInt)
dataframeY.Status = dataframeY.Status.apply(statusToInt)

print(dataframeX.head())
print(dataframeY.head())

Теперь мы заменили значения для каждой функции уникальным числовым значением. Мы делаем то же самое для целевого фрейма данныхY.

Нейронная сеть

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

# 1
import numpy as np
seed = 7
np.random.seed(seed)

# 2
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(12, input_shape=(11,), init='uniform', activation='sigmoid'))
model.add(Dense(12, init='uniform', activation='sigmoid'))
model.add(Dense(12, init='uniform', activation='sigmoid'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
model.summary()

# 3
import keras
tbCallBack = keras.callbacks.TensorBoard(log_dir='/tmp/keras_logs', write_graph=True)

# 4
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(dataframeX.values, dataframeY.values, epochs=9, batch_size=50,  verbose=1, validation_split=0.3, callbacks=[tbCallBack])

Давайте рассмотрим это шаг за шагом, и я постараюсь кратко объяснить, что происходит.

№1: мы используем постоянное начальное число для нашего генератора случайных чисел, чтобы каждый раз создавать одни и те же псевдослучайные числа. Это удобно, когда мы хотим попробовать разные модели и сравнить их характеристики.
# 2: определите NN как полностью подключенные слои с 12 узлами в каждом, которые используют сигмоид .
№3: необходимо использовать инструмент TensorBoard для визуализации обучения модели.
№4. Обучите нашу модель, используя определенный оптимизатор и функцию потерь. Эпоха - это количество раз (итераций), когда весь набор данных будет проходить через сеть, validation_split - сколько данных из набора данных нужно удерживать только для проверки производительности модель.

Теперь мы можем делать прогнозы, используя нашу обученную модель, используя функцию model.predict ().

TensorBoard

Мы можем использовать инструмент TensorBoard для визуализации обучения нашей модели, выполнив следующее внутри папки bin Anaconda (мы определили путь в # 3 предыдущего раздела):

./tensorboard - logdir = ’/ tmp / keras_logs’

Заключение

Машинное обучение и нейронные сети - это мощные инструменты, и использование TensorFlow + Keras также может стать забавным. Я только что коснулся этой темы в этом посте, но надеюсь, что дал вам представление о том, что вы можете сделать с помощью нескольких строк кода. Я продолжу изучать эту тему и, возможно, вернусь с чем-то более продвинутым (и полезным)!