我想在我的数据集上使用决策树模型来预测二进制目标变量。
我清理了数据并将数据拆分为功能和目标。
然后我将这些数据分成了测试和训练:
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中的模型?然后,我是否将此精度计算为模型的真实准确度?
提前谢谢。
答案 0 :(得分:2)
你快到了。这就是我要做的事情:
训练并测试分组:
首先将输入分为train
和test
;但我也会考虑领域知识。尽量让test
设置为现实世界的代表。例如,如果输入是手写数字,并且您知道谁编写了哪些数字(即编写者),请选择一些“编写者”并将他们编写的所有内容作为测试集。或者,如果您的数据来自不同的实验室或医院,请将这些实验室以及他们提供的所有内容作为测试集。您应该将输入分为train
和test
的方式实际上取决于域。随机选择样本通常不是最好的选择。
嵌套交叉验证和参数网格:
现在,您可以对train
数据执行操作,即假设您的GridSearchCV
为您的模型(sklearn
为其提供与通常模型相同的API,因此您可以假装它是一个正常的模型,就像你在代码中所做的那样),并对该模型进行交叉验证以获得性能估计。接下来你要做的就是调整网格搜索的参数网格,以获得更好的性能。例如,在内核方法的情况下,您可以在搜索空间中包含或排除某些内核。
最终评估:
找到您感觉满意的参数网格后,您可以将其应用于整个train
数据,并在您预留的test
上评估结果模型。如果您希望结果尽可能有效,那么在test
数据上看到模型的结果后,请不要更改任何内容。在test
设置上看到结果之前,请先进行优化。