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

Данные

UCI Набор данных о лесных пожарах

Классификация

  • Выходные данные подразделяются на два или более классов.
  • Входные переменные могут быть действительными или дискретными.
  • Общий для прогнозирования непрерывного значения как вероятности принадлежности данного значения к каждому выходному классу.
  • Навык модели прогнозирования классификации обычно рассчитывается с использованием точности классификации или правильного процента сделанных прогнозов
    - Стандартный метод: матрица ошибок
    - Более точный: CAP

Регрессия

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

Шаги

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

  1. Очистка и обработка данных
  2. Создание нейронной сети
  3. Обучите ИНС
  4. Протестируйте ИНС
  5. Методы улучшения будут обсуждаться в Части 2.

Классификация

Для классификации мы пытаемся сгруппировать вещи по общим признакам. Например, учитывая набор животных, мы хотим классифицировать млекопитающих и рептилий. Одна из особенностей, на которую мы могли бы обратить внимание, - это наличие волос / меха или наличие чешуи. Если у животного есть мех, мы можем классифицировать его как млекопитающее. Более подробно о конкретных алгоритмах я рассказываю в своей статье Модели классификации машинного обучения (Часть I). Задача этой конкретной модели будет способна выдержать серьезность пожара. Набор данных не состоял из точек данных, которые соответствовали бы классификации определения того, произойдет ли пожар или нет, поскольку в этом случае все данные попадают только в категорию пожара.

Очистка и обработка данных

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

  1. Определите независимые и зависимые переменные
    - Убедитесь, что зависимые переменные категоричны, используя метрику классификации пожара.
  2. Кодируйте категориальные функции и создавайте фиктивные переменные (избегайте фиктивных ловушек)
  3. Разделить данные
  4. Масштабирование функций для оптимизации
‘’’
 Data Cleaning and Preprocessing
‘’’
# Importing the libraries
import numpy as np
import pandas as pd
# Importing the dataset
dataset = pd.read_csv(‘forestfires.csv’)
#Getting Independent and Dependent Features
X = dataset.iloc[:, 0:12].values # independent
y = dataset.iloc[:, 12].values # dependent variable
'''
Classification
#Convert to Acres then Classify Size
Class 1.A - one acre or less;
Class 2.B - more than one acre, but less than 10 acres;
Class 3.C - 10 acres or more, but less than 100 acres;
Class 4.D - 100 acres or more, but less than 300 acres;
Class 5.E - 300 acres or more, but less than 1,000 acres;
Class 6.F - 1,000 acres or more, but less than 5,000 acres;
'''
y = dataset.iloc[:, 12].values
for i in range(0, len(y)):
    y[i] = (y[i]*2.47)
    if y[i] < 1.0:
        y[i] = 1
    elif y[i] < 10.0:
        y[i] = 2
    elif y[i] < 100.0:
        y[i] = 3
    elif y[i] < 300.0:
        y[i] = 4
    elif y[i] < 1000.0:
        y[i] = 5
    elif y[i] < 5000.0:
        y[i] = 6
    else:
        y[i] = 7
# Encoding categorical data for independent variables 
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_1 = LabelEncoder()
X[:, 2] = labelencoder_X_1.fit_transform(X[:, 2]) #For month
labelencoder_X_2 = LabelEncoder()
X[:, 3] = labelencoder_X_2.fit_transform(X[:, 3]) #For weekday
onehotencoder = OneHotEncoder(categorical_features = [2])#dummy variable for month
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:] #avoid dummy variable trap 
onehotencoder = OneHotEncoder(categorical_features = [13])#dummy variable for week
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:] #avoid dummy variable trap
'''Encoding For Classification'''
from keras.utils import np_utils
y = np_utils.to_categorical(y)
# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
# Feature Scaling to optimize 
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Создание нейронной сети

Я создал последовательность слоев для определения нейронной сети и определил каждый слой путем инициализации весов, определения функции активации и выбора узлов для каждого скрытого слоя. Я выбрал узлы на основе расчета (независимый + зависимый) / 2. Будет выведена вероятность, а затем было дано разделение на 0,5, чтобы определить, приведет ли данная категория к ИСТИННО или ЛОЖНО значению всего семи категорий. Затем это было скомпилировано. Функция активации для вывода представляет собой сигмоид для представления двоичных значений, softmax использовался для захвата нескольких зависимых категорий.

