嵌套交叉验证与整体模型验证

时间:2018-03-30 22:29:17

标签: python

我想在我的数据集上使用决策树模型来预测二进制目标变量。

我清理了数据并将数据拆分为功能和目标。

然后我将这些数据分成了测试和训练:

X_train, X_test, y_train, y_test = train_test_split( feature, target, test_size = 0.2, random_state = 100)

我已将列车数据拆分为火车并验证:

X_train, X_test, y_train, y_val = train_test_split( feature, target, test_size = 0.2, random_state = 100)

我已经为火车数据拟合了决策树模型:

clft = tree.DecisionTreeClassifier()

clft.fit(X_train,y_train)

我用这个模型来预测看不见的数据,即测试数据。 这样可以产生模型的准确性。

predictTree=clft.predict(X_test)
print (metrics.accuracy_score(predictTree, y_test))

然后我想使用嵌套交叉验证来提高这种准确性 并优化模型:

#set parameter grid
parameter_grid = {'max_depth': [1, 2, 3, 4, 5],
              'max_features': [1, 2, 3, 4]}
#specifiy cross validation
cross_validation = StratifiedKFold(n_splits=10)
cross_validation.get_n_splits(X_train, y_train)
#finds optimised parameters
grid_search = GridSearchCV(clft, param_grid = parameter_grid,
                      cv = cross_validation)
#best estimater is fitted for x_train and y_train
grid_search.fit(X_train, y_train)
#outer loop with cv 5
 scoresclt = model_selection.cross_val_score(grid_search, X_train, y_train, 
 cv=5)

我不确定嵌套的CV,在哪里使用验证集,以及从何处开始。

据我所知,该模型应该应用于测试集和验证集,以给出模型的正确准确性。

My Nested Cv,使用网格搜索作为内部循环,它位于由model_selection.cross_val_score运行的外部循环中。这是对的吗?

我应该将验证集放在嵌套CV中吗?或者我在验证集上使用嵌套Cv中的模型?然后,我是否将此精度计算为模型的真实准确度?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

你快到了。这就是我要做的事情:

训练并测试分组

首先将输入分为traintest;但我也会考虑领域知识。尽量让test设置为现实世界的代表。例如,如果输入是手写数字,并且您知道谁编写了哪些数字(即编写者),请选择一些“编写者”并将他们编写的所有内容作为测试集。或者,如果您的数据来自不同的实验室或医院,请将这些实验室以及他们提供的所有内容作为测试集。您应该将输入分为traintest的方式实际上取决于域。随机选择样本通常不是最好的选择。

嵌套交叉验证和参数网格

现在,您可以对train数据执行操作,即假设您的GridSearchCV为您的模型(sklearn为其提供与通常模型相同的API,因此您可以假装它是一个正常的模型,就像你在代码中所做的那样),并对该模型进行交叉验证以获得性能估计。接下来你要做的就是调整网格搜索的参数网格,以获得更好的性能。例如,在内核方法的情况下,您可以在搜索空间中包含或排除某些内核。

最终评估

找到您感觉满意的参数网格后,您可以将其应用于整个train数据,并在您预留的test上评估结果模型。如果您希望结果尽可能有效,那么在test数据上看到模型的结果后,请不要更改任何内容。在test设置上看到结果之前,请先进行优化。