machinelearningmastery.ru

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

Home

От Scikit-учиться до TensorFlow: Часть 2

Дата публикации Jul 3, 2017

Продолжая с того места, где мы ушли, мы углубимся в то, как разрабатывать алгоритмы машинного обучения (ML) с использованием TensorFlow с точки зрения разработчика scikit-learn. Если вы хотите узнать причины перехода на TensorFlow, мотивы, прочитайте мой предыдущий пост дляПричины перейти на TensorFlowи простая программа классификации, которая подчеркивает сходство разработки для scikit-learn и TensorFlow.

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

Использование машинного обучения

Проблемы машинного обучения (ML) широко распространены. Однако выгода заключается в том, что, как только вы начинаете решать проблемы с ML, каждая новая проблема может показаться проблемой ML, которая напоминает старую поговорку:

Если у вас есть только молоток, все выглядит как гвоздь

Существует важное различие между человеком, которыйпонимаетОД и человек, которыйиспользованияML, когданеиспользовать ML для решения проблемы. Вам может не понадобиться использовать ML, если вы можете легко прийти к решению с простыми правилами. Например, вам не нужен алгоритм ML, чтобы предсказать всевелосипеды и машиныявляютсявиды транспортаили заменить слова с ошибками на правильное написание.

Мыволятребовать ML, если правила становятся громоздкими и если для определения таких правил слишком много параметров. Например, нам потребуется ML для прогнозирования погоды на завтра, поскольку это зависит от ряда факторов, таких как сезон, местоположение, другие факторы, такие какЭль-Ниньочто делает правила написания трудными и часто неточными. Еще один случай, когда нам может понадобиться ML, - это когда данные по человечески становятся невозможными для просмотра и поиска шаблонов, что является областью, в которой ML, похоже, делает хорошую работу. Возьмите электронную почтуспамиливетчинапример, где мы классифицируем электронную почту как спам или нет, основываясь на тексте, представленном в письме (тело + тема). Эта задача проста, если шаблоны для спам-писем были конечными и, возможно, ограниченными. Однако «князья»отправляющие такие электронные письма, как правило, находят новые методы, которые делают нас всех «богатыми», что делает нас необходимыми для разработки сред ML, которые помогают нам бороться со спамом.

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

Проблема

Мы будем использоватьВисконсин Диагностические данные для рака молочной железыобнаружение наличия рака. Этот набор данных является проблемой двоичной классификации (злокачественной или доброкачественной) и имеет 569 экземпляров (точек данных), которые позволяют нам выполнить задачу классификации.

Весь код, описанный в этом посте, доступен в моем репозитории GitHub.Вот,

Обработка данных - Scikit-learn

Мы используем эффективные инструменты загрузки данных Scikit-learn для получения наших данных. Доступен набор данных по раку молочной железыВот, Список других наборов данных, которые позволяет нам загружать Scikit-learn, можно найтиВот, Давайте загрузим набор данных и рассмотрим некоторые атрибуты данных.

from sklearn.datasets import load_breast_cancer
cancer_data = load_breast_cancer()print("Number of instances in the dataset: %d" % len(cancer_data.target))>> Number of instances in the dataset: 569

Давайте обсудим влияние использования данных «как есть» и масштабирования функций до обучения данных. Масштабирование данных позволяет нормализовать функции. Это означает, что данные центрированы вокруг нуля и имеют стандартное отклонение, равное единице. Другими словами, мы ограничиваем данные в пределах [0, 1] без изменения исходного распределения данных. Это гарантирует, что классификатор не будет выполнять дикий поиск в большом размерном пространстве для оптимальных весов и вместо этого ограничивает пространство поиска между [0, 1]. Такое масштабирование оказывает большое влияние на эффективность работы классификатора, и это можно увидеть в разделе экспериментов ниже. Мы пробуем два эксперимента, один с масштабированием объектов, а другой без масштабирования объектов.

Эксперимент первый: использование данных как есть [D1]

Мы используем данные из SKLearn как есть, просто загружая переменные, используя встроенный поезд, тестовый сплиттер

from sklearn.model_selection import train_test_split
in_train, in_test, out_train, out_test = train_test_split(cancer_data[‘data’],
cancer_data[‘target’])

Эксперимент второй: масштабирование данных [D2]

Для второго эксперимента мы масштабируем данные, используя функции предварительной обработки, доступные в SKLearn.

from sklearn.preprocessing import StandardScaler
data_scaler = StandardScaler()# Fit train data
data_scaler.fit(in_train)in_train = data_scaler.transform(in_train)
in_test = data_scaler.transform(in_test)

