《机学五》KNN算法及实例

一、概述

【定义】如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

二、距离计算公式

两个样本的距离可以通过如下公式计算,又叫【欧式距离】

设有特征,a(a1,a2,a3),b(b1,b2,b3),那么:
\[\sqrt{(a1-b1)^{2}+(a2-b2)^{2}+(a3-b3)^{2}}\]

三、sklearn k-近邻算法API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
  • n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
  • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:
    ‘ball_tree’将会使用 BallTree
    ‘kd_tree’将使用 KDTree
    ‘auto’将尝试根据传递给fit方法的值来决定最合适的算法 (不同实现方式影响效率)

四、实战

数据位置:https://www.kaggle.com/c/facebook-v-predicting-check-ins/data

五、数据的处理

1、缩小数据集范围

DataFrame.query()

2、处理日期数据

pd.to_datetime
pd.DatetimeIndex

3、增加分割的日期数据

4、删除没用的日期数据

pd.drop

5、将签到位置少于3个用户的删除

#按place_id列进行分组,并数出每个地方有多少次签到
place_count =data.groupby('place_id').aggregate(np.count_nonzero)
#入住次数>3个的拿出来,place_id放到最后做为一个特征,前面加一个新索引列0-n
tf = place_count[place_count.row_id > 3].reset_index()
#原表的place_id,存在上一步新建的表里的,单独拿出来做为新数据
data = data[data['place_id'].isin(tf.place_id)]

六、Knn算法实战

数据集示例(trian.csv):

6.1.初步knn,暂时不用特征工程(标准化)

此处分为两步:

  1. 因为数据集太大选择一部分数据进行处理choisecsv()
  2. 进行knn算法knndemo()
  3. 可以看到此时准确率仅为2.7%
import pandas as pd
from sklearn.model_selection import train_test_split  #数据集分割成:测试集、训练集模块
from sklearn.neighbors import KNeighborsClassifier #knn近邻算法模块

def choisecsv():
    """
    选取一部分数据保存为新表格
    :return:
    """
    # 【1】读取数据
    path = "D:\\a\\data\\facebook-v-predicting-check-ins\\train.csv"
    data = pd.read_csv(path)
    # print(data.head(10))

    # 【2】因为数据集太大,只选取一部分数据,保存一个新表格
    data = data.query("x > 1.0 &  x < 1.25 & y > 2.5 & y < 2.75")
    print(data.head(10))
    data.to_csv('train_s.csv',index=False) #第2参数,不要在新csv里最前列自动加索引

def demoknn():
    """
    根据输入坐标,预测入住地点
    :return:
    """
    data=pd.read_csv("train_s.csv")

    #【1】时间戳(785470):转化时间列的时间戳为时间类似:1970-1-1 12:00:00
    time_value=pd.to_datetime(data['time'],unit='s')
    #print(time_value)

    #(1.1)把日期转化为字典格式
    time_value=pd.DatetimeIndex(time_value)

    # (1.2)根据时间字典构造一些新特征:月,天,时,星期几
    data['mouth']=time_value.month
    data['day'] = time_value.day
    data['hour'] = time_value.hour
    data['weekday'] = time_value.weekday

    #(1.3)删除时间戳列。pd里0是行,1是列
    data=data.drop(['time'],axis=1)
    #print(data.head(10))

    #【2】删除入驻数量少于3次的地方
    place_count=data.groupby('place_id').count() #按place_id列进行分组,并数出每个地方有多少次签到
    tf = place_count[place_count.row_id > 3].reset_index() #入住次数>3个的拿出来,place_id放到最后做为一个特征,前面加一个新索引列0-n
    data = data[data['place_id'].isin(tf.place_id)]  #原表的place_id,存在上一步新建的表里的,单独拿出来做为新数据
    #print(data.sample(10))

    #【3】取得特征值x、目标值y
    y=data['place_id']
    x=data.drop('place_id',axis=1)

    #【4】分割数据集
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)

    #【5】特征工程(标准化)(暂时跳过)

    #【6】执行Knn算法
    knn=KNeighborsClassifier(n_neighbors=5)

    #【7】fit(处理),执行算法(到此模型已训练完成)
    knn.fit(x_train,y_train)

    #【8】预测结果predict(输入测试集进行预测)
    y_predict=knn.predict(x_test)
    print('预测的位置为:',y_predict)

    #【9】算出准确率scroe(对模型进行测试集的预测,的准确率计算):
    print('准确率为:',knn.score(x_test,y_test))

if __name__=="__main__":
    #choisecsv() #选取部分数据创建一个新表并保存
    demoknn() #knn实例

'''结果(可以看到此次准确率很低):
预测的位置为: [1097200869 4423196276 4932578245 ... 3312463746 1479000473 1097200869]
准确率为: 0.027659574468085105
'''

