是否可以在多输入神经网络中使用来自 sklearn 的 StratifiedKFold?

Posted

技术标签:

【中文标题】是否可以在多输入神经网络中使用来自 sklearn 的 StratifiedKFold?【英文标题】:Is it possible to use StratifiedKFold from sklearn in multi input Neural Networks? 【发布时间】:2019-03-29 10:13:41 【问题描述】:

我有一个数据集,可以以 python dictionarylist 的形式传递给多输入神经网络:

示例

#dict
'input1': X1, 'input2': X2, 'input3': X3, 'output': Y
#list
[ X1, X2, X3], y

现在我想使用 K 折交叉验证 来估计我的模型的性能。你认为我可以像在这个单输入示例中那样使用sklearn 中的StratifiedKFold 吗?

for train, test in kfold.split(X, Y):
  # create model
    model = Sequential()
    model.add(Dense(12, input_dim=8, activation='relu'))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    # Fit the model
    model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0)
    # evaluate the model
    scores = model.evaluate(X[test], Y[test], verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
    cvscores.append(scores[1] * 100)

否则,最好的方法是什么?

【问题讨论】:

您也可以使用 SKF。但据我所知,最好将字典转换为 pandas 数据框。此外,sklearn 支持 KerasClassifier/KerasRegressor,因此您可以像这里一样重写您的代码:machinelearningmastery.com/… 是的,但它们不适用于多输入... 【参考方案1】:

skf.split() 返回索引,它仅取决于 Y:

for train_index, test_index in skf.split(X, y):
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]

因此,您可以在此处传递任何 X 数组(甚至将第 1 层的 X1 转换为数据帧或合成 X)。然后你把你的

train_index

test_index

并过滤所有输入。

同样,skf() 仅取决于您的 Y。所以目标是传递正确的 Y 并获取索引。

其他方式:将您在输出中的所有输入合并到一个数据框中,并为每一层保留列名。在这种情况下,您有一个“大”X。首先将其拆分为 train_index 和 test_index,然后使用您在上面保存的列名拆分为 X1、X2 和 X3。

【讨论】:

我今天早上做了同样的事情!无论如何,我会将其发布为解决方案,因为它应该如何工作!实际上我只通过了 Y:kfold = KFold(n_splits=5) for train_indices, test_indices in kfold.split(Y): train_1, train_2, train_3, train_4 = data[0][train_indices], data[1][train_indices], data[2] [train_indices],数据[3][train_indices]` 很高兴听到,弗朗西斯科!谢谢! @FrancescoPegoraro 仅在 Y 上拆分时,我可以在 StratifiedKFold 中使用 shuffel=True 吗? @Daisy:我不明白为什么不...你试过了吗? 也许这是一个愚蠢的问题,但我认为它只会洗牌 Ys。

以上是关于是否可以在多输入神经网络中使用来自 sklearn 的 StratifiedKFold?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在网络上的python中集成机器学习算法

来自 UIImage 的 MLMultiArray 用于 sklearn

Sklearn Linear SVM 无法在多标签分类中进行训练

是否可以使用不同的数据集作为 AdaBoostRegressor (sklearn) 中的预测输入?

使用 MatplotLib 可视化来自 SKlearn Kmeans 的稀疏输入

sklearn Logistic Regression - 使用来自外部测试数据的自定义输入进行预测