我们可以使用在交叉验证过程中应用的相同数据集来拟合模型吗?
Can we fit a model using the same dataset applied during cross validation process?
我有以下方法对数据集执行交叉验证,然后进行最终模型拟合:
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
我了解交叉验证是关于评估您的模型与给定数据集的匹配程度。我的问题是:
- 用我在交叉验证过程中使用的相同数据集再次拟合模型在逻辑上是否正确?
- 每次CV折叠时,模型参数是否都执行到下一次折叠?比如在Neural Network的情况下,fold=1的拟合模型是否执行到fold=2?
- 这个过程(我的意思是像我上面那样拟合整个数据集)产生的模型精度是否接近我们在交叉验证后获得的平均精度?
谢谢
R1。最后,当您执行 CV 时,您将数据集拆分为 k 组,每次您将使用 k-1 组和 test/validate 数据的 1/k 来训练您的组(每次不同时间)。
R2。每次 MLP 以一组(k-1 个小集)执行学习时,学习任务再次开始,最后 MSE 的平均度量或误差度量是 k 个不同场景中的误差的平均值。
R3。如果数据中的 class 分布是 k-CV 的平衡结果,传统的 70/30 拆分将具有近似的概括。另一方面,如果数据集高度不平衡,则 k-CV (10) 将倾向于比传统拆分更好地学习泛化(因为数据将更有效地代表所有或大部分问题 classes)。
我有以下方法对数据集执行交叉验证,然后进行最终模型拟合:
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
我了解交叉验证是关于评估您的模型与给定数据集的匹配程度。我的问题是:
- 用我在交叉验证过程中使用的相同数据集再次拟合模型在逻辑上是否正确?
- 每次CV折叠时,模型参数是否都执行到下一次折叠?比如在Neural Network的情况下,fold=1的拟合模型是否执行到fold=2?
- 这个过程(我的意思是像我上面那样拟合整个数据集)产生的模型精度是否接近我们在交叉验证后获得的平均精度?
谢谢
R1。最后,当您执行 CV 时,您将数据集拆分为 k 组,每次您将使用 k-1 组和 test/validate 数据的 1/k 来训练您的组(每次不同时间)。
R2。每次 MLP 以一组(k-1 个小集)执行学习时,学习任务再次开始,最后 MSE 的平均度量或误差度量是 k 个不同场景中的误差的平均值。
R3。如果数据中的 class 分布是 k-CV 的平衡结果,传统的 70/30 拆分将具有近似的概括。另一方面,如果数据集高度不平衡,则 k-CV (10) 将倾向于比传统拆分更好地学习泛化(因为数据将更有效地代表所有或大部分问题 classes)。