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

对于KNN的讲解分两期,这是上半部分

1.什么是KNN算法

答:所谓的KNN算法就是:每个样本都可以用它最接近的k个邻居来代表。就类似于“近朱者赤近墨者黑”,通过你周围的人来判断你是怎么样的一个人。

2.KNN算法有什么用

答:他可以用于分类预测,也可以用于回归预测,但是一般用于分类预测的比较多。

3.如何使用KNN

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

#1. 加载数据集
digits = datasets.load_digits()
x = digits.data    
y = digits.target  

#2. 对数据集进行分割,分出训练集(x_train,y_train)、测试集(x_test,y_test)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

# 3.创建KNN分类器my_knn_clf,参数n_neighbors=5表示用它周围的5个数据来预测
my_knn_clf = KNeighborsClassifier(n_neighbors=5)
# 4.将训练集数据喂入,使用fit函数
my_knn_clf.fit(x_train, y_train)
# 5.用测试集进行测试,输出一个预测值,使用predict进行预测
y_predict = my_knn_clf.predict(x_test)

# 6.计算准确率
score = my_knn_clf.score(x_test, y_test)
print(score)

4.优化KNN算法(参数)

  • 通过上面的代码我们就可以了解KNN最基本的使用过程了。
    可以发现,在上述代码中,创建分类器的时候参数n_neighbors=5,(也就是k=5),通过调整k的值,可以发现k对于预测结果是有影响的。那么如何选择最优的k呢?

  • 对于k的优化方法如下:

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)

# 假设最优的K为1,最优准确率为0
best_score = 0.0
best_k = 1
# 然后在(1,11)里面选择k的值,每得到一个k就能计算出一个准确率score,
# 将score和best_score进行比较,如果当前k得到的score比best_score好,则令best_k=k
# 如果k的值为(1,11)的边缘值,例如k=10,则需要在一个更大的范围(10,15)测试一下有没有比10更好的k

for k in range(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_score = score
        best_k = k

 print('best_k = ', best_k)
 print('best_score = ', best_score)
  • 仔细看看会发现,我们由样本周围的k个数据来进行分类。比如假设k=9,一个球sample,它的周围有五个红球,四个绿球,(每个球的权重都是1)则根据少数服从多数,则sample是红球。

  • 但是如果是下面这种情形,还把sample分类为红球,很明显就不合理了,说明每个球的权重都是1是不太合适的。那么就引入了权重的概念,接下来就开始看一下什么是权重以及怎么选择每一个数据的权重,最优化权重。
    在这里插入图片描述

5.什么是权重以及如何计算并优化权重?

  • 所谓权重(weights)就是一个样本对另一个样本的影响程度,影响程度大,占的权重就大。
  • 从上图看,我们会觉得不合理的原因是因为明显是整体上蓝色样本离sample比较近,却将它分类为红色。这是因为在上述例子中,每一个样本的权重都是一样的.所以说明在某些场合下权重都相等是不合适的。

weights有两种形式:
1.weights=’uniform’, 也就是权重都一样
2.weights=‘distance’,也就是权重和距离相关

  • *** 距离的计算公式:***在这里插入图片描述
    1.当weights=’uniform’时:我们不需要计算距离,只用管k就好了
    2.当weights='distance’时,通过距离公式计算距离,然后就可以求出权重了。

  • 由距离公式知,给定两个样本x,y,再给定一个超参数p,(p是我们自己定的)就可以求出距离了,也就可以求出权重了。而对于选择最优p的方法和k类似。

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)
best_score = 0.0
best_k = 1
best_p = 0
for k in range(1, 11):
    for p in range(1, 6):
        """weights = uniform的时候,就没有P参数
            weights = distance 时,需要有p参数"""
        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_k = ', best_k)
print('best_score = ', best_score)
print('best_p = ', best_p)

6.总结:

  • 流程:加载数据集 => 分割数据集 => 创建分类器 => 将训练集数据放进分类器训练 => 将测试集用于测试得到预测值 => 输出准确率
  • 超参数优化:weights=‘uniform’时,影响模型准确率的因素为k,当weights=‘distance’时,影响的因素有k,p
  • 现在讲述的优化超参数的方法都是最直接的最易于理解的,后面还有其他方法可以进行更好的优化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值