我正在用python和Keras库构建一个分类ANN。我正在使用3个不同类别的不平衡数据集训练NN。 1级大约是第2类和第3类的7.5倍。作为补救措施,我接受了this stackoverflow answer的建议并设置了我的班级权重:
class_weight = {0 : 1,
1 : 6.5,
2: 7.5}
然而,问题在于:人工神经网络以相同的速率预测3个班级!
这没有用,因为数据集 不平衡,并且预测每个具有33%偶然性的结果是不准确的。
以下是问题:如何处理不平衡数据集,以便ANN每次都不会预测第1类,还会使人工神经网络不能以相同的概率预测类别?
这是我正在处理的代码:
class_weight = {0 : 1,
1 : 6.5,
2: 7.5}
# Making the ANN
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
classifier = Sequential()
# Adding the input layer and the first hidden layer with dropout
classifier.add(Dense(activation = 'relu',
input_dim = 5,
units = 3,
kernel_initializer = 'uniform'))
#Randomly drops 0.1, 10% of the neurons in the layer.
classifier.add(Dropout(rate= 0.1))
#Adding the second hidden layer
classifier.add(Dense(activation = 'relu',
units = 3,
kernel_initializer = 'uniform'))
#Randomly drops 0.1, 10% of the neurons in the layer.
classifier.add(Dropout(rate = 0.1))
# Adding the output layer
classifier.add(Dense(activation = 'sigmoid',
units = 2,
kernel_initializer = 'uniform'))
# Compiling the ANN
classifier.compile(optimizer = 'adam',
loss = 'binary_crossentropy',
metrics = ['accuracy'])
# Fitting the ANN to the training set
classifier.fit(X_train, y_train, batch_size = 100, epochs = 100, class_weight = class_weight)
答案 0 :(得分:5)
我在您的模型中看到的最明显的问题是它没有适当的分类结构。 如果您的样本一次只能属于一个类,那么您不应该通过将sigmoid激活作为最后一层来忽略这一事实。
理想情况下,分类器的最后一层应输出属于某个类的样本的概率,即(在您的情况下)数组[a, b, c]
a + b + c == 1.
。
如果使用sigmoid输出,那么输出[1, 1, 1]
是可能的输出,尽管它不是你想要的。这也是为什么你的模型没有正确推广的原因:假设你不是专门训练它而不喜欢“不平衡”输出(如[1, 0, 0]
),它将默认预测它在训练期间看到的平均值,占重新加权。
尝试将上一个图层的激活更改为'softmax'
,将损失更改为'catergorical_crossentropy'
:
# Adding the output layer
classifier.add(Dense(activation='softmax',
units=2,
kernel_initializer='uniform'))
# Compiling the ANN
classifier.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
如果这不起作用,请参阅我的其他评论并使用该信息与我联系,但我非常确信这是主要问题。
干杯