2017-01-11 13 views
2

나는 케글 (Kaggle)에서 힉스 보슨 (Higgs Boson)의 데이터를 모델로 훈련시키고 있습니다. 내가 먼저하기로 한 것은 단순한 케라 모델을 만드는 것입니다. 나는 레이어의 다른 양과 너비, 다른 비용 함수, 뉴런에서 다른 옵티 마이저의 다른 기능을 시도했지만 훈련 세트의 정확도는 항상 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) 

가 나는 또한 더 큰 모델을 시도하고 너무 같은 정확도를 가지고 : 여기 내 이상한 일 모델의 예입니다. 내가 뭘 잘못하고 있는지 말해줘.

편집

나는 100 시대이 모델과 배치 크기 훈련을 시도 0F 100 다시 0.6924로 4.9528 동일한 손실과 정확성을 가지고있다. 그리고 모든 예제마다 항상 0을 출력합니다.

+0

귀하의 편집 주석 데이터가 균형을하지 않고 그 문제가 있음을 보여준다. 데이터에서 두 클래스의 균형을 맞추거나 fit 함수에서 class_weight를 사용하십시오. –

답변

4

문제는 모델이 항상 대부분의 클래스를 출력합니다. 가중치 문제는 아닙니다 (클래스 중 하나가 다른 것보다 많이 나타남). 네트워크가 항상 같은 클래스를 출력하도록 "배우는"것처럼 보입니다.

다른 분류기 (예 : 랜덤 포레스트)를 사용하면 정확도가 훨씬 더 좋아집니다.

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

신경망 문제를 해결할 때 나는 열차 데이터 집합의 균형을 맞추기 위해 SMOTE를 사용합니다. 분류의 최적화 도구로 "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

관련 문제