Keras 低精度分类任务
Keras low accuracy classification task
我在玩 Keras 和一个虚拟数据集。我想看看与具有 RBF 内核的标准 SVM 相比,神经网络的性能要好多少。任务很简单:预测集合 {0,1,2} 中 20 维向量的 class。
我注意到神经网络的表现非常糟糕。 SVM 的正确率约为 90%,而神经网络的正确率仅为 40%。我在我的代码中做错了什么?这很可能是我的错误,但在 NN 上尝试各种参数几个小时后,我放弃了。
代码
from sklearn.datasets import make_multilabel_classification
from sklearn.svm import SVC
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD, RMSprop
from keras.utils import np_utils
from keras.datasets import mnist
# generate some data
dummyX, dummyY = make_multilabel_classification(n_samples=4000, n_features=20, n_classes=3)
# neural network
model = Sequential()
model.add(Dense(20, input_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(20))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))
model.add(Activation('softmax'))
model.compile(loss='mean_squared_error',
optimizer='sgd',
metrics=['accuracy'])
X_train, X_test, y_train, y_test = train_test_split(dummyX, dummyY, test_size=0.20, random_state=42)
model.fit(X_train, y_train,nb_epoch=20, batch_size=30, validation_data=(X_test, y_test))
# Epoch 20/20
# 3200/3200 [==============================] - 0s - loss: 0.2469 - acc: 0.4366 - val_loss: 0.2468 - val_acc: 0.4063
# Out[460]:
# SVM - note that y_train and test are binary label. I haven't included the multi class converter code here for brevity
svm = SVC()
svm.fit(X_train, y_train)
svm.score(X_test, y_test)
# 0.891249
TL;DR
制作了虚拟数据;神经网络糟透了; SVM 踢了它。请帮忙
在多次尝试您的示例后,我发现无论学习技术如何,准确率都在 0.3 到 0.9 之间波动。我相信这是由于随机和无意义的数据而发生的——几乎不可能识别白噪声中的任何特征
我建议使用像 MNIST 这样有意义的数据集来比较不同方法的准确性
关于参数。正如它提到的 Matias,在这种情况下最好使用 categorical_crossentropy。另外,如果你不想手动调整参数,我建议使用 adadelta 优化器
我在玩 Keras 和一个虚拟数据集。我想看看与具有 RBF 内核的标准 SVM 相比,神经网络的性能要好多少。任务很简单:预测集合 {0,1,2} 中 20 维向量的 class。
我注意到神经网络的表现非常糟糕。 SVM 的正确率约为 90%,而神经网络的正确率仅为 40%。我在我的代码中做错了什么?这很可能是我的错误,但在 NN 上尝试各种参数几个小时后,我放弃了。
代码
from sklearn.datasets import make_multilabel_classification
from sklearn.svm import SVC
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD, RMSprop
from keras.utils import np_utils
from keras.datasets import mnist
# generate some data
dummyX, dummyY = make_multilabel_classification(n_samples=4000, n_features=20, n_classes=3)
# neural network
model = Sequential()
model.add(Dense(20, input_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(20))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))
model.add(Activation('softmax'))
model.compile(loss='mean_squared_error',
optimizer='sgd',
metrics=['accuracy'])
X_train, X_test, y_train, y_test = train_test_split(dummyX, dummyY, test_size=0.20, random_state=42)
model.fit(X_train, y_train,nb_epoch=20, batch_size=30, validation_data=(X_test, y_test))
# Epoch 20/20
# 3200/3200 [==============================] - 0s - loss: 0.2469 - acc: 0.4366 - val_loss: 0.2468 - val_acc: 0.4063
# Out[460]:
# SVM - note that y_train and test are binary label. I haven't included the multi class converter code here for brevity
svm = SVC()
svm.fit(X_train, y_train)
svm.score(X_test, y_test)
# 0.891249
TL;DR
制作了虚拟数据;神经网络糟透了; SVM 踢了它。请帮忙
在多次尝试您的示例后,我发现无论学习技术如何,准确率都在 0.3 到 0.9 之间波动。我相信这是由于随机和无意义的数据而发生的——几乎不可能识别白噪声中的任何特征
我建议使用像 MNIST 这样有意义的数据集来比较不同方法的准确性
关于参数。正如它提到的 Matias,在这种情况下最好使用 categorical_crossentropy。另外,如果你不想手动调整参数,我建议使用 adadelta 优化器