文章目录
- 一、超参数问题1
- 1、超参数:
- 2、如何寻找好的超参数?
- 二、超参数问题2
- 综上所述
- 三、超参数问题3
- 搜索明可夫斯基距离相应的p;
- 更多关于距离的定义:
- 欧拉距离
- 曼哈顿距离
- 进一步推广可以发现其中有一定一致性
- 明可夫斯基距离:(此时我们获得了一个新的超参数,这个超参数就是p)
- 其他也有用相似度代替计算距离的方式:
- 四、超参数问题4
一、超参数问题1
1、超参数:
在运行机器算法之前需要指定的参数,knn算法里面的k就是一个最为典型的超参数;
此处与超参数相对应的就是模型参数:
算法过程中学习的参数;
KNN算法中没有模型参数,KNN算法中的k是典型的超参数
调参调的参数也是超参数;
2、如何寻找好的超参数?
通过领域知识,经验数值,实验搜索;
这就是一个调参的过程,也就是面对一个算法去寻找最好的超参数的值
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
knn_clf=KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(x_train,y_train)
knn_clf.score(x_test,y_test)
best_score=0.0#先设定一个最好的准确度的值初始化为0
best_k=-1#其次我们设置一个变量存储我们已经找到的最好的一个k初始值为-1
for k in range(1,11):#循环查找k属于[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)
二、超参数问题2
(超参数问题之上改进一个bug)普通的k近邻算法,比如说k取三的时候,我们就找到当前离预测节点最近的三个点进行投票,由于可能存在的两蓝一红导致蓝胜却忽略了待测点离红的距离到底多近的情况,导致结果出现偏差,如右图所示;
或者当三个节点进行投票却遇到了三个不同的类,要将待测节点判定为三个类之一,此时投票却刚好是平票就导致无法区分;如右图所示,而此时,在普通knn算法的基础上加上权重函数,即可解决这些问题;
best_method=""
best_score=0.0#先设定一个最好的准确度的值初始化为0
best_k=-1#其次我们设置一个变量存储我们已经找到的最好的一个k初始值为-1
for method in["uniform","distance"]:
for k in range(1,11):#循环查找k属于[1,11)中最合适的
knn_clf=KNeighborsClassifier(n_neighbors=k,weights=method)
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
best_method=method
print("best_method=",best_method)
print("best_k=",best_k)
print("best_score=",best_score)
best_method="distance"
best_score=0.0#先设定一个最好的准确度的值初始化为0
best_k=-1#其次我们设置一个变量存储我们已经找到的最好的一个k初始值为-1
for k in range(1,11):#循环查找k属于[1,11)中最合适的
knn_clf=KNeighborsClassifier(n_neighbors=k,weights="distance")
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_method=",best_method)
print("best_k=",best_k)
print("best_score=",best_score)
综上所述
有时候考虑距离预测的结果其实并不如不考虑普通的预测结果准确;不同的数据集不同的考虑方式不同的随机抽取比率都可能对预测准确率有所影响会跟预想有偏差,故而用计算机计算准确率直观看结果更好;
三、超参数问题3
搜索明可夫斯基距离相应的p;
更多关于距离的定义:
欧拉距离
曼哈顿距离
进一步推广可以发现其中有一定一致性
明可夫斯基距离:(此时我们获得了一个新的超参数,这个超参数就是p)
其他也有用相似度代替计算距离的方式:
%time #由于p比较大的时候,运算执行比较慢,所以在这里使用计时函数进行计时
best_p=-1#p初始化为-1
best_score=0.0#先设定一个最好的准确度的值初始化为0
best_k=-1#其次我们设置一个变量存储我们已经找到的最好的一个k初始值为-1
for k in range(1,11):#循环查找k属于[1,11)中最合适的
for p in (1,6):
knn_clf=KNeighborsClassifier(n_neighbors=k,weights="distance",p=p)
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
best_p=p
print("best_p=",best_p)
print("best_k=",best_k)
print("best_score=",best_score)
四、超参数问题4
(直接查找到一个最好的超参数们的组合)超参数不仅仅如此,knn实际上还有更多的超参数,对这些超参数的选择就可以选用如上搜索的策略来找到适合我们的最好的超参数,事实上这种策略有一个名字叫做网格搜索;
超参数之间可能存在依赖的关系,我们怎么更好的一次性的把他们一一列出来运行一边程序就能得到最好的一个超参数的组合?
————事实上
scikit learing为网格搜索方式封装了一个专门的函数,grid search;
这里跑的时间四分多钟,属实是我的计算机性能不怎么样;
运行完网格搜索之后可以调用grid_search.best_estimator_,返回的是网格搜索搜索到的最佳分类器对应的参数:n_neighbors=3, p=3, weights=‘distance’;
这里查找到的最优超参数的值和之前方法找到的结果不同,这个原因是因为,在网格搜索当中用来评价分类器准确度的方式是更加复杂的一种方式,也就是CV——交叉验证;顾名思义这种方法获得的准确度相对来说更加准确;
在这里,如果我们想知道这个分类器对应的准确度到底是多少可以调用:grid_search.best_score_
这里看到的准确度没有之前的方法得出的数据更接近1似乎我们这个分类器效果不是那么好,其实并不是这样的,因为我们的评判标准是不一样的;
调用:grid_search.best_params_就可以得到对于我们数据集而言最佳参数是谁//拿到参数对应的分类器:knn_clf=grid_search.best_estimator_
对于待测数据预测的准确率:knn_clf.score(x_test,y_test)
#n_jobs计算机分配出几个核来进行并行处理(具体要看你的计算机到底有几个核)
#n_job=-1代表不管有几个全都用;verbose=2即在搜索的过程中进行一些输出,如果能看到运行过程中相应的一些信息就不会等的那么焦急并且可以帮我们
#即使了解当前搜索状态,verbose可以传入一个整数,这个值越大则相应输出的信息的值就越详细;
%%time
grid_search=GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=2)
grid_search.fit(x_train,y_train)
可以看到要搜索60种不同的情况;并且可以看到全核运转下运行时间为43秒,确实速度快了很多;
%%time
grid_search=GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=2)
grid_search.fit(x_train,y_train)