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

Оценка характеристик и уменьшение размерности

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

Методы

  • Все функции
    - Раньше я использовал все переменные. Это можно сделать только в следующих случаях: предварительное знание предметной области, это необходимо, или подготовка к обратному исключению.
  • Обратное исключение
    - включает в себя выбор всех функций и удаление тех, которые не находятся в пределах выбранного уровня значимости, в несколько этапов. Это самый быстрый способ, которым я буду пользоваться.
  • Прямой выбор
    - также требует выбора уровня значимости, но требует создания регрессионной модели для каждой функции и подгонки, а затем сравнения и принятия самого низкого значения и добавления его к остальным наборам. Это продолжается до тех пор, пока наименьшее значение P не превысит выбранный уровень значимости.
  • Двунаправленное исключение (пошаговое)
    - После выбора уровня значимости прямой выбор выполняется сразу после выполнения всех шагов обратного исключения. Это продолжается до тех пор, пока больше не перестанут быть добавлены или удалены переменные.
  • Сравнение оценок
    - Выбирается критерий согласия и предпринимаются попытки всех возможных регрессионных моделей 2n-1. Выбирается тот, который соответствует лучшему критерию. Этот способ наиболее ресурсоемкий.

Пример

Шаги для обратного исключения следующие:

  1. Выберите уровень значимости, чтобы оставаться в модели (я выберу SL = 0,15), а затем создайте новый столбец со всеми единицами, который будет использоваться для определения значимых переменных.
  2. Совместите модель со всеми возможными предикторами
  3. Рассмотрим предиктор с наивысшим p-значением (если P ›SL, продолжить, иначе выйти)
  4. Удалите его из предиктора и всех значений с одинаковым p-значением
  5. Переустановить / перестроить модель и вернуться к шагу 3
  6. Выйти: модель готова
#Evaluate statistical significance with Backward Elimination
import statsmodels.formula.api as sm
#517 rows in X
X = np.append(arr = np.ones((517, 1)).astype(int), values = X, axis = 1)
#Select all Features
X_opt = X[:, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]]
regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
regressor_OLS.summary()
#View results and remove the highest P-value from X-Opt and repeat

x17 имеет наивысшее значение p = 0,943. Это удаляется, а затем процесс повторяется до тех пор, пока все оставшиеся значения не станут ниже 0,15. Для этого можно использовать сценарий.

import statsmodels.formula.api as sm
def backwardElimination(x, sl):
   numVars = len(x[0])
   for i in range(0, numVars):
      classifier_OLS = sm.OLS(y, x).fit()
      maxVar = max(classifier_OLS.pvalues).astype(float)
      if maxVar > sl:
         for j in range(0, numVars — i):
            if (classifier_OLS.pvalues[j].astype(float) == maxVar):
               x = np.delete(x, j, 1)
return x
#Significance Level = 15%
SL = 0.15
X_opt = X[:, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]]
X_Modeled = backwardElimination(X_opt, SL)
regressor_OLS = sm.OLS(endog = y, exog = X_Modeled).fit()
regressor_OLS.summary()

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

Выбор функций

Другой метод уменьшения размерности - это методы выбора характеристик. В предыдущем методе использовалось исключение функций, но я мог также использовать анализ основных компонентов (PCA), линейный дискриминантный анализ (LDA) или Kernel PCA, которые являются методами выбора функций. Например, PCA позволяет пользователю видеть отклонения всех функций и выбирать количество функций для включения, чтобы объяснить установленный процент отклонения. Это делается после разделения набора данных и масштабирования объектов.

#PCA Dimensionality Reduction
from sklearn.decomposition import PCA
pca = PCA(n_components = None) #Replace none with 2
X_train_C = pca.fit_transform(X_train_C)
X_test_C = pca.transform(X_test_C)
explained_variance = pca.explained_variance_ratio_

Объясненная дисперсия для каждой функции упорядочена от наибольшей к наименьшей, как показано в первых шести строках объясненная_вариантность. Поэтому, если бы я хотел выбрать только две переменные, чтобы я мог изобразить характеристики в сравнении с моделью в 2D, я смог бы объяснить (13,9 + 7,4)% или примерно 21% дисперсии. Затем мне нужно будет снова запустить разделение набора данных вместе с масштабированием функций и запустить приведенный выше код, заменив None на 2.

Настройка параметров

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

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

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

