Основываясь на одном из моих предыдущих постов - Простой взгляд на глубокое обучение: настройка искусственной нейронной сети, я решил создать и протестировать ИНС с проблемой регрессии и классификации. Разница между регрессией и классификацией может быть немного сложной, чтобы определить, какой алгоритм использовать для прогнозирования. Наиболее фундаментальное различие между ними заключается в том, что для прогнозирования метки используется классификация, а для прогнозирования количества - регрессия. Это просто означает, что задача классификации обычно предсказывает дискретную метку и выводит вероятность предсказания, в то время как регрессия предсказывает непрерывную величину и предоставляет значение.
Данные
UCI Набор данных о лесных пожарах
Классификация
- Выходные данные подразделяются на два или более классов.
- Входные переменные могут быть действительными или дискретными.
- Общий для прогнозирования непрерывного значения как вероятности принадлежности данного значения к каждому выходному классу.
- Навык модели прогнозирования классификации обычно рассчитывается с использованием точности классификации или правильного процента сделанных прогнозов
- Стандартный метод: матрица ошибок
- Более точный: CAP
Регрессия
- Выход - это прогноз количества.
- Входные переменные могут быть действительными или дискретными.
- В этих прогнозах необходимо сообщать о навыках модели как об ошибке
- Общий метод: среднеквадратичная ошибка
Шаги
В этом проекте я буду использовать данные, полученные из репозитория машинного обучения UCI, и использовать тот же набор данных для решения проблемы классификации и проблемы регрессии. Следующие шаги будут использоваться как для
- Очистка и обработка данных
- Создание нейронной сети
- Обучите ИНС
- Протестируйте ИНС
- Методы улучшения будут обсуждаться в Части 2.
Классификация
Для классификации мы пытаемся сгруппировать вещи по общим признакам. Например, учитывая набор животных, мы хотим классифицировать млекопитающих и рептилий. Одна из особенностей, на которую мы могли бы обратить внимание, - это наличие волос / меха или наличие чешуи. Если у животного есть мех, мы можем классифицировать его как млекопитающее. Более подробно о конкретных алгоритмах я рассказываю в своей статье Модели классификации машинного обучения (Часть I). Задача этой конкретной модели будет способна выдержать серьезность пожара. Набор данных не состоял из точек данных, которые соответствовали бы классификации определения того, произойдет ли пожар или нет, поскольку в этом случае все данные попадают только в категорию пожара.
Очистка и обработка данных
В выбранном мной наборе данных не было пустых или недопустимых ячеек, но если они были, можно написать сценарий для удаления этих строк. Следующие шаги были использованы для предварительной обработки данных
- Определите независимые и зависимые переменные
- Убедитесь, что зависимые переменные категоричны, используя метрику классификации пожара. - Кодируйте категориальные функции и создавайте фиктивные переменные (избегайте фиктивных ловушек)
- Разделить данные
- Масштабирование функций для оптимизации
‘’’ 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.
Регресс
Задача регрессии пытается предсказать непрерывную переменную. Это может означать прогнозирование количества воды, используемой в городе, пешеходной посещаемости торгового центра или прибыли компании. Для выбранного набора данных я спрогнозирую размер лесного пожара на основе таких характеристик, как геопространственные данные, ветер, температура и влажность.
Очистка и обработка данных
Используя тот же набор данных, процесс для этого этапа в регрессионной модели относительно такой же.
- Определите независимые и зависимые переменные
- Обеспечьте непрерывность зависимых переменных - Кодируйте категориальные функции и создавайте фиктивные переменные (избегайте фиктивных ловушек)
- Разделить данные
- Масштабирование функций для оптимизации
‘’’ 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
Руководство по многоклассовой классификации с несколькими метками с помощью нейронных сетей в Python
Распознавание рукописных цифр с использованием сверточных нейронных сетей в Python с Keras