Machine learning keras模型的精度不会提高
我正试着用kaggle上希格斯玻色子挑战的数据来训练一个模型。我决定做的第一件事是创建一个简单的keras模型。我尝试过不同数量和宽度的层,不同的成本函数,不同的优化器,不同的神经元函数,但训练集的精度总是在0.65-0.7范围内。我真的不明白为什么。下面是一个工作异常的模型示例:Machine learning keras模型的精度不会提高,machine-learning,neural-network,keras,Machine Learning,Neural Network,Keras,我正试着用kaggle上希格斯玻色子挑战的数据来训练一个模型。我决定做的第一件事是创建一个简单的keras模型。我尝试过不同数量和宽度的层,不同的成本函数,不同的优化器,不同的神经元函数,但训练集的精度总是在0.65-0.7范围内。我真的不明白为什么。下面是一个工作异常的模型示例: from keras.layers import Dense, merge, Activation, Dropout from keras.models import Model from keras.models
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,得到的损失为4.9528,精度为0.6924。每个例子的输出总是为零。你的训练时间太短了 模型配合(序列、标签、nb\U历元=1、批次尺寸=1) 这意味着您要对数据进行一次,并且批处理非常小,应该是
model.fit(train, labels, nb_epoch=100, batch_size=100)
问题产生于这样一个事实,即您的模型总是输出大多数类。这不是一个加权问题(其中一个类比另一个类多),而且您的网络似乎“学会”始终输出同一个类 尝试使用不同的分类器(例如随机森林),您会发现准确度要高得多
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
我尝试了100个时代,批量大小为100,精度再次为0.6924,而损失为4.9528。但它现在总是预测0。您的编辑注释显示您的数据不平衡,这是一个问题。在数据中平衡两个类,或者在fit函数中使用class_weight。