我想在我的数据集上使用决策树模型来预测二进制目标变量 .
我清理了数据并将数据拆分为功能和目标 .
然后我将这些数据分成测试和训练:
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 回答
你快到了 . 这是我要做的:
Train and Test Split :
首先将输入拆分为
train
和test
;但我也会考虑领域知识 . 尝试将test
设置为现实世界的代表 . 例如,如果输入是手写数字并且您知道谁编写了哪些数字(即编写者),请选择一些"writers"并将他们提供的所有内容作为测试集 . 您应该将输入拆分为train
和test
的方式实际上取决于域 . 随机选择样品通常不是最佳选择 .Nested Cross Validation and Parameter Grid :
现在你可以对
train
数据做你做的事情,即假设你的GridSearchCV
是你的模型(sklearn
为它提供与通常模型相同的API,因此你可以假装它在代码中完成了's a normal model, as you')并做了一个交叉验证该模型以获得性能估计 . 接下来你要做的就是调整网格搜索的参数网格,以获得更好的性能 . 例如,在内核方法的情况下,您可以在搜索空间中包含或排除某些内核 .Final Evaluation :
一旦你熟悉了,你就可以在你的整个
train
数据上应用它,并在你留出的test
上评估结果模型 . 如果您希望结果尽可能有效,那么在test
数据上看到模型的结果后,永远不要更改任何内容 . 在您看到test
集上的结果之前进行优化 .