Рубрики
Без рубрики

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

Нейронные сети переоценены. Давайте выясним, почему. Tagged с помощью Python, машинного обучения, нейронных сетей.

Хорошо, хорошо, извините за заголовок ClickBait. Я полагаю, что более правильным введением в эту статью будет «Нейронные сети (для личных проектов) переоценены ». Прежде чем я прошел свой первый курс машинного обучения в Техасский университет в Остине Я пытался изучить различные методы ML самостоятельно. Я смотрел Сираджология видео религиозно. Я пытался переподготовку Tensorflow Inception-V3 Network Анкет Я пролил через Нейронные сети и глубокое обучение Всякий раз, когда у меня было свободное время. Я искал более практичное, а не теоретическое введение, которое эти ресурсы сделали очень хорошо – но была проблема. Каждый из этих ресурсов восхвалял нейронные сети как вершину машинного обучения. Хотя они могут быть мощным инструментом, их не подходит для каждой проблемы. Новички для машинного обучения должны изучать основы. Если вы не работаете над масштабным масштабом, проверенные и истинные алгоритмы (например, те, которые встречаются в scikit-learn ), которые почти всегда должны использоваться вместо этого.

В мире машинного обучения гораздо больше, чем нейронные сети, и предположение, что для решения каждой проблемы следует использовать нейронную сеть, – это опасное мышление. Вот отличное обсуждение Stackoverflow когда использовать генетические алгоритмы по сравнению с нейронными сетями. Если вы хотите прочитать немного больше об этом, я предлагаю Проверка здесь Анкет В дополнение к тому, что было упомянуто, нейронные сети (по определению) инструмент выбора для глубокое обучение :

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

Для большинства личных проектов, однако, нейронная сеть не нужна. Я продемонстрирую, что анализируя набор данных Отчеты об убийствах, 1980-2014 из Проект ответственности за убийство , кто размещал свои данные на Kaggle Анкет

Данные

Данные содержит 638 454 записи об убийствах по всей стране и следующую информацию о каждом убийстве:

  • Идентификатор записи
  • Код агентства
  • Название агентства
  • Агентство Тип
  • Город
  • Состояние
  • Год
  • Месяц
  • Инцидент
  • Тип преступности
  • Преступление решено
  • Жертва секс
  • Возраст жертвы
  • Жертва гонка
  • Этническая принадлежность жертвы
  • Преступник пол
  • Преступник возраст
  • Преснительная гонка
  • Этническая принадлежность преступника
  • Отношение
  • Оружие
  • СЧЕТНОСТЬ
  • Количество преступников
  • Источник записи
# Imports
import time
import pandas as pd
import numpy
from sklearn.metrics import accuracy_score

# Inline graphics 
%pylab inline

# Read data
df = pd.read_csv('database.csv')
df[:5]

Заполнение интерактивного пространства имен из Numpy и Matplotlib

/Library/frameworks/python.framework/versions/3.6/lib/python3.6/site-packages/ipython/core/interactiveshell.py:2683: Dtypewarning: столбцы (16) имеют смешанные типы. Укажите опцию DTYPE на импорте или установке. ,,)

Якорн 1980 Январь Аляска Тупой объект 1 1 Убийство или непредумышленное убийство 0 AK00101 Якорн Муниципальная полиция Знакомство 0 ФБР 15 Мужской Коренной американец/уроженец Аляски Неизвестный 0 Неизвестный
Якорн 1980 Маршировать Аляска Удушение 1 2 Убийство или непредумышленное убийство 1 AK00101 Якорн Муниципальная полиция Знакомство 0 ФБР 42 Мужской Белый Неизвестный 0 Неизвестный
Якорн 1980 Маршировать Аляска Неизвестный 2 3 Убийство или непредумышленное убийство 2 AK00101 Якорн Муниципальная полиция Неизвестный 0 ФБР 0 Неизвестный Неизвестный Неизвестный 0 Неизвестный
Якорн 1980 апреля Аляска Удушение 1 4 Убийство или непредумышленное убийство 3 AK00101 Якорн Муниципальная полиция Знакомство 0 ФБР 42 Мужской Белый Неизвестный 0 Неизвестный
Якорн 1980 апреля Аляска Неизвестный 2 5 Убийство или непредумышленное убийство 4 AK00101 Якорн Муниципальная полиция Неизвестный 0 ФБР 0 Неизвестный Неизвестный Неизвестный 1 Неизвестный

Проблема

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

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

После того, как вы определили свои проблемы, ребята на Scikit-learn создали Отличный чит -лист о том, как выбрать алгоритм для использования:

Следуя диаграмме, мы собираемся использовать SGD Classifier Анкет Чтобы классифицировать гонку преступников на основе других данных, я решил посмотреть на столбцы DataFrame вручную и использовать функции, которые я считал важными. Это ужасная практика . Я сделал это, потому что из -за огромного объема данных обучение по каждой функции, а затем изолировать то, что важно, было бы слишком сложно для моего маленького компьютера. Смысл этой статьи состоит в том, чтобы подчеркнуть разницу в времени обучения для нейронных сетей и алгоритмов для достижения аналогичных результатов, а не для создания идеального классификатора.

