Keras MLP классификатор не учится - PullRequest
3 голосов
/ 10 июня 2019

У меня есть такие данные enter image description here

enter image description here

есть 29 столбцов, из которых я должен предсказать winPlacePerc (крайний конец информационного кадра), который находится между 1 (высокий процент) до 0 (низкий процент)

Из 29 столбца 25 являются числовыми данные 3 являются ID ( объект ) 1 является категориальными

Я удалил все столбцы Id (поскольку все они уникальны), а также закодировал категориальные (matchType) данные в одно горячее кодирование

После всего этого у меня остается 41 колонка (после одной горячей)

after one hot encoded

Вот как я создаю данные

X = df.drop(columns=['winPlacePerc'])
#creating a dataframe with only the target column
y = df[['winPlacePerc']]

Теперь у моего X есть 40 столбцов, и это мои данные метки выглядят как

> y.head()

winPlacePerc
0   0.4444
1   0.6400
2   0.7755
3   0.1667
4   0.1875

У меня также очень большой объем данных, например, 400 тыс. Данных, поэтому для целей тестирования я тренируюсь на части этого, делая это с помощью sckit

X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.997, random_state=32)

, что дает почти 13 тыс. Данных для обучения

Для модели я использую Последовательная модель Keras

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dense, Dropout, Activation
from keras.layers.normalization import BatchNormalization
from keras import optimizers

n_cols = X_train.shape[1]

model = Sequential()

model.add(Dense(40, activation='relu', input_shape=(n_cols,)))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='mean_squared_error',
              optimizer='Adam',
              metrics=['accuracy'])

model.fit(X_train, y_train,
          epochs=50,
          validation_split=0.2,
          batch_size=20)

Поскольку данные моей метки y находятся между 0 и 1, я использую слой sigmoid в качестве моего слоя вывода

это график обучения и потери и точности проверки

enter image description here enter image description here

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

после этого данные y-метки выглядят как

> y.head()

winPlacePerc
0   0
1   1
2   1
3   0
4   0

и изменение функции потерь

model.compile(loss='binary_crossentropy',
              optimizer='Adam',
              metrics=['accuracy'])

enter image description here

этот метод был хуже, чем предыдущий

Как вы можете видеть, он не учится после определенной эпохи, и это также происходит, даже если я беру все данные, а не их часть

после того, как это не сработало, я также использовал dropout и попытался добавить еще слой , но здесь ничего не работает

Теперь мой вопрос, что я делаю неправильно, это неправильный слой или данные, как я могу улучшить это?

Ответы [ 2 ]

1 голос
/ 10 июня 2019
from sklearn.preprocessing import StandardScaler

n_cols = X_train.shape[1]
ss = StandardScaler()
X_train = ss.fit_transform(X_train)

model = Sequential()    
model.add(Dense(128, activation='relu', input_shape=(n_cols,)))
model.add(Dense(64, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(1))

model.compile(loss='mean_squared_error',
              optimizer='Adam',
              metrics=['mean_squared_error'])

model.fit(X_train, y_train,
          epochs=50,
          validation_split=0.2,
          batch_size=20)
  • Нормализация данных
  • Добавьте больше глубины в вашу сеть
  • Сделайте последний слой линейным

Точность не является хорошим показателем для регрессии.Давайте рассмотрим пример

predictions: [0.9999999, 2.0000001, 3.000001]
ground Truth: [1, 2, 3]

Accuracy = No:of Correct / Total => 0 /3 = 0

Точность равна 0, но предсказания довольно близки к истинной истине.С другой стороны, MSE будет очень низким, указывая на то, что отклонение прогнозов от основной истины очень меньше.

1 голос
/ 10 июня 2019

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

Прежде всего, вы безусловно, хочет нормализовать ваши значения (не те, что были закодированы в горячем виде) перед передачей их в сеть.Попробуйте использовать StandardScaler в качестве начала.

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

Для проверки вашей модели «точность» нанесите на график предсказанное вместе с фактическим - это должно дать вам возможность проверить результаты визуально.Тем не менее, это означает, что ваша потеря уже выглядит вполне прилично.

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

...