我有一个方法,先对数据集进行交叉验证,然后进行最终模型拟合:
import numpy as npimport utilities.utils as utilsfrom sklearn.model_selection import cross_val_scorefrom sklearn.neural_network import MLPClassifierfrom sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_splitimport pandas as pdfrom sklearn.utils import shuffledef 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 >>> 开始交叉验证 ... ') scores = cross_val_score(estimator=clf, X=df_features, y=df_labels, cv=5, n_jobs=-1) print("CV 准确率: %0.2f (+/- %0.2f)\n\n" % (scores.mean(), scores.std() * 2)) # 最终拟合 print('\t >>> 开始最终拟合 ... ') 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
我知道交叉验证是用来评估模型在给定数据集上的表现。我的问题是:
- 用我在交叉验证过程中使用过的相同数据集再次拟合模型在逻辑上是否正确?
- 在每次交叉验证折叠中,模型参数是否会传递到下一折?例如,在神经网络的情况下,从第一折拟合的模型是否会传递到第二折?
- 这个过程(我是指像我上面那样拟合整个数据集)是否会产生接近交叉验证后平均准确率的模型准确率?
谢谢
回答:
R1. 在进行交叉验证的最后阶段,你会将数据集分成k个子集,每次你会用k-1个子集进行训练,并用剩下的1/k数据进行测试/验证(每次不同)。
R2. 每次MLP在k-1个小数据集上进行学习时,学习任务会重新开始,最终的平均MSE或错误度量是k个不同场景中错误的平均值。
R3. 如果数据中的类别分布是平衡的,k折交叉验证和传统的70/30分割将具有近似的泛化能力。另一方面,如果数据集高度不平衡,k折交叉验证(如10折)将比传统分割(因为数据将更有效地代表所有或大多数问题类别)倾向于更好的学习泛化能力。