我在Python 3中有一个Keras模型(Sequential):
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.matthews_correlation = []
def on_epoch_end(self, batch, logs={}):
self.matthews_correlation.append(logs.get('matthews_correlation'))
...
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['matthews_correlation'])
history = LossHistory()
model.fit(Xtrain, Ytrain, nb_epoch=10, batch_size=10, callbacks=[history])
scores = model.evaluate(Xtest, Ytest, verbose=1)
...
MCC = matthews_correlation(Ytest, predictions)
Run Code Online (Sandbox Code Playgroud)
model.fit()打印出来 - 据说是根据metrics = ['matthews_correlation']部分 - 进度和Matthews相关系数(MCC).但它们与MCC最终的回馈有很大的不同.MCC函数最终给出了预测的整体MCC,并且与sklearn的MCC函数一致(即我信任该值).
1)model.evaluate()得分是多少?它们最终与MCC完全不同,或者与时代的MCC完全不同.
2)什么是时代的MCC?它看起来像这样:
大纪元1/10五百八分之五百八十零[===========] - 0 - 损失:0.2500 - matthews_correlation:-0.5817
它们是如何计算的,为什么它们最终与MCC的差别如此之大?
3)我可以以某种方式将函数matthews_correlation()添加到函数on_epoch_train()吗?然后我可以打印出独立计算的MCC.我不知道Keras隐含的是什么.
谢谢你的帮助.
编辑:以下是他们如何记录损失历史的示例.如果我打印(history.matthews_correlation),我会得到进度报告给我的相同MCC列表.
我有一个列表,看起来像这样:
l = [[1, 2, 3],
[3, 5, 4],
[9, 8, 7]]
Run Code Online (Sandbox Code Playgroud)
我想对每个子列表中的相应元素进行排序,以便中间子列表按降序排列,这将导致:
l = [[2, 3, 1],
[5, 4, 3],
[8, 7, 9]]
Run Code Online (Sandbox Code Playgroud)
第二个列表现在正在下降:[5, 4, 3].基本上,我想重新排序2D表示中的垂直列.这似乎是一件容易的事,但我很难找到解决方案.
到目前为止我试过:
from operator import itemgetter
sorted(l, key=itemgetter(1))
Run Code Online (Sandbox Code Playgroud)
这没有改变任何东西,我试过
print(l.sort(key = lambda row: (row[1])))
Run Code Online (Sandbox Code Playgroud)
没有.
我想在我的人工神经网络(带有Keras的 Python )中进行交叉验证。我对训练和测试数据上的Matthews相关系数(MCC)(或就此而言的准确性)测量感兴趣。目前,我的代码使用StratifiedKFold如下所示:
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed)
for train, test in kfold.split(X, Y):
model = Sequential()
model.add(Dense(n, input_dim=dim, init='uniform', activation='sigmoid'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
model.compile(loss='mse', optimizer='adam', metrics=['matthews_correlation'])
asd = model.fit(X[train], Y[train], validation_data=(X[test], Y[test]), nb_epoch=epoch, batch_size=10)
Run Code Online (Sandbox Code Playgroud)
我不是将X [train]和Y [train]填充到Keras的validation_data函数中。对于训练集,这使我的MCC大约为0.7,对于测试集,其MCC小于0.10。
另外,我使用sklearn的train_test_split函数分析了一个测试数据集(测试大小为20%,对应于上述交叉验证中的20%倍):
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=seed)
asd = model.fit(X_train, y_train, validation_data=(X_test, y_test), nb_epoch=epoch, batch_size=10)
Run Code Online (Sandbox Code Playgroud)
这再次给了我大约0.7的训练MCC,但在测试中也大约为0.7。我希望它们与上面的非常相似。
这两个代码片段是否真的试图找到相同的代码?对于相同的训练集,它们怎么可能是如此巨大地不同?
注意:第一个示例中的MCC似乎被卡住了,根本没有变化,而在第二个示例中,它却有所波动。