Данные дезинфекция

Чтобы очистить и разделить наши данные, мы делаем немного предварительной обработки самостоятельно и позволили Пэтси позаботьтесь об остальном. Мы меняем наш набор данных, чтобы содержать только убийства, где преступники гонятся это Известно и преступление это Решен. Это связано с тем, не решается ли преступление, не влияет на гонку преступников (хотя противоположность может быть правдой), и мы не можем обучаться на неизвестных данных. После этого мы пишем формулу, используя изолированные функции, создаем некоторые проектные матрицы и разделяем наши данные на данные обучения и тестирования.

from patsy import dmatrices
from sklearn.model_selection import train_test_split

# Isolate data where perpetrators race is known and crime is solved
start = time.time()
data = df[(df['Perpetrator Race'] != 'Unknown') & (df['Crime Solved'] == 'Yes')] # Race known, case solved - Training data
end = time.time()
print("Time taken separating data:", end - start)

# Create patsy formula using different information
geographicInfo = "City + State"
crimeInfo = "Q('Crime Type') + Weapon + Incident"
victimInfo = "Q('Victim Sex') + Q('Victim Age') + Q('Victim Race') + Q('Victim Ethnicity') + Relationship"
formula = "Q('Perpetrator Race') ~ 0 + " + " + ".join([geographicInfo, crimeInfo, victimInfo])

# Split data into design matrices
start = time.time()
_, X = dmatrices(formula, data, return_type='dataframe')
y = data['Perpetrator Race']
end = time.time()
print("Time taken creating design matrices:", end - start)

# Split data into training and testing data
start = time.time()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
end = time.time()
print("Time taken splitting data:", end - start)

print("Total data size:", len(data))
print("Training data size:", len(X_train))
print("Testing data size:", len(X_test))
baseline = data['Perpetrator Race'].value_counts()[0] / data['Perpetrator Race'].value_counts().sum()
print("Baseline accuracy: ", baseline)
Time taken separating data: 0.21260476112365723
Time taken creating design matrices: 58.753602027893066
Time taken splitting data: 5.484054088592529
Total data size: 442123
Training data size: 296222
Testing data size: 145901
Baseline accuracy:  0.493432822993

SGD -классификатор

Создание классификатора SGD с Scikit-learn Это невероятно просто – как вы можете видеть, требуется три строки кода для создания экземпляра, обучения и прогнозирования с вашим классификатором. Его производительность не хватает (но опять же – наши функции были выбраны не для максимизации точности, а для сравнения точности в тандеме с временем обучения). Хотя точность 82% низкая, это повышение точности на 33% по сравнению с нашей базовой линией. 17 -секундное время обучения на 296 000 рядов данных впечатляет.

from sklearn import linear_model

start = time.time()
classifier = linear_model.SGDClassifier()
classifier.fit(X_train, y_train)
end = time.time()
print("SGDClassifier Training Time:", end - start)

start = time.time()
predictions = classifier.predict(X_test)
end = time.time()
print("SGDClassifier Prediction Time:", end - start)

print("SGDClassifier Accuracy:", accuracy_score(predictions, y_test))
SGDClassifier Training Time: 17.512683868408203
SGDClassifier Prediction Time: 0.7582650184631348
SGDClassifier Accuracy: 0.827568008444

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

Для того, чтобы нейронная сеть (о которой вы можете прочитать о здесь ), чтобы несколько своевременно тренироваться на моем Macbook Pro, мне пришлось значительно подавить его возможности, настраивая размер скрытых слоев и количество итераций Анкет Однако даже после этих настройки обучение заняло 387 секунд – вокруг 22,7 раз больше, чем SGDClassifer, только с 4,5% повышение точности.

from sklearn.neural_network import MLPClassifier

start = time.time()
classifier = MLPClassifier(hidden_layer_sizes=(10,), max_iter=100)
classifier.fit(X_train, y_train)
end = time.time()
print("Neural Network Training Time:", end - start)

start = time.time()
predictions = classifier.predict(X_test)
end = time.time()
print("Neural Network Prediction Time:", end - start)

print("Neural Network Accuracy:", accuracy_score(predictions, y_test))
Neural Network Training Time: 387.71303701400757
Neural Network Prediction Time: 1.6371817588806152
Neural Network Accuracy: 0.872084495651

Вывод

Понятно, что классификатор SGD превзошел нейронную сеть. Я надеюсь, что эта быстрая статья показывает, что в машинном обучении есть нечто большее, чем нейронные сети, и что при решении проблемы ML следует учитывать все варианты. Если вы ищете практическое введение в машинное обучение, книга, которую я использовал (которую я очень рекомендую), это Мюллер а также Гвидо S “Введение в машинное обучение с Python: Руководство для ученых данных “ .

Если у вас есть какие -либо отзывы, пожалуйста, дайте мне знать! Вы можете найти мое присутствие в Интернете на моем Веб -сайт Анкет

Эта статья была первоначально опубликована на ianmobbs.com .

Оригинал: “https://dev.to/mobbsdev/neural-networks-are-overrated”