6.2提升预测准确率1:进行特征工程处理(标准化)

接上例代码,在第5步加上(特征工程——标准化)处理后再预测,可以看到准确率一下由上例的2.7%,一下提升到41.3%

    #【5】特征工程(标准化)对测试集、训练集的特征值进行,标准化
    std=StandardScaler()
    x_train=std.fit_transform(x_train)
    x_test=std.fit_transform(x_test)

'''结果:
预测的位置为: [3312463746 7803770431 2327054745 ... 1602053545 5270522918 1267801529]
准确率为: 0.4134751773049645
'''

6.3 提升预测准确率2:删除无关特征

排查发现row_id这列和预测数据结果无关,会对结果造成影响,因此删除
此时发现准确率由:41%变47%
关键代码:

    # (2.1)此处打印发现row_id这列特征值与预测没有相关性,会影响模型预测结果;因此把它删除:训练特征集、测试特征集都要删除
    data=data.drop(['row_id'],axis=1)

源码如下:

import pandas as pd
from sklearn.model_selection import train_test_split  #数据集分割成:测试集、训练集模块
from sklearn.neighbors import KNeighborsClassifier #knn近邻算法模块
from sklearn.preprocessing import StandardScaler #特征工程 标准化 模块

def choisecsv():
    """
    选取一部分数据保存为新表格
    :return:
    """
    # 【1】读取数据
    path = "D:\\a\\data\\facebook-v-predicting-check-ins\\train.csv"
    data = pd.read_csv(path)
    # print(data.head(10))

    # 【2】因为数据集太大,只选取一部分数据,保存一个新表格
    data = data.query("x > 1.0 &  x < 1.25 & y > 2.5 & y < 2.75")
    print(data.head(10))
    data.to_csv('train_s.csv',index=False) #第2参数,不要在新csv里最前列自动加索引

def demoknn():
    """
    根据输入坐标,预测入住地点
    :return:
    """
    data=pd.read_csv("train_s.csv")

    #【1】时间戳处理:转化时间列的时间戳为时间
    time_value=pd.to_datetime(data['time'],unit='s')
    #print(time_value)
    #(1.1)把日期转化为字典格式
    time_value=pd.DatetimeIndex(time_value)

    # (1.2)根据时间字典构造一些新特征:月,天,时,星期几
    data['mouth']=time_value.month
    data['day'] = time_value.day
    data['hour'] = time_value.hour
    data['weekday'] = time_value.weekday

    #(1.3)删除时间戳列。pd里0是行,1是列
    data=data.drop(['time'],axis=1)
    #print(data.head(10))

    #【2】删除入驻数量少于3次的地方
    place_count=data.groupby('place_id').count() #数出一共有多少个地方
    tf = place_count[place_count.row_id > 3].reset_index() #入住次数>3个的拿出来,place_id放到最后做为一个特征,前面加一个新索引列0-n
    data = data[data['place_id'].isin(tf.place_id)]  #原表的place_id,存在上一步新建的表里的,单独拿出来做为新数据
    #print(data.sample(10))

    # (2.1)此处打印发现row_id这列特征值与预测没有相关性,会影响模型预测结果;因此把它删除:训练特征集、测试特征集都要删除
    data=data.drop(['row_id'],axis=1)

    #【3】取得特征值x、目标值y
    y=data['place_id']
    x=data.drop('place_id',axis=1)

    #【4】分割数据集
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
    # print(x_train)

    #【5】特征工程(标准化)对测试集、训练集的特征值进行,标准化
    std=StandardScaler()
    x_train=std.fit_transform(x_train)
    x_test=std.fit_transform(x_test)

    #【6】执行Knn算法
    knn=KNeighborsClassifier(n_neighbors=5)

    #【7】fit(处理),执行算法(到此模型已训练完成)
    knn.fit(x_train,y_train)

    #【8】预测结果predict(输入测试集进行预测)
    y_predict=knn.predict(x_test)
    print('预测的位置为:',y_predict)

    #【9】算出准确率scroe(对模型进行测试集的预测,的准确率计算):
    print('准确率为:',knn.score(x_test,y_test))

if __name__=="__main__":
    #choisecsv() #选取部分数据创建一个新表并保存
    demoknn() #knn实例
'''结果
预测的位置为: [7803770431 1097200869 3533177779 ... 4932578245 5606572086 1097200869]
准确率为: 0.4761229314420804
'''

6.4提升预测准确率3:K值调整等

1.调整k值关键代码:

1、k值取多大?有什么影响?

  • k值取很小:容易受异常点影响
  • k值取很大:容易受最近数据太多导致比例变化

2、性能影响:k近邻每个都要进行数值运算,当数据非常多时,非常耗时

    #【6】执行Knn算法
    knn=KNeighborsClassifier(n_neighbors=6)
