如何用keras评估多类分类的结果?

问题描述 投票:0回答:1

我想使用深度学习进行多类分类(softmax,keras)。所以,我构建了模型,我得到了错误,这是关于预期的输出形状和实际输出形状是不同的。在我的例子中,类型是1,2,3,所以期望的形状是3(3级),但实际形状是4.当将1,2,3更改为0,1,2或设置预期形状时,此错误得以解决后者意味着将3类分类改为4类分类。为什么这段代码正在运行?在这种情况下,预测概率是什么意思?我如何评估这些结果?

这是示例代码。

from sklearn import datasets
iris = datasets.load_iris()

# X -> features, y -> label
X = iris.data
y = iris.target
mini_dict = {0: 'a', 1: 'b', 2: 'c'}
y = pd.Series(y, name=None).replace(mini_dict)
mini_dict = {'a': 3, 'b': 1, 'c': 2}
y = pd.Series(y, name=None).replace(mini_dict)
def multiclass_model():
    model = Sequential()
    model.add(Dense(10,input_dim=4))
    model.add(Dropout(0.1))
    model.add(Dense(3,activation='softmax')) #this is expected shape
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy','categorical_accuracy'])
    return (model)

model=KerasClassifier(build_fn=multiclass_model, epochs=20, batch_size=3, verbose=0)
model.fit(X,y.values)

并得到此错误。

Error when checking model target: expected dense_94 to have shape (None, 3) but got array with shape (150, 4)

然后重新定义multiclass_model

def multiclass_model():
    model = Sequential()
    model.add(Dense(10,input_dim=4))
    model.add(Dropout(0.1))
    model.add(Dense(4,activation='softmax')) #change 3 to 4
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy','categorical_accuracy'])
    return (model)

model=KerasClassifier(build_fn=multiclass_model, epochs=20, batch_size=3, verbose=0)
model.fit(X,y.values)

没有错误,我可以得到预测值。

model.predict_proba(X[0:5])
array([[2.52738446e-05, 2.23150160e-02, 3.87168024e-04, 9.77272570e-01],
       [5.91093449e-05, 4.23159041e-02, 1.24582055e-03, 9.56379175e-01],
       [5.94217017e-05, 3.10160406e-02, 7.65587494e-04, 9.68158960e-01],
       [1.07116306e-04, 4.50214930e-02, 1.48290978e-03, 9.53388453e-01],
       [2.73615278e-05, 2.02178583e-02, 3.34151875e-04, 9.79420602e-01]],
      dtype=float32)

y.values[:5]
array([3, 3, 3, 3, 3])

我不知道这些价值观的可靠性。

检查班级数量

np.unique(y.values)
array([1, 2, 3])
python keras theano softmax multiclass-classification
1个回答
0
投票

当你想进行多类分类时,你需要在你的标签向量上做一个one-hot encoding。由于你的y.values输出,我认为你的y看起来像这个[1,2,3,2...]。然而Tensorflows KerasClassifier负责这一点,这可以在源代码中看到.(source)所以你的标签将变成像这样的[[0],[1],[2],[1],...]。在下一步中,这些标签将是one-hot编码,也可以在源代码中看到.(source)现在你的标签看起来像这个[[1,0,0],[0,1,0],[0,0,1],[0,1,0]]

因此,根据我的理解,如果您在输出层中仅使用3个类而不是4个类,则一切都应该正常工作。

因此,请再次检查您的标签数据y,例如np.unique(y.values)。我的猜测是你不小心创建了一个包含[0,1,2,3]的标签向量。

© www.soinside.com 2019 - 2024. All rights reserved.