【问题标题】:How is the size of each k folds defined?每个 k 折叠的大小是如何定义的?
【发布时间】:2017-04-10 21:01:37
【问题描述】:

我目前正在使用交叉验证训练我的回归网络,我没有任何标签,但是应该映射到特定输出的特定输入,然后网络应该生成映射。我似乎对如何正在定义折叠。

我做交叉验证的方式是这样的:

############################### Training setup ##################################

#Define 10 folds:
seed = 7
np.random.seed(seed)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
print "Splits"
cvscores_loss = []

for train, test in kfold.split(train_set_data_vstacked_normalized,train_set_output_vstacked):

    print "Model definition!"
    model = Sequential()

    #act = PReLU(init='normal', weights=None)
    model.add(Dense(output_dim=400,input_dim=400, init="normal",activation=K.tanh))

    #act1 = PReLU(init='normal', weights=None)
    model.add(Dense(output_dim=400,input_dim=400, init="normal",activation=K.tanh))

    #act2 = PReLU(init='normal', weights=None)
    model.add(Dense(output_dim=400, input_dim=400, init="normal",activation=K.tanh))

    act4=ELU(10000)
    model.add(Dense(output_dim=13, input_dim=300, init="normal",activation=act4))

    print "Compiling"
    model.compile(loss='mean_squared_error', optimizer='RMSprop',  metrics=["accuracy"])
    print "Compile done! "

    print '\n'

    print "Train start"
    model.fit(train_set_data_vstacked_normalized[train],train_set_output_vstacked[train], nb_epoch=10, verbose=1)

    loss, accuracy = model.evaluate(x=train_set_data_vstacked_normalized[test],y=train_set_output_vstacked[test],verbose=1)
    print
    print('loss: ', loss)
    print('accuracy: ', accuracy)
    print()
    print model.summary()
    print "New Model:"
    cvscores_loss.append(loss)


print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores_loss), numpy.std(cvscores_loss)))

此代码的问题是我从不进入 for 循环。在打印“Splits”后收到警告消息...它是。

Splits
/home/k/.local/lib/python2.7/site-packages/sklearn/model_selection/_split.py:579: Warning: The least populated class in y has only 1 members, which is too few. The minimum number of groups for any class cannot be less than n_splits=10.

这让人质疑 kfold 如何知道我的神经网络的输入和输出维度是多少?...

我应该在某个地方定义它吗?或者如何?..

【问题讨论】:

    标签: python-2.7 scikit-learn keras cross-validation


    【解决方案1】:

    消息告诉您问题所在。您的目标班级之一只有 1 名成员。当它分层为 10 个折叠时,每个类至少需要 10 个成员,这样它才能在每个折叠中放置 1 个。

    您需要检查目标类的计数以找到违规类并将其删除。

    【讨论】:

    • 这是一个回归问题..所以我没有这样的课程..我正在训练我的网络以正确地将某个输入映射到某个输出。某些输出不是标签,而是长度为 13 的原始特征。train_set_output_vstacked[0] 也输出。
    • StratifiedKFold 需要类。使用 KFold 进行回归。或者,如果您使用 cross_val_score,那么它将根据您是在进行回归还是分类来选择使用哪个。
    【解决方案2】:

    我认为你把事情复杂化了。如果需要对 Keras 模型做交叉验证,可以使用keras scikit-learn API。为此,您需要:

    导入一些东西:

    from keras.wrappers.scikit_learn import KerasClassifier
    from sklearn.model_selection import StratifiedKFold
    from sklearn.model_selection import cross_val_score
    

    创建一个定义模型的函数:

    def model_creation():
        model = Sequential()
        model.add(...)
        ...
        model.compile(...)
        return model
    

    并使用包装器:

    model = KerasClassifier(build_fn=model_creation, nb_epoch=100, batch_size=100, verbose=0)
    kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
    results = cross_val_score(model, X, y, cv=kfold)
    

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 2017-12-09
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多