Искусственная нейронная сеть с нуля на python c библиотекой numpy
Содержание:
Признаки с единственным уникальным значением
Последний метод довольно простой: нужно найти любые столбцы, которые имеют единственное уникальное значение. Признаки с единственным уникальным значением бесполезны для машинного обучения, поскольку они имеют нулевую дисперсию. Например, древовидная модель никогда не может сделать разбиение по признаку только с одним значением.
В этом методе нет параметров для инициализации, в отличие от других методов:
fs.identify_single_unique()
4 features with a single unique value.
Можно построить гистограмму количества уникальных значений в каждой категории:
fs.plot_unique()

Важный момент — NaN по умолчанию отбрасываются до вычисления уникальных значений в Pandas.
Признаки с нулевой важностью
Предыдущие два метода могут быть применены к любому структурированному датасету, и эти методы детерминированы — результаты будут одинаковыми каждый раз для заданного порога. Следующий метод предназначен только для контролируемых задач машинного обучения, где у нас есть метки для обучения модели и не является детерминированным
Функция ident_zero_importance находит признаки, которые имеют нулевое значение важности в соответствии с моделью обучения GBM
С помощью древовидных моделей машинного обучения можно вычислить важность признака. Абсолютное значение важности не так важно, как относительные значения, которые мы можем использовать для определения наиболее важных для задачи свойств
Мы также можем использовать эту величину для выбора свойств, которые можно удалить. В древовидной модели признаки с нулевой важностью не используются для разделения любых узлов, поэтому мы можем удалить их, не меняя производительность модели.
FeatureSelector вычисляет важность признаков с помощью Gradient Boosting Maching из библиотеки LightGBM. Важность признака усредняется по 10 циклам GBM, для уменьшения дисперсии
Кроме того, модель обучается с датасетом для проверки и ранней остановкой (эту опцию можно отключить), чтобы предотвратить переобучение.
Приведенный ниже код вызывает метод и ищет признаки с нулевой важностью:
# Pass in the appropriate parameters
fs.identify_zero_importance(task = 'classification',
eval_metric = 'auc',
n_iterations = 10,
early_stopping = True)
# list of zero importance features zero_importance_features = fs.ops
63 features with zero importance after one-hot encoding.
Мы передаем следующие параметры:
- task: либо «классификация», либо «регрессия», в зависимости от вашей задачи;
- eval_metric: показатель, используемый для ранней остановки (не нужно, если ранняя остановка отключена);
- n_iterations: количество циклов обучения;
- early_stopping: использовать или не использовать раннюю остановку для обучения модели.
На этот раз мы получим два графика с помощью команды plot_feature_importances:
# plot the feature importances fs.plot_feature_importances(threshold = 0.99, plot_n = 12)
124 features required for 0.99 of cumulative importance
Слева приведен график важности plot_n количества наиболее важных свойств (нормировка на 1). Справа приведен график зависимости важности от числа свойств
Вертикальная линия означает пороговое значение, в данном случае 99%.
Два важных замечания касательно метрики важности:
Обучение GBM является стохастическим, важность свойств будет разной при каждом запуске модели.
Это не должно оказать большое влияние (самые важные признаки не перестанут быть таковыми), но изменит порядок расположения некоторых признаков
Это также может повлиять на количество признаков с нулевой важностью. Не удивляйтесь, что значения характеристик меняются каждый раз!
Для обучения модели машинного обучения происходит прямое кодирование признаков
Это означает, что некоторые признаки с нулевой важностью могут быть напрямую закодированными признаками, добавленными в ходе моделирования
Возможность удалить любые напрямую закодированные признаки есть. Однако, если мы будем заниматься машинным обучением после выбора признаков, нам все равно придется проводить прямое кодирование признаков!
Метод TF-IDF
Проблема «набора слов» заключается в том, что в тексте могут доминировать часто встречающиеся слова, которые не содержат ценную для нас информацию
Также «набор слов» присваивает большую важность длинным текстам по сравнению с короткими
Один из подходов к решению этих проблем состоит в том, чтобы вычислять частоту появления слова не в одном тексте, а во всех сразу. За счет этого вклад, например, артиклей «a» и «the» будет нивелирован. Такой подход называется TF-IDF (Term Frequency-Inverse Document Frequency) и состоит из двух этапов:
TF — вычисление частоты появления слова в одном тексте
TF = (Число раз, когда слово "t" встречается в тексте)/(Количество слов в тексте)
IDF — вычисление того, на сколько редко слово встречается во всех текстах
IDF = 1+log(N/n), где N - общее количество текстов, n - во скольких текстах встречается "t"
Коэффициент TF-IDF — это вес, часто используемый для обработки информации и интеллектуального анализа текста
Он является статистической мерой, используемой для оценки важности слова для текста в некотором наборе текстов
Пример
Рассмотрим текст, содержащий 100 слов, в котором слово «телефон» появляется 5 раз. Параметр TF для слова «телефон» равен (5/100) = 0,05.
Теперь предположим, что у нас 10 миллионов документов, и слово телефон появляется в тысяче из них. Коэффициент вычисляется как 1+log(10 000 000/1000) = 4. Таким образом, TD-IDF равен 0,05 * 4 = 0,20.
TF-IDF может быть реализован в scikit так:
from sklearn.feature_extraction.text import TfidfVectorizer
Продвинутые идеи для проектов на Python
1. Тест скорости набора текста
Идея проекта. Тест скорости набора текста — это проект, с помощью которого вы можете определить скорость набора текста пользователем на клавиатуре. Вы должны создать графический интерфейс с помощью GUI библиотеки, такой как Tkinter, посредством которого пользователь будет вводить случайное предложение, и после завершения набора, видеть скорость набора, точность и количество набранных слов в минуту. Здесь можно посмотреть пример исходного кода проекта Python по тестированию скорости набора текста
2. Агрегатор контента
Идея проекта. В Интернете много информации и статей. Найти хороший относящийся к делу контент сложно, поэтому агрегатор контента автоматически выполняет поиск на популярных веб-сайтах, ищет соответствующие материалы и создает список для просмотра. Впоследствии пользователь может выбрать из этого списка, что именно он хочет посмотреть.
3. Массовое переименование файлов / приложение для изменения размера изображения.
Идея проекта. Одной из задач машинного обучения является предварительная обработка данных. Нам в данном проекте будет необходимо выполнить изменение размера и переименование большого количества изображений, поэтому приложение, которое сможет автоматически выполнять эти задачи, будет очень полезно как в плане своей функциональности так и для изучения основ Data Science.
4. Менеджер файлов на Python
Идея проекта. Создайте приложение для просмотра и управления файлами, с помощью которого вы сможете смотреть файлы в вашей системе, управлять ими, искать и копировать их в различные места. Этот проект будет использовать несколько областей знаний языка программирования Python.
5. Проверка плагиата в Python
Идея проекта. Идея этого проекта заключается в создании приложения с графическим интерфейсом, которое можно использовать для проверки на плагиат. Чтобы создать этот проект, вам нужно использовать библиотеку обработки естественного языка вместе с поисковым API Google, который подберет для вас лучшие статьи.
6. Веб-сканер в Python
Идея проекта. Веб-сканер — это скрипт, который автоматически просматривает страницы в интернете и может сохранять их содержимое. Этот процесс называется веб-сканированием. Такие поисковые системы, как Google, используют эту технику для поиска актуальной информации. Обязательно используйте концепцию многопоточности при выполнении этого проекта.
7. Музыкальный проигрыватель в Python
Идея проекта. Каждый любит слушать хорошую музыку. Вы сможете получить удовольствие при выполнении проекта, создав свой собственный музыкальный проигрыватель. Музыкальный проигрыватель должен уметь искать файлы в каталогах, и обладать интерактивным интерфейсом. Выполнение этих условий является непростой задачей, которая лучше всего подходит для опытных программистов.
8. Расширение сравнения цен.
Идея проекта. Это потрясающий проект, в котором вы можете сравнивать цены в нескольких веб-источниках. Как на сайте Trivago, например, мы можем сравнивать цены на отели, или как на сайтах Amazon, Snapdeal, Flipkartа и других мы можем сравнивать цены на товары, отображая при этом лучшие предложения.
9. Загрузчик картинок с Instagram
Идея проекта. Проект загрузчик картинок с Instagram используется для скачивания изображений ваших друзей, размещенных в Instagram. Он будет использовать ваши учетные данные, чтобы отыскать всех ваших друзей, а затем загрузить их фотографии.
Инициализация Гипер-параметров
Гипер-параметры – это мощные аргументы с предварительной настройкой и не будут обновляться в ходе изучения нейронной сети.
Python
input_size = 784 # Размеры изображения = 28 x 28 = 784
hidden_size = 500 # Количество узлов на скрытом слое
num_classes = 10 # Число классов на выходе. В этом случае от 0 до 9
num_epochs = 5 # Количество тренировок всего набора данных
batch_size = 100 # Размер входных данных для одной итерации
learning_rate = 0.001 # Скорость конвергенции
|
1 |
input_size=784# Размеры изображения = 28 x 28 = 784 hidden_size=500# Количество узлов на скрытом слое num_classes=10# Число классов на выходе. В этом случае от 0 до 9 num_epochs=5# Количество тренировок всего набора данных batch_size=100# Размер входных данных для одной итерации learning_rate=0.001# Скорость конвергенции |
Шаг 2: Решение
Авторы представили отличное интерактивное объяснение своей методологии, поэтому не будем вдаваться в подробности, а лучше сосредоточимся на кратком обзоре того, как части решения взаимодействуют друг с другом, и проведем аналогию с реальным вождением, чтобы объяснить интуитивный смысл.
Решение состоит из трех отдельных частей, которые обучаются отдельно:
Вариационный автоэнкодер (VAE)
В процессе вождения машины вы не будете активно анализировать каждый «пиксель» того, что видите. Вместо этого ваш мозг превращает визуальную информацию в меньшее количество «скрытых» признаков, таких как прямолинейность дороги, предстоящие изгибы и позицию относительно дороги, чтобы подумать и сообщить о следующем действии.
Это именно то, чему обучается VAE — сжимать входное изображение 64x64x3 (RGB) в 32-мерный скрытый вектор z, удовлетворяющий нормальному распределению.
Такое представление визуального окружения полезно, т.к. гораздо меньше по размеру, и агент может обучаться эффективнее.
Рекуррентная нейронная сеть с сетью смеси распределений на выходе (Recurrent Neural Network with Mixture Density Network output, MDN-RNN)
Если в принятии решений вы обходитесь без компонента MDN-RNN, ваше вождение может выглядеть примерно так. Когда вы едете на машине, каждое последующее наблюдение не является для вас полной неожиданностью. Вы знаете, что если в данный момент окружение предполагает поворот налево на дороге, и вы поворачиваете колеса влево, вы ожидаете, что следующий кадр покажет, что вы все еще на одной линии с дорогой.
Подобное мышление наперед — суть работы RNN, сети долгой краткосрочной памяти (LSTM) с 256 скрытыми значениями. Вектор скрытых состояний обозначим за h.
Подобно VAE, RNN пытается зафиксировать внутреннее «понимание» текущего состояния автомобиля в своем окружении, но на этот раз с целью предсказать, как будет выглядеть последующий z на основе предыдущего z и совершённого действия.
Выходной слой MDN просто учитывает тот факт, что следующий z может быть фактически выведен из любого из нескольких нормальных распределений.
MDN для генерации почерка
Тот же автор применил данный метод в этой статье для задачи генерации почерка, чтобы описать тот факт, что следующая точка пера может оказаться в любой из красных отдельных областей.
Аналогично, в статье «Модели мира» следующее наблюдаемое скрытое состояние может быть составлено из любого из пяти гауссовских распределений.
Контроллер
До этого момента мы ничего не говорили о выборе действия. Эта ответственность лежит на Контроллере.
Контроллер — это обычная полносвязная нейронная сеть, где вход представляет собой конкатенацию z (текущее скрытое состояние от VAE, длина 32) и h (скрытое состояние RNN, длина 256). 3 выходных нейрона соответствуют трем действиям, их значения масштабируются для попадания в соответствующие диапазоны.
Диалог
Чтобы понять разные роли трех компонентов и то, как они работают вместе, можно представить себе своеобразный диалог между ними:
VAE: (смотрит последнее наблюдение размера 64 * 64 * 3) “Это выглядит как прямая дорога, с легким левым поворотом, приближающимся к машине, движущейся вдоль дороги”.
RNN: “Из того, что мне описал VAE (вектор z) и того факта, что Контроллер решил ускориться на последнем шаге, я обновлю свое скрытое состояние (h), чтобы предсказание следующего наблюдения все еще была прямая дорога, но с чуть более сильным левым поворотом”.
Контроллер: “На основании описания из VAE (z) и текущего скрытого состояния из RNN (h) моя нейронная сеть выводит следующее действие как ”.
Затем это действие передается в окружение, которая возвращает новое наблюдение, и цикл повторяется снова.
Теперь мы рассмотрим, как настроить среду, которая позволяет вам обучать собственную версию агента для автогонок.
Пора писать код!