【问题标题】:Grid Search parameter and cross-validated data set in KNN classifier in Scikit-learnScikit-learn 中 KNN 分类器中的网格搜索参数和交叉验证数据集
【发布时间】: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


    【解决方案1】:
    1. 是的,您可以在整个数据集上进行 CV,这是可行的,但我仍然建议您至少将数据分成 2 组,一组用于 CV,一组用于测试。

    2. .score 函数应该根据documentation 返回单个float 值,这是best estimator 的得分(这是您从拟合@987654325 中获得的最佳得分估计量) @) 在给定的 X,Y 上

    3. 如果您看到最好的参数是 14,那么您可以继续在模型中使用它,但如果您给它更多参数,您应该设置所有参数。 (- 我这么说是因为你没有给出你的参数列表)是的,再次检查你的简历是合法的,以防万一这个模型是否和它应该的一样好。

    希望能让事情更清楚:)

    【讨论】:

    • 真的,当我在第 2 点中使用 clf.score(X,Y) 时,它实现了我想要的 - 一个使用所有数据的交叉验证分类器。如果我继续使用带有最佳参数的 cross_val_score(knn2, X, Y, cv=5) (是的,只有一个),这将像您在第 3 点中指出的那样仔细检查 CV。
    • 意思是我的第2点和第3点都是合法的方法?
    【解决方案2】:

    如果数据集很小,您可能无法进行训练/测试拆分。人们通常仅根据交叉验证来估计模型的预测能力。在上面的代码中,当您拟合模型 (clf.fit(X, y)) 时,GridSearchCV 通过将训练集拆分为内部训练集 (80%) 和验证集 (20%) 执行 5 倍交叉验证。

    您可以通过clf.cv_results_ 访问模型性能指标,包括验证分数。您要查看的指标包括mean_test_score(在您的情况下,每个n_neighbor 应该有1 分)。您可能还想打开“mean_train_score”以了解模型是否过度拟合。有关模型设置,请参见下面的示例代码(注意 knn 是一个非参数 ML 模型,它对特征的比例很敏感,因此人们经常使用 StandardScaler 对特征进行归一化):

        pipe = Pipeline([
            ('sc', StandardScaler()),     
            ('knn', KNeighborsClassifier(algorithm='brute')) 
        ])
        params = {
            'knn__n_neighbors': [3, 5, 7, 9, 11] # usually odd numbers
        }
        clf = GridSearchCV(estimator=pipe,           
                          param_grid=params, 
                          cv=5,
                          return_train_score=True) # Turn on cv train scores
        clf.fit(X, y)
    

    快速提示:样本数量的平方根通常是n_neighbor 的一个不错选择,因此请确保将其包含在 GridSearchCV 中。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 2013-01-29
      • 2017-06-23
      • 2018-04-02
      • 2015-11-06
      • 2014-08-27
      • 2016-04-25
      • 2017-10-07
      • 2017-10-07
      相关资源
      最近更新 更多