机器学习-kNN-寻找最好的超参数

一 、超参数和模型参数

  • 超参数:在算法运行前需要决定的参数
  • 模型参数:算法运行过程中学习的参数

- kNN算法没有模型参数
- kNN算法中的k是典型的超参数

  寻找好的超参数

  • 领域知识
  • 经验数值
  • 实验搜索

二、通过sklearn中的数据集进行测试

    

import numpy as np
from sklearn import datasets
# 装载sklearn中的手写数字数据集
digits = datasets.load_digits()
x = digits.data
y = digits.target
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 将数据分成训练数据集合测试数据集,
# 测试数据集占全部数据的20%,
# 设置随机种子为666
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state = 666)
# 设置k为3
knn_clf = KNeighborsClassifier(n_neighbors=3)
# 训练数据模型
knn_clf.fit(x_train,y_train)
# 通过测试数据计算预测结果准确率,并打印出来
print(knn_clf.score(x_test,y_test))

输出结果:0.9888888888888889

三、考虑距离?不考虑距离?

kNN存在一种平票的情况,就是距离最近的k个点中相应类的数量相等,这是需要考虑距离了。

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
from sklearn.neighbors import KNeighborsClassifier
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state = 666)
best_method = ‘‘
best_score = 0.0
best_k = -1
for method in [‘uniform‘,‘distance‘]:
    for k in range(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_method = method
            best_score = score
            best_k = k
print(‘best_method = %s‘%best_method)
print(‘best_k = %d‘%best_k)
print(‘best_score = %f‘%best_score)

运行结果:

best_method = uniform

best_k = 4

best_score = 0.991667

四、搜索 明可夫斯基距离 相应的p

欧拉距离,曼哈顿距离,明可夫斯基距离

几种距离的定义

由上可以获取一个超参数p。

%%time
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
from sklearn.neighbors import KNeighborsClassifier
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state = 666)
best_p = ‘‘
best_score = 0.0
best_k = -1
# for method in [‘uniform‘,‘distance‘]:
for k in range(1,11):
    for p in range(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_p = p
            best_score = score
            best_k = k
print(‘best_p = %s‘%best_p)
print(‘best_k = %d‘%best_k)
print(‘best_score = %f‘%best_score)

运行结果:

best_p = 2

best_k = 3

best_score = 0.988889

Wall time: 47.5 s

四、网格搜索kNN最好的参数

sklearn中通过网格搜索可以更快更全面的搜索更好的参数。

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
from sklearn.neighbors import KNeighborsClassifier
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state = 666)
knn_clf = KNeighborsClassifier(n_neighbors=4,weights=‘uniform‘)
knn_clf.fit(x_train,y_train)
knn_clf.score(x_test,y_test)
param_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)]
    }
]
knn_clf = KNeighborsClassifier()
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(knn_clf,param_grid)
# 需要运行2-5分钟,保持耐心
grid_search.fit(x_train,y_train)
grid_search.best_estimator_ # 最佳的参数对象
grid_search.best_score_   # 准确率
grid_search.best_params_  # 最佳的参数
#为计算机分配资源,输出搜索信息,n_jobs:分配计算机核数,-1位有多少用多少,verbose:为打印信息的等级,值越大,信息越多
grid_search = GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=10)
grid_search.fit(x_train,y_train)

五、更多的距离定义

  • 向量空间余弦相似度 Cosine Similarity
  • 调整余弦相似度 Adjusted Cosine Similarity
  • 皮尔森相关系数 Pearson Correlation Coefficient
  • Jaccard相似系数 Jaccard Coefficient
 

原文地址:https://www.cnblogs.com/taoke2016/p/9149566.html

时间: 2024-11-08 19:57:51

机器学习-kNN-寻找最好的超参数的相关文章

机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size

机器学习算法中如何选取超参数:学习速率.正则项系数.minibatch size 本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习算法中,如何选取初始的超参数的值.(本文会不断补充) 学习速率(learning rate,η) 运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率η.下面讨论在训练时选取η的策略. 固定的学习速率.如果学习速率太小,则会使收敛过慢,如果学习速率太大,则会导致代价

机器学习:kNN的超参数

一.评测标准 模型的测评标准:分类的准确度(accuracy): 预测准确度 = 预测成功的样本个数/预测数据集样本总数 二.超参数 超参数:运行机器学习算法前需要指定的参数: kNN算法中的超参数:k.weights.P: 一般超参数之间也相互影响: 调参,就是调超参数: 1)问题 # 以kNN算法为例 平票:如果k个点中,不同类型的样本数相等,怎么选取? 如果选取的k个点中,数量多的一类样本点距离测试样本较远,数量少的一类样本点距离测试样本较近,此时选取数量较多的类型作为输出结果,不具说服力