'''
    Creating the ANN
'''
# Importing the Keras libraries and packages to use Tensor Flow Backend
import keras
from keras.models import Sequential #For Initializing ANN
from keras.layers import Dense #For Layers of ANN
# Initializing the ANN with sequence of layers (Could use a Graph)
#Classifier Model
classifier = Sequential()
# Adding the input layer and the first hidden layer
classifier.add(Dense(units = 17, kernel_initializer = ‘uniform’, activation = ‘relu’, input_dim = 27))
# Adding the hidden layers
classifier.add(Dense(units = 17, kernel_initializer = ‘uniform’, activation = ‘relu’))
classifier.add(Dense(units = 17, kernel_initializer = ‘uniform’, activation = ‘relu’))
# Adding the output layer
# Probability for the outcome 
‘’’Classification’’’
classifier.add(Dense(units = 7, kernel_initializer = ‘uniform’, activation = ‘softmax’))
# Compiling the ANN
'''Classification'''
#Another Option: categorical_crossentropy
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

Обучите ИНС

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

# Fitting the ANN to the Training set
classifier.fit(X_train, y_train, batch_size = 5, epochs = 100)

Протестируйте ИНС

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

Конечный результат:

  • Модель: 91%
  • Матрица замешательства: 71%
  • К-фолд перекрестная проверка: 86%

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

Регресс

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

Очистка и обработка данных

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

  1. Определите независимые и зависимые переменные
    - Обеспечьте непрерывность зависимых переменных
  2. Кодируйте категориальные функции и создавайте фиктивные переменные (избегайте фиктивных ловушек)
  3. Разделить данные
  4. Масштабирование функций для оптимизации
‘’’
 Data Cleaning and Preprocessing
‘’’
# Importing the libraries
import numpy as np
import pandas as pd
# Importing the dataset
dataset = pd.read_csv(‘forestfires.csv’)
#Getting Independent and Dependent(regression and categorical) Features
X = dataset.iloc[:, 0:12].values # independent
y = dataset.iloc[:, 12].values # dependent variable
# Encoding categorical data for independent variables 
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_1 = LabelEncoder()
X[:, 2] = labelencoder_X_1.fit_transform(X[:, 2]) #For month
labelencoder_X_2 = LabelEncoder()
X[:, 3] = labelencoder_X_2.fit_transform(X[:, 3]) #For weekday
onehotencoder = OneHotEncoder(categorical_features = [2])#dummy variable for month
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:] #avoid dummy variable trap 
onehotencoder = OneHotEncoder(categorical_features = [13])#dummy variable for week
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:] #avoid dummy variable trap
# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
# Feature Scaling to optimize 
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Создание нейронной сети

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

# Importing the Keras libraries and packages to use Tensor Flow Backend
import keras
from keras.models import Sequential #For Initializing ANN
from keras.layers import Dense #For Layers of ANN
# Initializing the ANN with sequence of layers (Could use a Graph)
#Classifier Model
classifier = Sequential()
# Adding the input layer and the first hidden layer 
classifier.add(Dense(units = 14, kernel_initializer = ‘uniform’, activation = ‘relu’, input_dim = 27))
# Adding the hidden layers
classifier.add(Dense(units = 14, kernel_initializer = ‘uniform’, activation = ‘relu’))
classifier.add(Dense(units = 14, kernel_initializer = ‘uniform’, activation = ‘relu’))
# Adding the output layer
'''Regression'''
classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'linear'))

Обучите ИНС

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

# Fitting the ANN to the Training set
classifier.fit(X_train, y_train, batch_size = 5, epochs = 500)

Протестируйте ИНС

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

В дополнение к графику я смог вывести точность модели с MAE = 7,08 и MSE = 1430, а затем рассчитать R² модели как R² = -0,33.

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

Будущая работа

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

Ресурсы

Учебное пособие по регрессии с библиотекой глубокого обучения Keras на Python

Разница между классификацией и регрессией в машинном обучении

Как работают алгоритмы машинного обучения

Как использовать метрики для глубокого обучения с Keras в Python

Как выбрать правильную метрику оценки для моделей машинного обучения: метрики регрессии, часть 1

Какой R-квадрат правильный?

Руководство по многоклассовой классификации с несколькими метками с помощью нейронных сетей в Python

Распознавание рукописных цифр с использованием сверточных нейронных сетей в Python с Keras