k-近邻(KNN) 算法预测签到位置
分类算法-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()