Точность равна нулю все время - PullRequest
0 голосов
/ 08 октября 2019

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

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

from sklearn import preprocessing
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
import pandas as pd


# Step 2 - Load our data
zeolite_13X_error = pd.read_csv("zeolite_13X_error.csv", delimiter=",")
dataset = zeolite_13X_error.values
X = dataset[:, 0:8]
Y = dataset[:, 10]  # Purity
min_max_scaler = preprocessing.MinMaxScaler()
X_scale = min_max_scaler.fit_transform(X)
X_train, X_val_and_test, Y_train, Y_val_and_test = train_test_split(X_scale, Y, test_size=0.3)
X_val, X_text, Y_val, Y_test = train_test_split(X_val_and_test, Y_val_and_test, test_size=0.5)

# Building and training first NN
model = Sequential([
    Dense(32, activation='relu', input_shape=(8,)),
    Dense(32, activation='relu'),
    Dense(1, activation='linear'),
])
model.compile(optimizer='sgd',
              loss='binary_crossentropy',
              metrics=['accuracy'])
hist = model.fit(X_train, Y_train,
                 batch_size=32, epochs=10,
                 validation_data=(X_val, Y_val))

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Если вы решите рассматривать это как проблему регрессии , тогда

  1. Ваша потеря должна составлять mean_squared_error или некоторую другую потерю, подходящую для регрессии, но не binary_crossentropy, который подходит только для двоичной классификации, и
  2. Точность не имеет смысла - она ​​имеет значение только для параметров классификации;в настройках регрессии мы обычно используем саму потерю для оценки производительности - см. собственный ответ в Какая функция определяет точность в Керасе, когда потеря представляет собой среднеквадратическую ошибку (MSE)? для более.

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

В любом случае комбинация, которую вы показываете здесь -loss='binary_crossentropy' и activation='linear' для последнего узла с одним узлом - бессмысленно.

0 голосов
/ 08 октября 2019

Проверьте выходные данные вашей модели, чтобы проверить значения. Модель предсказывает вероятности, а не двоичное решение 0/1, которое, как я полагаю, является вашим случаем, поскольку вы используете точность в качестве метрики. Если модель прогнозирует вероятности, то конвертируйте их в 0 или 1, округляя их на основе порогового значения (по вашему выбору, т. Е. Если прогноз> 0,5, затем 1, иначе 0).

Также увеличьте количество эпох. Также используйте sigmoid активация в выходном слое.

...