在kNN算法中 k参数被封装成n_neighbors参数
之前我们都是随意的传递3,5.
究竟传什么参数最好,这就涉及机器学习非常重要的问题:超参数
超参数:运行学习机器学习算法之前,需要指定的参数
例如kNN算法的k
与超参数对应的是模型参数
模型参数:算法过程中学习的参数
kNN算法只有超参数,没有模型参数
机器学习工程师要做的一个就是调参,就是调超参数
因为是在算法运行前需要我们运行的参数
寻找好的超参数:1.领域知识2.经验数值3.实验搜索
寻找最好的k
初始设置当前最好的准确率的值,和k
best_score = 0.0
besk_k = -1
for k in range(1,11):
knn_clf = KNeighborsClassifier(n_neighbors=k)
knn_clf.fit(X_train,y_train)
score = knn_clf.score(X_test,y_test)
if score > best_score:
best_k = k
best_score = score
print("best_k",best_k)
print("best_score",best_score)
我们发现最好的是4和0.991666666666667
这非常的简单
如果我们找到最好的k是10,我们有必要对10以上的数在进行搜索
因为通常来讲我们不同参数决定不同准确率,他们之间呈现连续的变化
如果我们找到最好的参数值,他在我们寻找的边界上,就意味着有更好的值在边界的外面,稍微拓展
比如如果是10我们就要8-20再一次
不要以为kNN就一个k超参数实际上还有一个超参数
我们忽略了最近的k个结点的距离
比如这个图,虽然蓝色投票获胜,但是红色的权重大
我们需要考虑距离权重
通常我们将距离倒数作为权重
红色:1 蓝色:1/3 + 1/4 =7/12
红色胜
我们考虑距离还有另一个优点
比如说有3类就可能平票
那么这时候就没办法了,考虑距离就是1
构造的参数还有一个重要的weights
默认值是uniform实际上是不考虑距离权重
有了kNN算法我们可以计算距离权重或者不计算
这个超参数就是distance还是uniform
对于我们手写数值,还是uniform和4比较高
另外引入一个话题
什么是距离
我们之前都是欧拉距离
另外还有曼哈顿距离
就是两个点在每个维度上相应的距离和
我们比较两个式子,得到推广获得
Minkowski Distance
当p=1就是欧拉距离
p=2就是欧拉距离
更大就是其他距离
获得了一个新的超参数就是p
我们对这个p来进行超参数调参
不过开根号运行速度比较慢我们可以计时
结果就是这样
发现即使是kNN还是有很多的超参数,其实还有更多,面对更多超参数可以用搜索策略来找到适合我们最好的超参数,事实上这种策略叫做网格搜索
超参数还存在依赖关系
我们怎么更好的一次性把我们想要的超参数全列出来?
事实上sl为我们网格搜索封装了一个函数