机器学习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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淅淅同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值