机器学习笔记: GridSearchCV——寻找最好的超参数

网格搜索

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=4,weights="uniform")
knn_clf.fit(X_train,y_train)
knn_clf.score(X_test,y_test)
0.9916666666666667

Grid Search

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)

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)]
    }
]

# 实例化一个空的分类器
from sklearn.neighbors import KNeighborsClassifier
knn_clf=KNeighborsClassifier()
from sklearn.model_selection import GridSearchCV
grid_search=GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=2)
#n_jobs表示运行内核数,-1表示全部内核都运行,verbose表示输出

%%time
grid_search.fit(X_train,y_train)
Fitting 5 folds for each of 60 candidates, totalling 300 fits


[Parallel(n_jobs=-1)]: Using backend LokyBackend with 4 concurrent workers.
[Parallel(n_jobs=-1)]: Done  33 tasks      | elapsed:    3.4s
[Parallel(n_jobs=-1)]: Done 154 tasks      | elapsed:   18.6s


Wall time: 44.7 s


[Parallel(n_jobs=-1)]: Done 300 out of 300 | elapsed:   44.6s finished





GridSearchCV(cv=None, error_score=nan,
             estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30,
                                            metric='minkowski',
                                            metric_params=None, n_jobs=None,
                                            n_neighbors=1, p=2,
                                            weights='uniform'),
             iid='deprecated', n_jobs=-1,
             param_grid=[{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                          'weights': ['uniform']},
                         {'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                          'p': [1, 2, 3, 4, 5], 'weights': ['distance']}],
             pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
             scoring=None, verbose=2)
 #得到最好的模型best_estimatoe_
grid_search.best_estimator_
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
                     metric_params=None, n_jobs=None, n_neighbors=1, p=2,
                     weights='uniform')
# 最好模型的准确率
grid_search.best_score_
0.9860820751064653
# 返回最佳参数
grid_search.best_params_
{'n_neighbors': 1, 'weights': 'uniform'}
knn_clf=grid_search.best_estimator_
knn_clf.score(X_test,y_test)
0.9833333333333333

更多距离定义

余弦相似度计算:

  • 评估两个向量的夹角的相似度,计算两个向量的夹角余弦值 .
  • 相似度越小,距离越大。相似度越大,距离越小。
    在这里插入图片描述

调整余弦相似度

  • 调整余弦相似性是通过在计算余弦公式之前减去平均值来实现的。
  • 解决cosine相似度仅考虑向量维度方向上的相似而没考虑到各个维度的量纲的差异性,所以在计算相似度的时候,做了每个维度减去均值的修正操作。
    在这里插入图片描述

皮尔逊相关系数

  • Pearson correlation 相关系数主要考虑线性相关性,定义为两个变量之间的协方差和标准差的商,所以自然的考虑了均值的修正操作。
  • 皮尔逊相关系数适用于:
    • (1)、两个变量之间是线性关系,都是连续数据。
    • (2)、两个变量的总体是正态分布,或接近正态的单峰分布。
    • (3)、两个变量的观测值是成对的,每对观测值之间相互独立。
      皮尔斯相关系数

Jaccard相似系数(IoU啊)

给定两个集合A,B jaccard 系数定义为A与B交集的大小与并集大小的比值,jaccard值越大说明相似度越高,当A和B都为空时, j a c c a r d ( A , B ) = 1 jaccard(A,B)=1 jaccard(A,B)=1
在这里插入图片描述

小结

cosine相似度,其实就是归一化后的点积结果,
Pearson相关系数是去中心化&归一化的点积结果
修正cosine相似度,也是去中心化&归一化的点积结果,与Pearson的差别就在于去中心化的差异。

反思:grid_search.fit(X_train,y_train)报错原因

  1. weights写成了weight
  2. 要重新导入sklearn的包,不然报错,具体原因我也不知道。视频里没报错,但是自己运行却报错
param=[
    {
        '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)]
    }
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值