如何使用keras评估多类分类的结果?
Posted
技术标签:
【中文标题】如何使用keras评估多类分类的结果?【英文标题】:How to evaluate the results of multi-class classification by using keras? 【发布时间】:2019-07-23 00:18:44 【问题描述】:我想将深度学习用于多类分类(softmax、keras)。所以,我构建了模型,我得到了错误,这是关于预期输出形状和实际输出形状不同的问题。在我的例子中,类型是 1,2,3,所以预期的形状是 3(3 类),但实际的形状是 4。这个错误解决了,当改变 1,2,3 到 0,1,2 或设置预期的形状到4。后者意味着将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])
【问题讨论】:
所有结果都是“3 级”。但是您需要打印y.values[:5]
才能知道这是否正确。检查y.values
是否都在 0 和 1 范围内很有趣。
我检查了它(编辑)并计算了准确度(0.912)。但是,我想知道为什么将 3 分类问题应用于 4 分类。可能是统计问题。如果你知道我应该在哪里问这个问题,请教我。
【参考方案1】:
当您想要进行多类分类时,您需要在标签向量上执行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]
的标签向量。
【讨论】:
我检查了 y.values(编辑了问题)。我使用 theano 作为 keras 的后端。 您是在y=pd.Series(y,name=None).replace(dict)
之后还是之前进行了唯一调用?
谢谢。我在y=pd.Series(y,name=None).replace(dict)
之后调用了它。以上是关于如何使用keras评估多类分类的结果?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 keras 堆叠 LSTM 模型正确塑造多类分类的输入
如何在 keras 中使用 Conv1D 和双向 LSTM 对每个时间步进行多类分类?