目录
1 基本概念
1.1 定义
1.2 sklearn k-近邻算法API
2 kaggle实例:预测facebook签到位置
2.1 实例背景
2.2 文件说明
2.3 案例分析
2.3.1 分类
2.3.2 处理
2.4 代码及分析
2.4.1 代码分析
2.4.2 完整代码
3 K值的选择
4 流程
5 knn算法的优缺点
5.1 优点
5.2 缺点
如何求距离? 欧氏距离。相似的样本,特征之间的值应该都是相近的。
如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
sklearn.neighbours.KNeighborsClassifier(n_neighbors=5,algorithm="auto")
特征值:x,y坐标,定位准确性、时间,日,时,周
目标值:入住位置的id
原数据:
把签到数量少于n个目标位置删除
place_count=data.groupby("place_id").count()
tf=place_count[place_count.row_id>3].reset_index()
data=data[data["place_id"].isin(tf.place_id)]
处理后的数据:
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(data={'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]})
>>> df
A B C
0 1 4 7
1 2 5 8
2 3 6 9
>>> df.reset_index() # 会将原来的索引index作为新的一列
index A B C
0 0 1 4 7
1 1 2 5 8
2 2 3 6 9
>>> df
A B C
0 1 4 7
1 2 5 8
2 3 6 9
>>> df.reset_index(drop=True) # 使用drop参数设置去掉原索引
A B C
0 1 4 7
1 2 5 8
2 3 6 9
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.preprocessing import StandardScaler
def knncls():
"""
k近邻预测用户签到位置
:return:None
"""
#读取数据
data= pd.read_csv("C:\\Users\\zoutong\Desktop\\programming\\data\\machine learning\\facebook-v-predicting-check-ins\\train.csv\\train.csv")
print(data.head(10))
#处理数据
#1、缩小数据,查询数据筛选
data=data.query("x>1.0&x<1.25&y>2.5&y<2.75")
#2、处理时间的数据
time_value=pd.to_datetime(data["time"],unit="s")
print(time_value)
#3、把日期格式转换成字典
time_value=pd.DatetimeIndex(time_value)
#4、构造一些特征
data["day"]=time_value.day
data["hour"] = time_value.hour
data["weekday"] = time_value.weekday
#5、把时间戳特征删除
data= data.drop(["time"],axis=1)
print(data)
#6、把签到数量少于n个目标位置删除
place_count=data.groupby("place_id").count()
tf=place_count[place_count.row_id>3].reset_index()
data=data[data["place_id"].isin(tf.place_id)]
#取出数据当中的特征值和目标值
y=data["place_id"]
x=data.drop(["place_id"],axis=1)
#进行数据的分割训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
#特征工程(标准化)
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__':
knncls()
预测的目标签到位置为: [2327054745 1097200869 8258328058 ... 2553180323 8048985799 5606572086]
预测的准确率: 0.4134751773049645
如果选择较小的K值,就相当于用较小的邻域中的训练实例进行预测,学习的近似误差会减小,只有与输入实例较近的训练实例才会对预测结果起作用,单缺点是学习的估计误差会增大,预测结果会对近邻的实例点分成敏感。如果邻近的实例点恰巧是噪声,预测就会出错。换句话说,K值减小就意味着整体模型变复杂,分的不清楚,就容易发生过拟合。
如果选择较大K值,就相当于用较大邻域中的训练实例进行预测,其优点是可以减少学习的估计误差,但近似误差会增大,也就是对输入实例预测不准确,K值得增大就意味着整体模型变的简单
**近似误差:**可以理解为对现有训练集的训练误差。
**估计误差:**可以理解为对测试集的测试误差。
近似误差关注训练集,如果k值小了会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。模型本身不是最接近最佳模型。
估计误差关注测试集,估计误差小了说明对未知数据的预测能力好。模型本身最接近最佳模型。
在应用中,K值一般取一个比较小的数值,通常采用交叉验证法来选取最优的K值。
1) 计算已知类别数据集中的点与当前点之间的距离
2) 按距离递增次序排序
3) 选取与当前点距离最小的k个点
4) 统计前k个点所在的类别出现的频率
5) 返回前k个点出现频率最高的类别作为当前点的预测分类