import numpy as np
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 666)
from sklearn.neighbors import KNeighborsClassifier
sk_knn_clf = KNeighborsClassifier(n_neighbors=4, weights="uniform")
sk_knn_clf.fit(X_train, y_train)
sk_knn_clf.score(X_test, y_test)
0.9916666666666667
Grid Search
para_grid = [
{
'weights':['uniform'],
'n_neighbors':[i for i in range(1, 11)]
},
{
'weights':['distance'],
'n_neighbors':[i for i in range(1, 11)],
'p':[i for i in range(1, 6)]
}
]
#para_grid是一个数组,其中每个元素是一个字典,每一个字典就是需要进行的一组网格搜索
#每一组网格搜索要列出相应参数的取值范围
#z字典的键是参数名称,值是一个列表,存放参数所有可能的取值范围
knn_clf = KNeighborsClassifier()
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(knn_clf,para_grid)
#传入的参数表示对哪个算法进行网格搜索以及网格搜索的参数
%%time
grid_search.fit(X_train, y_train)
Wall time: 33.1 s
GridSearchCV(cv='warn', error_score='raise-deprecating',
estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30,
metric='minkowski',
metric_params=None, n_jobs=None,
n_neighbors=5, p=2,
weights='uniform'),
iid='warn', n_jobs=None,
param_grid=[{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'weights': ['uniform']},
{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'p': [1, 2, 3, 4, 5], 'weights': ['distance']}],
pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
scoring=None, verbose=0)
grid_search.best_estimator_
#返回值即 对该分类器进行网格搜索的最佳参数
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=3, p=3,
weights='distance')
grid_search.best_score_
#对应的准确度,因为对算法的评判标准是多种的,可能这里的准确度不如之前的高
0.9853862212943633
grid_search.best_params_
#对于我们所搜索的数组而言,最佳的参数
#将最佳参数传给分类器
knn_clf = grid_search.best_estimator_
#使用最佳参数的kNN分类器的结果
knn_clf.score(X_test, y_test)
0.9833333333333333
%time
grid_search = GridSearchCV(knn_clf,para_grid, n_jobs = -1, verbose = 2)
#n_jobs代表调用cpu的核心数,默认值是1,-1表示调用全部核心
#verbose表示在搜索过程中的输出信息,是一个整数,一般用2
grid_search.fit(X_train, y_train)
Wall time: 0 ns
Fitting 3 folds for each of 60 candidates, totalling 180 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 12 concurrent workers.
[Parallel(n_jobs=-1)]: Done 17 tasks | elapsed: 2.8s
[Parallel(n_jobs=-1)]: Done 138 tasks | elapsed: 7.3s
[Parallel(n_jobs=-1)]: Done 180 out of 180 | elapsed: 9.0s finished
GridSearchCV(cv='warn', error_score='raise-deprecating',
estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30,
metric='minkowski',
metric_params=None, n_jobs=None,
n_neighbors=3, p=3,
weights='distance'),
iid='warn', n_jobs=-1,
param_grid=[{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'weights': ['uniform']},
{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'p': [1, 2, 3, 4, 5], 'weights': ['distance']}],
pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
scoring=None, verbose=2)