【发布时间】:2017-03-30 19:18:30
【问题描述】:
我正在尝试使用 SciKit-Learn 执行我的第一个 KNN 分类器。我一直在关注用户指南和其他在线示例,但有些事情我不确定。对于这篇文章,让我们使用以下内容
X = 数据 Y = 目标
1) 在我读过的大多数机器学习介绍页面中,似乎都说您需要一个训练集、一个验证集和一个测试集。据我了解,交叉验证允许您结合训练集和验证集来训练模型,然后您应该在测试集上对其进行测试以获得分数。但是,我在论文中看到,在很多情况下,您可以对整个数据集进行交叉验证,然后将 CV 分数报告为准确度。我了解在理想情况下,您希望对单独的数据进行测试,但如果这是合法的,我想对我的整个数据集进行交叉验证并报告这些分数
2) 所以开始这个过程
我将我的 KNN 分类器定义如下
knn = KNeighborsClassifier(algorithm = 'brute')
我搜索最佳 n_neighbors 使用
clf = GridSearchCV(knn, parameters, cv=5)
现在如果我说
clf.fit(X,Y)
我可以使用检查最佳参数
clf.best_params_
然后我可以得到一个分数
clf.score(X,Y)
但是 - 据我了解,这并没有交叉验证模型,因为它只给出 1 分?
如果我现在看到 clf.best_params_ = 14,我可以继续吗
knn2 = KNeighborsClassifier(n_neighbors = 14, algorithm='brute')
cross_val_score(knn2, X, Y, cv=5)
现在我知道数据已经过交叉验证,但我不知道使用 clf.fit 找到最佳参数然后将 cross_val_score 与新的 knn 模型一起使用是否合法?
3) 我知道“正确”的做法如下
拆分为X_train、X_test、Y_train、Y_test, 缩放训练集 -> 将变换应用于测试集
knn = KNeighborsClassifier(algorithm = 'brute')
clf = GridSearchCV(knn, parameters, cv=5)
clf.fit(X_train,Y_train)
clf.best_params_
然后我可以得到一个分数
clf.score(X_test,Y_test)
在这种情况下,分数是使用最佳参数计算的吗?
我希望这是有道理的。我一直在尝试在不发布的情况下尽可能多地找到,但我已经到了我认为更容易获得一些直接答案的地步。
在我的脑海中,我试图使用整个数据集获得一些交叉验证的分数,但也使用网格搜索(或类似的东西)来微调参数。
提前致谢
【问题讨论】:
标签: scikit-learn cross-validation knn grid-search