Сеть - TensorFlow

Мы проектируем нейронную сеть, похожую на моюпредыдущий постсохранить простой подход к сети и вместо этого понять последствия предварительной обработки данных и переоснащения. Мы используем TensorFlow'sDNNClassifierкоторый доступен ввномодуль TensorFlow. Мы определяем сеть с тремя слоями, где каждый слой имеетколичество скрытых юнитов. В наших экспериментах мы сначала оцениваем производительность сети ниже, изменяя способ предварительной обработки входных данных, сед = 50 Затем выбираются наиболее эффективные входные данные для дальнейших экспериментов, чтобы понять переобучение, где мы сохраняем данные постоянными (лучшие среди D1 по сравнению с D2) и варьируемсяединицы, Структура сети описана ниже:

feature_columns = tf.contrib.learn.infer_real_valued_columns_from_input(in_train)
classifier_tf = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
hidden_units=[units, units, units],
n_classes=2)
classifier_tf.fit(in_train, out_train, steps=1000)

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

Многослойный персептрон [источник: deeplearning.net]

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

Эксперимент третий: количество скрытых юнитов [H1]

Цель этих двух экспериментов состоит в том, чтобы понять влияние числа скрытых единиц на каждом слое, что также даст представление опереобучения,

Для этого эксперимента мы сначала запускаем выбор D1 или D2 (описанный выше), а затем меняем количество скрытых устройств на каждом слое сети. Количество скрытых единиц для этого эксперимента поддерживается на низком уровне при H1 = 10.

Эксперимент четвертый: количество скрытых юнитов [H2]

Мы выполняем наш четвертый эксперимент с большим количеством скрытых единиц, чем H1. Это позволит учесть больше вариаций в данных, но может привести к запоминанию данных и, следовательно, к неспособности хорошо выполнять тестовые данные. Мы запускаем эксперимент, аналогичный описанному выше H1, а затем запускаем сеть с H2 = 50.

Отчетность - Scikit-Learn

Мы используем функции отчетности Scikit-learn, чтобы понять, как работает наш классификатор. Мы используем отчет о классификации и матрицу путаницы, чтобы понять, как работает наш классификатор.

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

report = metrics.classification_report(out_test, predictions, 
target_names=cancer_data.target_names)
print(report)

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

# Plotting the confusion matrix using matplotlib
%matplotlib inline
confusion = metrics.confusion_matrix(out_test, predictions)# Plot non-normalized confusion matrix
plt.figure()
plot_confusion_matrix(confusion, classes=cancer_data.target_names,
title=’Confusion matrix, without normalization’)

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

Полученные результаты

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

Производительность с H1 + D1

              precision    recall  f1-score   support

malignant 0.94 0.88 0.91 51
benign 0.94 0.97 0.95 92

avg / total 0.94 0.94 0.94 143Prediction Accuracy: 0.937063

Производительность с H1 + D2

              precision    recall  f1-score   support

malignant 0.96 0.93 0.95 46
benign 0.97 0.98 0.97 97

avg / total 0.96 0.97 0.96 143Prediction Accuracy: 0.965035

Из наших экспериментов видно, что масштабирование данных обеспечивает~ 3%повышение точности классификации. Это позволяет нам выбирать D2 (данные с масштабированием) для наших экспериментов с H2.

Производительность с H2 + D2

              precision    recall  f1-score   support

malignant 0.96 0.92 0.94 53
benign 0.96 0.98 0.97 90

avg / total 0.96 0.96 0.96 143Prediction Accuracy: 0.958042

Анализ производительности

Метрики производительности H1 + D2 и H2 + D2 не дают достаточного понимания того, как классификатор работал в других классах с точки зрения количества точек данных. Именно здесь матрица путаницы обеспечивает лучшую картину для дальнейшего анализа.

Путаница матрица для H2 + D2
Путаница матрица для H1 + D2

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

Вывод

В этом посте мы увидели, как использовать Scikit-learn с TensorFlow для выполнения различных экспериментов по классификации и просмотра характеристик каждого классификатора. Мы также провели простые эксперименты с предварительной обработкой данных и параметрами сети, чтобы понять различные концепции.

Весь код, описанный в этом посте, доступен в моем репозитории GitHub.Вот,

Дайте мне знать, какие темы вы бы хотели, чтобы я обсудил в моем следующем посте, как комментарии ниже. Я нащебетв случае, если вы хотите связаться со мной там!

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

Footer decor

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