机器学习sklearn k-近邻算法

机器学习sklearn k-近邻算法

分类算法_k近邻算法(KNN)

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

来源: KNN算法最早是由Cover和Hart提出的一种分类算法

例:

在这里插入图片描述

求出距离:

在这里插入图片描述

结合为:

在这里插入图片描述

如何求距离?

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

比如说,a(a1,a2,a3),b(b1,b2,b3)
( a 1 − b 1 ) 2 + ( a 2 − b 2 ) 2 + ( a 3 − b 3 ) 2 \sqrt{(a1- b1)^2+(a2 - b2)^2+(a3-b3)^2} (a1b1)2+(a2b2)2+(a3b3)2
相似的样本,特征之间的值应该都是相近的

K-近邻算法:需要做标准化处理

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方法的值来决定最合适的算法。(不同实现方式影响效率)

Facebook比赛案例:

使用k—近邻预测用户签到位置

from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
def knn_cls():
    """
    k—近邻预测用户签到位置
    Returns:
    """
    # 读取数据
    # test_data = pd.read_csv('../facebook-v-predicting-check-ins/test/test.csv')
    train_data = pd.read_csv('../facebook-v-predicting-check-ins/train/train.csv')
    # print(train_data.head(10))

    # 处理数据
    # 1、由于数据量大,为了节省时间可以将x,y缩小
    train_data = train_data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")

    # 2、处理时间的数据
    times = pd.to_datetime(train_data['time'],unit='s')
    # print(times)

    # 把日期格式转换成 字典格式
    time_value = pd.DatetimeIndex(times)
    # print(time_value)

    # 构造一些特征
    # train_data['day'] = train_data.loc[:,time_value.day]
    train_data.loc[:,'day'] = time_value.day
    train_data.loc[:,'hour'] = time_value.hour
    train_data.loc[:,'weekday'] = time_value.weekday

    # # 把时间戳特征删除
    train_data = train_data.drop(['time'], axis=1)  # 这里的axis 1是列  0是行
    # print(train_data)

    # 把签到数量少于n个的目标位置删除
    place_count = train_data.groupby('place_id').count()
    # print(place_count)
    tf = place_count[place_count.row_id > 3].reset_index()
    # print(tf)
    train_data = train_data[train_data['place_id'].isin(tf.place_id)]
    # print(train_data)
    # print(tf)

    # 取出数据当中的特征值和目标值
    # 目标值
    y = train_data['place_id']
    # 特征值
    x = train_data.drop(['place_id'],axis=1).drop(['row_id'],axis=1)

    # 进行数据的分割训练集和测试集
    from sklearn.model_selection import train_test_split
    # 注意返回值, 训练集 train  x_train, y_train   测试集 test   x_test  y_test
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)

    # 特征工程(标准化)
    from sklearn.preprocessing import StandardScaler
    std = StandardScaler()

    # 对测试集和训练集的特征值进行标准化
    x_train = std.fit_transform(x_train)

    x_test = std.transform(x_test)

    # 进行算法流程
    knn = KNeighborsClassifier(n_neighbors=5)

    # fit, predict, score
    knn.fit(x_train,y_train)

    # 得出预测结果
    y_predict = knn.predict(x_test)
    print("预测的目标签到位置为:", y_predict)

    # 得出准确率
    print("预测的准确率:", knn.score(x_test, y_test))

    return None


if __name__ == '__main__':
    knn_cls()

k-近邻算法优缺点

  • 优点:
    • 简单,易于理解,易于实现,无需估计参数,无需训练
    • 重新训练的代价低
    • 适合类域交叉样本
      • KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
    • 适合大样本自动分类
      • 该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分
  • 缺点:
    • 懒惰算法,对测试样本分类时的计算量大,内存开销大

      • KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多
    • 必须指定K值,K值选择不当则分类精度不能保证

    • 类别评分不是规格化

      • 不像一些通过概率评分的分类
    • 输出可解释性不强

      • 例如决策树的输出可解释性就较强
    • 对不均衡的样本不擅长

      • 当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
    • 计算量较大

      • 目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。
  • 使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值