'''结果:经多次调试发现
k值调整成6预测准确率最高变为:
48%
'''

七、K近邻总结

k-近邻算法步骤

  1. 导入相关模块
  2. 对数据进行初步处理(处理时间戳成新特征、删除无关特征)
  3. 对数据进行划分:分成训练集、测试集
  4. 进行特征工程处理:一般用标准化
  5. 进行knn算法
import pandas as pd
from sklearn.model_selection import train_test_split  #数据集分割成:测试集、训练集模块
from sklearn.preprocessing import StandardScaler #特征工程 标准化 模块
from sklearn.neighbors import KNeighborsClassifier #knn近邻算法模块

详情见上一节代码……

k-近邻算法优缺点

优点:

  • 简单,易于理解,易于实现,无需估计参数,无需训练

缺点:

  • 懒惰算法,对测试样本分类时的计算量大,内存开销大
  • 必须指定K值,K值选择不当则分类精度不能保证
  • 使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试

原文地址:https://www.cnblogs.com/chenxi188/p/11961962.html

时间: 2024-10-14 10:17:43

《机学五》KNN算法及实例的相关文章

机器学习经典算法详解及Python实现--K近邻(KNN)算法

(一)KNN依然是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归.如果K=1,那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产

机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离近期的邻居进行分类推断(投票法)或者回归.假设K=1.那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习.数据都有明白的label(分类针对离散分布,回归针对连续分布),依据机器学习产

机器学习之二:K-近邻(KNN)算法

一.概述 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.KNN算法中,所选择的邻居都是已经正确分类的对象.该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别. KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关.由于KNN方法主要靠周

Hadoop伪分布安装详解+MapReduce运行原理+基于MapReduce的KNN算法实现

本篇博客将围绕Hadoop伪分布安装+MapReduce运行原理+基于MapReduce的KNN算法实现这三个方面进行叙述. (一)Hadoop伪分布安装 1.简述Hadoop的安装模式中–伪分布模式与集群模式的区别与联系. Hadoop的安装方式有三种:本地模式,伪分布模式,集群(分布)模式,其中后两种模式为重点,有意义 伪分布:如果Hadoop对应的Java进程都运行在一个物理机器上,称为伪分布 分布:如果Hadoop对应的Java进程运行在多台物理机器上,称为分布.[集群就是有主有从] 伪

K-NN算法 学习总结

1. K-NN算法简介 K-NN算法 ( K Nearest Neighbor, K近邻算法 ), 是机器学习中的一个经典算法, 比较简单且容易理解. K-NN算法通过计算新数据与训练数据特征值之间的距离, 然后选取 K (K>=1) 个距离最近的邻居进行分类或者回归. 如果K = 1 , 那么新数据将被分配给其近邻的类. K-NN算法是一种有监督学习, K-NN算法用于分类时, 每个训练数据都有明确的label, 也可以明确的判断出新数据的label, K-NN用于回归时也会根据邻居的值预测出

人工智能--第二天--KNN算法

一.概述 1.概念:K近邻(k-Nearest Neighbor, 简称KNN)算法是一种非常简单的机器学习监督算法. 2.主要思想:即时给定一个训练数据集,对于新的数据样本,在训练集中找到与该样本最邻近的k个样本,统计这k个样本的多数所属类,就把这个样本归结到这个所属类中. 3.根据维基百科的图解进行分析 如上图所示,有红色三角形,蓝色正方形俩类数据,图中绿色的圆点代表带分类的数据,下面我们根据k近邻算法给绿色圆点进行分类 如果k=3,绿色圆点最近邻的三个点是 2红 1 蓝,结果显而易见,少数

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

Python KNN算法

机器学习新手,接触的是<机器学习实战>这本书,感觉书中描述简单易懂,但对于python语言不熟悉的我,也有很大的空间.今天学习的是k-近邻算法. 1. 简述机器学习 在日常生活中,人们很难直接从原始数据本身获得所需信息.而机器学习就是把生活中无序的数据转换成有用的信息.例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有多大的作用,然而当某几个特定单词同时出现时,再辅以考虑邮件的长度及其他因素,人们就可以更准确地判定该邮件是否为垃圾邮件. 机器学习分为监督学习和无监督学习,其中: (1)监督学

KNN算法与Kd树

最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知样本的类别,以全部训练样本作为代表点,计算未知样本与所有训练样本的距离,并以最近邻者的类别作为决策未知样本类别的唯一依据.但是,最近邻算法明显是存在缺陷的,比如下面的例子:有一个未知形状(图中绿色的圆点),如何判断它是什么形状? 显然,最近邻算法的缺陷--对噪声数据过于敏感,为了解决这个问题,我们可