我们可以使用在交叉验证过程中应用的相同数据集来拟合模型吗?

时间:2018-08-02 19:11:00

标签: machine-learning classification cross-validation

我有以下方法对数据集执行交叉验证,然后进行最终模型拟合:

import numpy as np
import utilities.utils as utils
from sklearn.model_selection import cross_val_score
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.utils import shuffle

def CV(args, path):

    df = pd.read_csv(path + 'HIGGS.csv', sep=',')
    df = shuffle(df)
    df_labels = df[df.columns[0]]
    df_features = df.drop(df.columns[0], axis=1)
    clf = MLPClassifier(hidden_layer_sizes=(64, 64, 64),
                        activation='logistic',
                        solver='adam',
                        learning_rate_init=1e-3,
                        max_iter=1000,
                        batch_size=1000,
                        learning_rate='adaptive',
                        early_stopping=True
                        )

    print('\t >>> Start Cross Validation ... ')
    scores = cross_val_score(estimator=clf, X=df_features, y=df_labels, cv=5, n_jobs=-1)
    print("CV Accuracy: %0.2f (+/- %0.2f)\n\n" % (scores.mean(), scores.std() * 2))


    # Final Fit
    print('\t >>> Start Final Fit ... ')
    num_to_read = (int(10999999) * (args.stages * np.dtype(np.float64).itemsize))
    C1 = utils.read_from_disk(path + 'HIGGS.dat', 0, num_to_read, args.stages)
    print(C1)
    print(C1.shape)
    r = C1[:, :1]
    C = np.delete(C1, 0, axis=1)

    tr_C, ts_C, tr_r, ts_r = train_test_split(C, r, train_size=.8)
    clf.fit(tr_C, tr_r)
    prd_r = clf.predict(ts_C)
    test_acc = accuracy_score(ts_r, prd_r) * 100.

    return test_acc

我了解交叉验证是关于评估给定数据集的模型效果。我的问题是:

  1. 通过在交叉验证过程中使用的同一数据集再次拟合模型在逻辑上是否正确?
  2. 在每个CV折叠期间,是否将模型参数进行到下一个折叠?例如,对于神经网络,是否执行了从fold = 1到fold = 2的拟合模型?
  3. 此过程(我的意思是像上面一样拟合整个数据集)是否产生的模型准确度接近交叉验证后获得的平均准确度?

谢谢

1 个答案:

答案 0 :(得分:0)

R1。最后,在执行简历时,您会将数据集分成k个集合,每次您要使用k-1个集合训练集合并使用1 / k数据进行测试/验证(每次都不同)

R2。每次MLP用一组(k-1个小集合)执行学习时,学习任务都会重新开始,最后,MSE的平均度量或误差度量是k个不同场景中误差的平均值。

R3。如果数据中的类别分布是k-CV的平衡结果,则传统的70/30拆分将具有近似的概括。另一方面,如果数据集高度不平衡,则k-CV(10)会比传统的分裂方法更好地学习归纳法(因为数据将更有效地代表所有或大多数问题类别)。