Как оптимизировать точность ANN - PullRequest
0 голосов
/ 23 сентября 2019

У меня 50 целевых классов по 300 наборов данных.

Это мой типовой набор данных с 98 функциями:

Sample dataset

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
dataset = pd.read_csv(root_path + 'pima-indians-diabetes.data.csv', header=None)

X= dataset.iloc[:,0:8]
y= dataset.iloc[:,8]

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit_transform(X)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3)

from keras import Sequential
from keras.layers import Dense

classifier = Sequential()
#First Hidden Layer
classifier.add(Dense(units = 10, activation='relu',kernel_initializer='random_normal', input_dim=8))
#Second  Hidden Layer
classifier.add(Dense(units = 10, activation='relu',kernel_initializer='random_normal'))
#Output Layer
classifier.add(Dense(units = 1, activation='sigmoid',kernel_initializer='random_normal'))

#Compiling the neural network
classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics =['accuracy'])

#Fitting the data to the training dataset
classifier.fit(X_train,y_train, batch_size=2, epochs=10)

Я получаю здесь 19% точности, и я надеваюне знаю, как оптимизировать результат моего прогноза.

1 Ответ

0 голосов
/ 23 сентября 2019

Я полагаю, что вы применили технику уменьшения размерности к исходным данным, имеющим 98 функций, и, следовательно, вы используете 8-мерную функцию ввода в вашей модели.

У меня есть несколько замечаний относительно вашей реализации:

[Как проблема классификации]

Поскольку вы упомянули, что ваши выборки принадлежат к 50 разным классам, проблема, безусловно, является проблемой мультиклассовой классификации.Итак, вам нужно сначала закодировать вашу метку следующим образом:

from keras.utils import to_categorical
y = to_categorical(y, num_classes=50, dtype='float32')

В этом случае вам нужно изменить номер выходного узла (представляющего класс) и функцию активации в последнем слое следующим образом:

classifier.add(Dense(units = 50, activation='softmax'))

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

classifier.compile(optimizer ='adam',loss='categorical_crossentropy', metrics =['accuracy'])

[В качестве проблемы регрессии]

Вы можететакже рассматривайте эту проблему как проблему множественной регрессии, поскольку выходные данные находятся в диапазоне от 0 до 50 (непрерывно) и могут сохранять один выходной узел в конечном слое, как вы это сделали.Но в этом случае вы должны использовать linear функцию активации вместо sigmoid.

Итак, конечный слой должен выглядеть так:

classifier.add(Dense(units = 1)) # default activation is linear

Дополнительно, в случае регрессиипроблема, mean_squared_error является наиболее релевантной функцией стоимости (при условии, что в вашем наборе данных не так много выбросов), а accuracy в качестве показателя производительности не имеет значения (скорее вы можете использовать mean_absolute_error, который аналогичен потерям).Следовательно, вторая модификация:

classifier.compile(optimizer ='adam',loss='mean_squared_error')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...