为什么使用“for”手动搜索的结果比使用 GridsearchCV 更好?

Why does manual search with "for" result better than using GridsearchCV?

提问人:Kousha Zhiyani 提问时间:11/16/2023 最后编辑:desertnautKousha Zhiyani 更新时间:11/16/2023 访问量:46

问:

我阅读了几个使用 GridsearchCV 算法查找最佳超参数的地方,但是在 knn 算法中,我将邻居数设置为 3 并使用 train_test_spilt,它显示 7057 的差异,而当我使用 GridsearchCV 查找最佳邻居时,数字是 4。当我使用 4 时,显示差异是 11473 如何增加与最佳邻居数的差异? 法典:

import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error
from math import sqrt

file_data = pd.read_csv(r"C:\Users\Ashil-Rayan\Desktop\Data\RankHome\housePricelimit2.csv", header=None)
data = file_data.drop(6, axis=1)
target = file_data[6]

z = []
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=42)

#find best neighbor with for

for i in range(1,10):
    knn = KNeighborsRegressor(n_neighbors=i,  weights="distance",)
    knn.fit(X_train, y_train)
    predicts = knn.predict(X_test)
    result = mean_squared_error(y_test, predicts)
    result = sqrt(result)
    score = knn.score(X_test, y_test)
    z.append((i, result, score))
x = []
y = []
for i in z:
    x.append(i[0])
    y.append(i[1])
plt.scatter(x, y)
plt.xlabel("n_neighbors")
plt.ylabel("mean_squared_error")
plt.show()
print(z[1])
print(z[3])
#use GridsearchCV

parametrs = {"n_neighbors" : range(1, 50),
             "weights" : ["uniform", "distance"]}
Grid = GridSearchCV(KNeighborsRegressor(), parametrs)
Grid.fit(X_train, y_train)
print(Grid.best_params_)
# print(knn.predict([new_data]))
print(knn.score(X_test, y_test))

在此处输入图像描述

在此处输入图像描述

python 机器学习 scikit-learn knn gridsearchcv

评论

1赞 Nick ODell 11/16/2023
it shows a difference of 7057有什么区别?差异是好是坏?
0赞 Kousha Zhiyani 11/16/2023
不错,数字的平均值是100,000

答:

0赞 user1808924 11/16/2023 #1

您的“for”代码只执行 ;它不做“CV”部分。GridSearchCV

在“CV”期间,参数数据集被拆分为几个训练/评估子集。由于此类训练子集小于原始训练数据集,因此模型的泛化能力较低等。

对于KNN,应该特别清楚,其中嵌入式参考样本的总数非常重要。亲眼看看,打印出“for”代码与“GridSearchCV”代码的属性值。你的会高得多。KNeighborsRegressor.n_samples_fit_