码迷,mamicode.com
首页 > 编程语言 > 详细

k-近邻(KNN) 算法预测签到位置

时间:2019-11-03 16:39:16      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:空间   idt   font   ESS   size   https   下载   筛选   删除   

分类算法-k近邻算法(KNN):

定义:

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

来源:

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

计算距离公式:

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

  技术图片

  技术图片

 

 sklearn k-近邻算法API:

技术图片

技术图片

问题:

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

  k值取很小:容易受到异常点的影响

  k值取很大:容易受最近数据太多导致比例变化

2. 性能问题

k-近邻算法的优缺点:

  优点:

    简单、易于理解,无需估计参数,无需训练

  缺点:

    懒惰算法,对测试样本分类时的计算量大,内存开销大

    必须制定k值,k值选择不当则分类精度不能保证

  使用场景:

    小数据场景,几千~几万样本,具体场景具体业务去测试

k近邻算法实例-预测签到位置:

数据来源:

  kaggle官网,链接地址:https://www.kaggle.com/c/facebook-v-predicting-check-ins/data  (需官网登录后下载)

数据的处理:

1. 缩小数值范围: DataFrame.query(),因为数据量过大,所以获取部分数据

2. 处理日期数据: pd.to_datetime() 、pd.DatetimeIndex(),两个pandas库的接口

3. 增加分割的日期数据: 把源数据里面的时间戳数据转换分割后,添加为新列,day、hour等

4. 删除没用的数据: pd.drop() ,pandas库的接口

5. 将签到位置少于n个用户的数据删除,一些pandas库知识:

  place_count = data.groupby(‘place_id‘).aggregate(np.count_nonzero)

  tf = place_count[place_count.row_id>3].rest_index()

  data = data[data[‘place_id‘].isin(tf.place_id)]

实例流程:

1. 数据集的处理

2. 分割数据集

3. 对数据集进行表转化

4. estimator流程进行分类预测

代码实现:

 1 import os
 2 import pandas as pd
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.neighbors import KNeighborsClassifier
 5 from sklearn.preprocessing import StandardScaler
 6 
 7 
 8 def knn_cls():
 9     """K-近邻算法预测用户签到的位置"""
10 
11     # 一、读取数据
12     fb_location = os.path.join(os.path.join(os.path.curdir, data), fb_location)
13     data = pd.read_csv(os.path.join(fb_location, train.csv))
14     # print(data.head(10))
15 
16     # 二、处理数据
17     # 1.缩小数据,查询数据筛选
18     data = data.query(x>1.0 & x<1.25 & y>2.5 & y<2.75)
19     # 2.处理时间的数据
20     time_value = pd.to_datetime(data[time], unit=s)  # 精确到秒
21     # print(time_value)
22     # 3.把日期格式转化为字典格式
23     time_value = pd.DatetimeIndex(time_value)
24     # 4.构造一些特征
25     data.loc[:,day] = time_value.day
26     data.loc[:,hour] = time_value.hour
27     data.loc[:,weekday] = time_value.weekday
28     # 5.把时间戳特征删除
29     data.drop([time], axis=1, inplace=True)
30     # print(data)
31     # 6.把签到数量小于n个目标位置删除
32     place_count = data.groupby(place_id).count()
33     tf = place_count[place_count.row_id>3].reset_index()
34     data = data[data[place_id].isin(tf.place_id)]
35     # 7.取出特征值和目标值
36     y = data[place_id]
37     x = data.drop([place_id, row_id], axis=1)
38     # 8.进行数据的分割,训练集和测试集
39     x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
40 
41     # 三、特征工程(标准化)
42     std = StandardScaler()
43     # 对测试集和训练集的特征值进行标准化
44     x_train = std.fit_transform(x_train)
45     x_test = std.transform(x_test)  # 这里用std.transform就不用fit去重新计算平均值标准差一类的了
46 
47     # 四、进行算法流程
48     knn = KNeighborsClassifier(n_neighbors=9)
49 
50     # fit, predict, score
51     knn.fit(x_train, y_train)
52 
53     # 四、得出预测结果和准确率
54     y_predict = knn.predict(x_test)
55     print(预测的目标签到位置为:, y_predict)
56     print(预测的准确率: , knn.score(x_test, y_test))
57 
58 
59 if __name__ == __main__:
60     knn_cls()

 

 

k-近邻(KNN) 算法预测签到位置

标签:空间   idt   font   ESS   size   https   下载   筛选   删除   

原文地址:https://www.cnblogs.com/springionic/p/11787590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!