我正在尝试训练希格斯玻色子挑战卡格尔的数据模型.我决定做的第一件事就是创建一个简单的keras模型.我尝试了不同数量和宽度的层,不同的成本函数,不同的优化器在神经元中的不同功能,但训练集的准确度始终在0.65-0.7范围之间.我真的不明白为什么.这是我的一个模型的例子,它非常奇怪:
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个时期训练这个模型,批量大小为0到100,并且损失等于4.9528,准确度再次为0.6924.每个例子总是输出零.
问题来自于您的模型总是输出大多数类.这不是加权问题(其中一个类看起来比另一个更多)并且您的网络似乎"学会"始终输出相同的类.
尝试使用不同的分类器(例如随机森林),你会发现准确性要好得多.
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