‘’’CLASSIFICATION’’’
#Avoid: ValueError: Classification metrics can’t handle a mix of continuous-multioutput and binary targets
dataset = pd.read_csv(‘forestfires.csv’)
y = dataset.iloc[:, 12].values # dependent variable
for i in range(0, len(y)):
   y[i] = (y[i]*2.47)
   if y[i] < 100.0:
      y[i] = 0
   else:
      y[i] = 1
y_Corrected = y.astype(int)
# 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_Modeled, y_Corrected, test_size = 0.2)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
#Tuning For Epochs, Batch Size, Optimizer
def build_classifier(optimizer):
   classifier = Sequential()
   classifier.add(Dense(units = 10, kernel_initializer = ‘uniform’, activation = ‘relu’, input_dim = 4))
   classifier.add(Dense(units = 10, kernel_initializer = ‘uniform’, activation = ‘relu’))
   classifier.add(Dense(units = 10, kernel_initializer = ‘uniform’, activation = ‘relu’))
   classifier.add(Dense(units = 1, kernel_initializer = ‘uniform’, activation = ‘sigmoid’))
   classifier.compile(optimizer = ‘adam’, loss = ‘binary_crossentropy’, metrics = [‘accuracy’])
return classifier
classifier = KerasClassifier(build_fn = build_classifier)
parameters = {‘batch_size’: [1, 16, 32], ‘epochs’: [100, 500], ‘optimizer’: [‘adam’, ‘rmsprop’]}
grid_search = GridSearchCV(estimator = classifier, param_grid = parameters, scoring = ‘accuracy’, cv = 10)
grid_search = grid_search.fit(X_train, y_train)
best_parameters = grid_search.best_params_
best_accuracy = grid_search.best_score_
print(‘Best Parameters: %s’ % best_parameters)
print(‘Best Accuracy: %s’ % best_accuracy)

На выходе лучшие параметры:

  • Размер партии: 25
  • Эпох: 100
  • Оптимизатор: адам

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

Выбывать

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

Метод
Случайным образом перетащите выбранный процент узлов из выбранного слоя. Это делается с помощью функции выпадения в Keras.

Пример
Используя все предыдущие улучшения, сделанные на предыдущих этапах, я реализую модель, использующую значение отсева, равное 10%, и проверю точность по набору тестов.

#BUILD NEW MODEL
#Using Modifications
from keras.layers import Dropout #For Layers of ANN
classifier = Sequential()
classifier.add(Dense(units = 10, kernel_initializer = ‘uniform’, activation = ‘relu’, input_dim = 4))
classifier.add(Dropout(rate=0.1))
classifier.add(Dense(units = 10, kernel_initializer = ‘uniform’, activation = ‘relu’))
classifier.add(Dropout(rate=0.1))
classifier.add(Dense(units = 10, kernel_initializer = ‘uniform’, activation = ‘relu’))
classifier.add(Dropout(rate=0.1))
classifier.add(Dense(units = 1, kernel_initializer = ‘uniform’, activation = ‘sigmoid’))
classifier.compile(optimizer = ‘adam’, loss = ‘binary_crossentropy’, metrics = [‘accuracy’])
classifier.fit(X_train, y_train, batch_size = 25, epochs = 100)
from sklearn.metrics import confusion_matrix
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
cm = confusion_matrix(y_test, y_pred)

Результаты оценки
Среднее значение: 0,9394308885561603
Разница: 0,01942428129876616

Теперь мы видим, что модель значительно улучшилась, а проверенная и оцененная точность очень близка к точности моделирования. Хотя следует отметить, что из-за небольшого числа случаев крупных лесных пожаров в настоящее время модель имеет тенденцию к ложноотрицательному и предсказывает, что большинство из них представляют собой небольшие лесные пожары при прогнозировании выгоревшей площади менее 100 акров. Это может быть ошибка данных, поэтому для проверки этого явления следует использовать другую модель (KNN, Decision Tree, XGBoost и т. Д.).

Однако для визуализации модели я могу выбрать и обучить модель только с двумя независимыми переменными. Поэтому я смогу показать 2D-график модели ИНС. Данные будут собираться в две строки, поскольку одна функция является двоичной.

Заключение

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

Ресурсы

Как настроить количество слоев и узлов в нейронной сети

Регуляризация отсева в моделях глубокого обучения с помощью Keras

Рекурсивное исключение признаков с помощью Scikit Learn

Наиболее полная схема нейронных сетей