Есть ли способ использовать классификацию с несколькими метками, но считать ее правильной, когда модель предсказывает только одну метку в keras? - PullRequest
1 голос
/ 12 июля 2020

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

Для этого мои выходные данные y имеют форму y = [1,0,1,0], потому что у меня есть прогнозы 4 разных организаций. 1 означает, что это лучший прогноз для текущей записи, а большее количество «единиц» означает, что несколько прогнозов имели один и тот же лучший прогноз.

Моя проблема в том, что я хочу создать модель, которая обучается на этих данных, но также узнает, что правильное предсказание только одного значения - это 100% правильный ответ, поскольку мне нужно только получить в результате один из лучших и равных прогнозов. Я считаю, что то, как я это делаю, «снижает» точность моей оценки. Есть ли способ реализовать это в keras? Архитектура нейронной сети полностью экспериментальная, и нет никаких конкретных c причин, по которым я ее выбрал. Это код, который я написал. Мой набор данных поезда состоит из 6463 строк × 505 столбцов.

model = Sequential()

model.add(LSTM(150, activation='relu',activity_regularizer=regularizers.l2(l=0.0001)))
model.add(Dense(100,  activation='relu'))
model.add(Dense(100,  activation='relu'))
model.add(Dense(100,  activation='relu'))
model.add(Dense(50,  activation='relu'))
model.add(Dense(50,  activation='relu'))
model.add(Dense(50,  activation='relu'))

model.add(Dense(24,  activation='relu'))
model.add(Dense(4, activation='softmax')) 


#LSTM
# reshape input to be 3D [samples, timesteps, features]
X_train_sc =X_train_sc.reshape((X_train_sc.shape[0], 1, X_train_sc.shape[1]))
X_test_sc = X_test_sc.reshape((X_test_sc.shape[0], 1,X_test_sc.shape[1]))
#validation set
x_val=X_train.iloc[-2000:-1300,0:505]
y_val=y_train[-2000:-1300]

x_val_sc=scaler.transform(x_val)

# reshape input to be 3D for LSTM[samples, timesteps, features]
x_val_sc =x_val_sc.reshape((x_val_sc.shape[0], 1, x_val_sc.shape[1]))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['categorical_accuracy'])
history= model.fit(x=X_train_sc, y=y_train ,validation_data=(x_val_sc,y_val), epochs=300, batch_size=24)
print(model.evaluate(X_test_sc,y_test))
yhat= model.predict(X_test_sc)

Моя точность составляет ~ 44%

1 Ответ

0 голосов
/ 13 июля 2020

Если вы хотите сделать прогноз по форме [1,0,1,0] ie. модель должна предсказывать вероятность принадлежности к каждому из 4 классов, тогда это называется классификацией с несколькими метками. Вы закодировали классификацию на несколько классов.

Классификация Muti-label

Ваш последний слой будет плотным слоем размера 4 для каждого класса с активацией sigmod. Вы будете использовать binary_crossentropy убыток.

x = np.random.randn(100,10,1)
y = np.random.randint(0,2,(100,4))

model = keras.models.Sequential()

model.add(keras.layers.LSTM(16, activation='relu', input_shape=(10,1), return_sequences=False))
model.add(keras.layers.Dense(8,  activation='relu'))
model.add(keras.layers.Dense(4, activation='sigmoid')) 

model.compile(optimizer='adam', loss='binary_crossentropy')
model.fit(x,y)

Проверка

print (model.predict(x))

Результат

array([[0.5196002 , 0.52978194, 0.5009601 , 0.5036485 ],
       [0.508756  , 0.5189857 , 0.5022978 , 0.50169533],
       [0.5213044 , 0.5254892 , 0.51159555, 0.49724004],
       [0.5144601 , 0.5264933 , 0.505496  , 0.5008205 ],
       [0.50524575, 0.5147699 , 0.50287664, 0.5021702 ],
       [0.521035  , 0.53326863, 0.49642274, 0.50102305],
.........

Как видите, вероятности для каждого прогноза не суммируются до одного, а каждое значение - это вероятность его принадлежности к соответствующему классу. Таким образом, если вероятность> 0,5, вы можете сказать, что он принадлежит классу.

С другой стороны, если вы используете softmax, вероятности в сумме составят 1 ie. он принадлежит к единственному классу, для которого имеет значение> 0,5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...