2017-01-11 8 views
2

Я пытаюсь обучить модель данных из задачи Хиггса Босона на kaggle. Первое, что я решил сделать, это создать простую модель keras. Я пробовал различное количество и ширину слоев, разные функции затрат, различные оптимизаторы, различные функции в нейронах, но точность в наборе тренировок всегда находится в диапазоне 0,65-0,7. Я не понимаю, почему. Вот мой пример модели, которая работала так странно:Точность не повышается на модели keras

from keras.layers import Dense, merge, Activation, Dropout 
from keras.models import Model 
from keras.models import Sequential 
from keras.optimizers import SGD 

model = Sequential() 
model.add(Dense(600, input_shape=(30,),activation="relu")) 
model.add(Dropout(0.5)) 
model.add(Dense(400, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(100, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(1, activation='sigmoid')) 
sgd = SGD(lr=0.01, decay=1e-6) 
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy']) 
model.fit(train,labels,nb_epoch=1,batch_size=1) 

Я также попытался более крупные модели и получили такую ​​точность тоже. Пожалуйста, скажите мне, что я делаю неправильно.

EDIT

Я попытался тренировки эту модель с 100 эпох и размер партии 0f 100 и снова получил убыток, равный 4.9528 и точность 0.6924. И он всегда выводит ноль для каждого примера.

+0

Ваша правка комментарий показывает, что ваши данные не сбалансированы, и это проблема. Либо балансируйте оба класса в ваших данных, либо используйте class_weight в функции подгонки. –

ответ

4

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

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

from sklearn.ensemble import RandomForestClassifier 
rf = RandomForestClassifier() 
rf.fit(X_train, y_train) 

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

from keras.layers import Dense, Dropout 
from keras.models import Sequential 
import pandas as pd 
import numpy as np 
from sklearn.model_selection import train_test_split 
from imblearn.over_sampling import SMOTE 

df = pd.read_csv("training.csv") 
y = np.array(df['Label'].apply(lambda x: 0 if x=='s' else 1)) 
X = np.array(df.drop(["EventId","Label"], axis=1)) 
sm = SMOTE() 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) 
X_res, y_res = sm.fit_sample(X_train, y_train) 

model = Sequential() 
model.add(Dense(25, input_shape=(31,),activation="relu")) 
model.add(Dropout(0.5)) 
model.add(Dense(10, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(1, activation='sigmoid')) 
model.compile(optimizer="adam",loss='binary_crossentropy',metrics=['accuracy']) 
model.fit(X_res, y_res,validation_data=(X_test, y_test),nb_epoch=100,batch_size=100) 

Пример результатов:

Epoch 11/100 
230546/230546 [==============================] - 5s - loss: 0.5146 - acc: 0.7547 - val_loss: 0.3365 - val_acc: 0.9138 
Epoch 12/100 
230546/230546 [==============================] - 5s - loss: 0.4740 - acc: 0.7857 - val_loss: 0.3033 - val_acc: 0.9270 
Epoch 13/100 
230546/230546 [==============================] - 5s - loss: 0.4171 - acc: 0.8295 - val_loss: 0.2821 - val_acc: 0.9195 
2

Вы тренируетесь слишком короткий

model.fit (поезд, этикетки, nb_epoch = 1, batch_size = 1)

это означает, что вы собираетесь раз через данные, с чрезвычайно маленькой порцией, это должно быть что-то среди линий

model.fit(train, labels, nb_epoch=100, batch_size=100) 
+0

Я пробовал 100 эпох с размером партии 100, а точность снова 0,6924, а потеря - 4.9528. Но он всегда предсказывает 0 сейчас. – lucik