(一)机器学习入门与经典算法之KNN算法(第二期)

1.网格搜索寻找最优超参数

  • 1.什么是网格搜索法?
    答:网格搜索法是指参数值的一种穷举搜索方法,通过交叉验证的方式来优化得到最优的参数。通俗来说就是你给定一个参数p的范围(1,11),他会在这个范围里面将p的所有可能都进行计算,然后的到一个最优的p.
  • 2.怎么使用网格搜索?
    方法如下:
    代码中的我们有一个变量是param_grid,表示的意思是:参数名称作为键的字典以及用作值的参数设置列表,可以搜索任何参数设置序列;
    其实就可以理解为我们需要优化的超参数就放到param_grid里面,然后再给超参数一个范围,后面把它传入网格搜索中,找到更优的参数
from sklearn.model_selection import GridSearchCV
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier


digits = datasets.load_digits()
x = digits.data 
y = digits.target 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)

# 因为weights有两种形式,所以我们用两个字典来分别添加超参数
# 当weights='uniform'时,只用优化n_neighbors,给定n_neighbors的范围
# 当weights='distance'时,用优化n_neighbors,p,给定n_neighbors,p的范围
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()
# n_jobs表示并行处理,默认为1,主要看电脑是几核的
# knn_clf 表示要进行交叉验证的模型
# verbose表示显示交叉搜素的过程,有利于了解搜索状态,数值越大,输出信息月详细

# 1.创建网格,将模型和超参数序列(param_grid)传入
grid_search = GridSearchCV(knn_clf, param_grid, n_jobs=-1, verbose=2)    # 交叉验证

# 2.将训练集传入训练
grid_search.fit(x_train, y_train)
print('最佳的准确率:', grid_search.best_score_)
print('最佳的参数:', grid_search.best_params_)

2.数据归一化

  • (1)什么是数据归一化?
    答:数据归一化就是将数据压缩到一个单位,使数据的值处于【0,1】之间或者【-1,1】

  • (2)为什么要数据归一化?
    答:将数据归一化之后,可以加快训练数据的速度,加快收敛速度。

  • (3)归一化的方式:
    最值归一化:x = (x-minA) / (maxA-minA)
    均值归一化:x = (x-meanA) / std
    mean 表示给定数据的平均值, std 表示方差

  • (4)什么时候用最值,什么时候用均值归一化?
    答:最值归一化,将所有数据映射到0-1之间 X_scale = (X - X_min)/(X_max - X_min),适用于有明显边界的情况,例如成绩0-100, 但是受外界较大,比如工资,是没有明显边界的,所以不适合用最值归一化。
    均值方差归一化:所有数据归一到均值为0,方差为1, 适合使用数据没有明显分布的情况,一般都是用均值方差归一化。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)

standarscaler = StandardScaler()
standarscaler.fit(x_train)

# 对训练数据进行归一化处理
x_train = standarscaler.transform(x_train)

# 对测试数据也进行归一化
x_test_standard = standarscaler.transform(x_test)

knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(x_train, y_train)
score = knn_clf.score(x_test_standard, y_test)
print(score)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值