机器学习 | 特征工程- 超参数调优方法整理

特征工程是机器学习当中很重要的部分,可以帮助我们设计.创建新特征,以便模型从中提取重要相关性.本文将记录并持续更新相关特征工程的工具包介绍,包括自动模型选择和超参数调优等各方面. · Featuretools Featuretools 是一个开源的Python 库,用于自动化特征工程.自动特征工程能够缩减时间成本,构建更优秀的预测模型,生成更有意义的特征,还能防止数据泄漏(data leakage). 目标任务:从数据表格集中获取所有的数据信息并整合到一张表中,再创建特征. 解决方案:采用深度特

Spark2.0机器学习系列之2:基于Pipeline、交叉验证、ParamMap的模型选择和超参数调优

Spark中的CrossValidation Spark中采用是k折交叉验证 (k-fold cross validation).举个例子,例如10折交叉验证(10-fold cross validation),将数据集分成10份,轮流将其中9份做训练1份做验证,10次的结果的均值作为对算法精度的估计. 10折交叉检验最常见,是因为通过利用大量数据集.使用不同学习技术进行的大量试验,表明10折是获得最好误差估计的恰当选择,而且也有一些理论根据可以证明这一点.但这并非最终结论,争议仍然存在.而且似

机器学习 —— 用于超参数随机化搜索的几个分布

机器学习中超参数搜索的常用方法为 Grid Search,然而如果参数一多则容易碰到维数诅咒的问题,即参数之间的组合呈指数增长.如果有 \(m\) 个参数,每个有 \(n\) 个取值,则时间复杂度为 \(\Theta(n^m)\). Bengio 等人在 <Random Search for Hyper-Parameter Optimization> 中提出了随机化搜索的方法.他们指出大部分参数空间存在 "低有效维度 (low effective dimensionality)&qu

【机器学习】超参数调优

超参数调优方法 网格搜索 通过查找搜索范围内的所有的点来确定最优值.如果采用较大的搜索范围以及较小的步长,网络搜索有很大概率找到全局最优值.然而,这种搜索方案十分消耗计算资源和时间,特别是需要调优的超参数比较多的时候,因此,在实际应用中,网格搜索法一般会使用较广的搜索范围和步长,来寻找全局最优值可能的位置:然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值.这种方案可以降低所需的时间和计算量,但由于目标函数一般是非凸的,所以很可能会错过全局最优值. 随机搜索 理论依据是如果样本集足够大,那么通过

机器学习:SVM(scikit-learn 中的 RBF、RBF 中的超参数 γ)

一.高斯核函数.高斯函数 μ:期望值,均值,样本平均数:(决定告诉函数中心轴的位置:x = μ) σ2:方差:(度量随机样本和平均值之间的偏离程度:, 为总体方差,  为变量,  为总体均值,  为总体例数) 实际工作中,总体均数难以得到时,应用样本统计量代替总体参数,经校正后,样本方差计算公式:S^2= ∑(X-  ) ^2 / (n-1),S^2为样本方差,X为变量,  为样本均值,n为样本例数. σ:标准差:(反应样本数据分布的情况:σ 越小高斯分布越窄,样本分布越集中:σ 越大高斯分布越

如何选取一个神经网络中的超参数hyper-parameters

1.什么是超参数 所谓超参数,就是机器学习模型里面的框架参数.比如聚类方法里面类的个数,或者话题模型里面话题的个数等等,都称为超参数.它们跟训练过程中学习的参数(权重)是不一样的,通常是手工设定的,经过不断试错来调整,或者对一系列穷举出来的参数组合一通枚举(叫做网格搜索).深度学习和神经网络模型,有很多这样的参数需要学习. 2.一些启发式规则 在实际应用中,当你使用神经网络去解决问题时,很难找到好的超参数.假设我们现在正在处理MINIST数据库的问题,并且对超参数是如何使用的一无所知.假设我们大

深度学习模型超参数搜索实用指南

要知道,与机器学习模型不同,深度学习模型里面充满了各种超参数.而且,并非所有参数变量都能对模型的学习过程产生同样的贡献. 考虑到这种额外的复杂性,在一个多维空间中找到这些参数变量的最佳配置并不是件容易的事情. 每一位科学家和研究人员,都希望在现有的资源条件下(计算.金钱和时间),找到最佳的模型. 通常情况下,研究人员和业余爱好者会在开发的最后阶段尝试一种搜索策略.这可能会有助改进他们辛辛苦训练出来的模型. 此外,在半自动/全自动深度学习过程中,超参数搜索也是的一个非常重要的阶段. 超参数到底是什