www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Структура и автоматизированный рабочий процесс для проекта машинного обучения - часть 2

Дата публикации Jun 10, 2017

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

Если вы пропустили это, первая частьВот,

Введение

Прежде всего, нам нужно добавить несколько дополнительных пакетов. Вот полный список на сегодня.

dependencies:
- python=3.5
- numpy
- scipy
- scikit-learn
- jupyter
- requests
- pandas
- seaborn
- click
- openpyxl
- pip:
- watermark
- pytest

Для исследования я лично предпочитаю использовать ноутбуки Jupyter. Давайте создадим один в каталогеnotebooks/00-initial-exploration.ipynb

jupyter notebook

это00очень важно - это указывает на порядок исполнения.

Самая первая ячейка тетради содержит:

%load_ext watermark
%watermark -v -n -m -p numpy,scipy,sklearn,pandas

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

Mon May 29 2017CPython 3.5.3
IPython 6.0.0numpy 1.12.1
scipy 0.19.0
sklearn 0.18.1
pandas 0.20.1compiler : MSC v.1900 64 bit (AMD64)
system : Windows
release : 7
machine : AMD64
processor : Intel64 Family 6 Model 69 Stepping 1, GenuineIntel
CPU cores : 4
interpreter: 64bit

Исследование

В следующей ячейке мы импортируем необходимые библиотеки и храним корневой каталог - это очень полезно.

%matplotlib inline
import pandas as pd
import numpy as np
import seaborn as sns
import os
PROJ_ROOT = os.path.abspath(os.path.join(os.pardir))
print(PROJ_ROOT)

Позже мы хотим на самом деле загрузить и посмотреть на данные:

data_fname = os.path.join(PROJ_ROOT, ‘data’, ‘raw’, ‘iris.csv’)
dframe = pd.read_csv(data_fname, header=None)
dframe.head()

Выход:

0 1 2 3 4 
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa

Мы знаем, что 4-й столбец содержит метку, которую мы хотим предсказать. КакИрисИз известного набора данных мы также знаем имена объектов в столбцах [0,3] - это:длина чашелистика,ширина чашелистика,длина лепесткаа такжеширина лепестка, Но для целей упражнения давайте предположим, что мы их не знаем, и дадим общие названия:

dframe.columns = [‘x0’, ‘x1’, ‘x2’, ‘x3’, ‘y’]
dframe.head()

Выход:

 x0 x1 x2 x3 y 
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa

Теперь есть время для магии:

sns.pairplot(dframe, vars=[‘x0’, ‘x1’, ‘x2’, ‘x3’], hue=’y’)

Ого! Используярожденное моремы можем построить распределение пар между всеми переменными. Это очень полезно для визуального изучения данных. И впечатляет, когда используется впервые;)

Refactor

Пока мы выполнили два основных шага

  • Загрузка и маркировка данных
  • Визуальный осмотр

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

  • Данные метки: добавьте метки (x0,…, y) и сохраните их обратно
  • Исследовательская визуализация Создает сюжет и сохраняет его

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

В файлеsrc/data/preprocess.py

Нужен ли нам метод read_raw_data? Это только одна строка кода. Да, нам нужно Запомнит ли ваш коллега все параметры для нестандартного CSV-файла? И, пожалуйста, помните, что чтение данных может быть гораздо более сложным и включать такие вещи, как PCA. Вpreprocess_dataЯ делаю копию кадра. Это потому, что мне нравится функциональный стиль, в котором параметры неизменны.

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

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

Чтобы завершить создание файлаsrc/data/__init__.pyс содержанием:

from .preprocess import read_raw_data, read_processed_data, preprocess_data, get_label, get_featues

Рефакторинг участка

Код для прорисовки намного проще:

src/visualization/exploratory.py

Я устанавливаю бэкэнд Matplotib дляaggпотому что я обнаружил, что использование по умолчанию (QtAgg) в моей системе вызывает неправильный рендеринг.

Мы также должны создатьreports/figures/.gitkeepфайл так же, как в первой части.

Обновление Makefile

Время обновить график зависимостей. Для построения кода:

reports/figures/exploratory.png: data/processed/processed.pickle
python src/visualization/exploratory.py $< [email protected]

В прошлый раз я объяснил, что<@средства. Напомним, это первая предпосылка (data/processed/processed.pickleв этом примере). Соответственно,$<означает первую цель. Итак, вышеприведенное правило эквивалентно:

reports/figures/exploratory.png: data/processed/processed.pickle
python src/visualization/exploratory.py data/processed/processed.pickle reports/figures/exploratory.png

Какого черта я должен заботиться о[email protected]а также$<?

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

Представьте себе следующее правило:

%.o : %.cpp
gcc $< -o [email protected]

