params = {'n_neighbors': range(1, 10)}
mdl = KNeighborsClassifier()
grid = GridSearchCV(mdl, param_grid=params)
grid.fit(X, y)

print('最优参数:', grid.best_params_)
print('最优得分:', grid.best_score_)

mdl = grid.best_estimator_

# 6.评估模型
y_pred = mdl.predict(X)
displayClassifierMetrics(y, y_pred, mdl.classes_)

y_prob = mdl.predict_proba(X)
displayROCurve(y, y_prob, mdl.classes_)

# 相关类
# KNeighborsClassifier(n_neighbors=5,weights=’uniform’,algorithm=’auto’,
#               leaf_size=30,p=2,metric=’minkowski’,metric_params=None,n_jobs=1,*kwargs)
# n_neighbors: int, 可选参数(默认为 5)
# weights(权重): str or callable(自定义类型), 可选参数(默认为 ‘uniform’)
# 用于预测的权重函数。可选参数如下:
# - ‘uniform’ : 统一的权重. 在每一个邻居区域里的点的权重都是一样的。
# - ‘distance’ : 权重点等于他们距离的倒数。使用此函数,更近的邻居对于所预测的点的影响更大。
# - [callable] : 一个用户自定义的方法,此方法接收一个距离的数组,然后返回一个相同形状并且包含权重的数组。
# algorithm(算法): {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, 可选参数(默认为 'auto')
# 计算最近邻居用的算法:
# - ‘ball_tree’ 使用算法[BallTree],适合高维数据集
# - ‘kd_tree’ 使用算法[KDTree],适合低维数据集