Это будет компилировать каждый*.cподать в соответствующий*.oс помощьюgcc, Мы будем использовать этот синтаксис позже.

Правило для предварительной обработки:

data/processed/processed.pickle: data/raw/iris.csv
python src/data/preprocess.py $< [email protected] --excel data/processed/processed.xlsx

Чистое правило:

clean:
rm -f data/raw/*.csv
rm -f data/processed/*.pickle
rm -f data/processed/*.xlsx
rm -f reports/figures/*.png

И все:

all: data/processed/processed.pickle reports/figures/exploratory.png

Теперь мы можем обновить ноутбук! Это даст нам что-то вроде:

%load_ext watermark
%watermark -v -n -m -p numpy,scipy,sklearn,pandas

%matplotlib inline
import pandas as pd
import numpy as np
import seaborn as sns
import os
PROJ_ROOT = os.path.abspath(os.path.join(os.pardir))
print(PROJ_ROOT)
import sys
sys.path.append(os.path.join(PROJ_ROOT, ‘src’))

Импорт кода изsrc

import sys
sys.path.append(os.path.join(PROJ_ROOT, ‘src’))
from data.preprocess import read_raw_data, preprocess_data
from visualization.exploratory import exploratory_visualization

Загрузка необработанных данных

data_fname = os.path.join(PROJ_ROOT, ‘data’, ‘raw’, ‘iris.csv’)
raw_data = read_raw_data(data_fname)
raw_data.head()

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

preprocessed_data = preprocess_data(raw_data)
preprocessed_data.head()

И заговор

exploratory_visualization(preprocessed_data) 

Перезагрузка модулей

Все хорошо, кроме одной вещи. Я передумал и решил использовать оценку плотности ядра на графике. После модификацииexploratory.pyв...pairplot(dframe, diag_kind=’kde’, vars=[‘x0’..Я перезагружаю ноутбук и ничего не происходит. Это потому, что jupyter не перезагружает мой модуль. Чтобы это исправить, добавьте

%load_ext autoreload
%autoreload 2

В начале тетради. Это приведет к перезагрузке модулей при выполнении кода.

тестирование

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

Теперь мы только проверим наши предположения о форме данных. Создать файлsrc/tests/test_data.py

Он содержит два простых теста. Во-первых, проверяет, приняли ли исходные данные измерения Второй проверяет наличие 4 функций и 1 метки. Фактическое тестирование выполняется с использованием встроенногоassertзаявление. Чтобы запустить тестовую сессию, откройте терминал в корне проекта и введите:

pytest src

Результат должен выглядеть так:

=========== test session starts ===========
platform linux -- Python 3.5.2, pytest-3.1.1, py-1.4.34, pluggy-0.4.0
rootdir: /home/xevaquor/code/overcome-the-chaos, inifile:
collected 2 itemssrc/tests/test_data.py ..======== 2 passed in 0.28 seconds =========

Мы также должны включить тестирование в наш рабочий процесс:

test: all
pytest src

Не забудьте пометить его как .PHONY, поскольку он не создает никаких файлов

.PHONY: all clean test

Создание модели

Наконец, давайте создадим модель. Он может быть реализован с использованием различных библиотек - sklearn, theano, xgboost и т. Д., Поэтому было бы неплохо иметь общий интерфейс.src/models/random_forest.py,

Это очень просто. Я просто хочу упомянуть методы сохранения и загрузки. Они здесь для того, чтобы обеспечить удобный способ сохранения обученных моделей. Каждая модель должна определять ее сама по себе, поскольку она сильно зависит.

ПРИМЕЧАНИЕ: я пропускаю оценку модели. Это очень важная тема, но здесь нет места для этого.

Тренировка модели

В нашем трубопроводе нам также понадобится обучение модели.

Это очень просто. Просто загрузите предварительно обработанные данные и сохраните обученную модель в файл. Конечно, мы должны обеспечить существование каталога обученных моделей.

mkdir models
touch models/.gitkeep
git add --force models/.gitkeep

И обновить Makefile

all: reports/figures/exploratory.png models/random_forest.modelclean:
rm -f data/raw/*.csv
rm -f data/processed/*.pickle
rm -f data/processed/*.xlsx
rm -f reports/figures/*.png
rm -f models/*.model...models/random_forest.model: data/processed/processed.pickle
python src/models/train_model.py $< [email protected]

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

Весь график зависимостей теперь выглядит следующим образом:

Резюме

Мы сделали довольно много сегодня. В следующей, последней части я покажу вам, как развернуть вашу модель. Мы создадим простой веб-сервис и сделаем его онлайн с помощью Docker. Если вы хотите прочитать о чем-то, дайте мне знать в комментариях.

Увидимся :)

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map