本文共 2234 字,大约阅读时间需要 7 分钟。
封面类算法的判定依据:离散型
思想:通过你的“邻居”来推断你的类型,相似的样本,特征之间的值应该都是相近的。定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
来源:KNN算法最早是由Cover和Hart提出的一种分类算法。
两个样本的距离可以通过如下公式计算,又叫欧式距离:
在计算两个样本数据的距离时,需要对数据做标准化处理。
sklearn k-近邻算法API:
sklean.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
预测一个人 住的位置。
分类:处理: 0<x<10 0<y<10
源代码:
from sklearn.neighbors import KNeighborsClassifierimport pandas as pdfrom sklearn.preprocessing import StandardScalerdef knncls(): """ k-紧邻预测用户签到位置 """ #读取数据 pd.read_csv("./data/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_datatime(data["time"],unit='s') print(time_value) #把日期格式转换成字典格式 pd.DatetimeIndex(time_value) #构造一些特征 data['day']=time_value.day data['hour']=time_value.hour data["weekday"]=time_value.weekday #把时间戳特征删除 data= data.drop("['time'],axis=1") print(data) #把签到数量少于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) 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()
输出的前十行数据:
输出处理时间的数据:
输出把时间戳删除后的数据data:标准化以前的预测值 :
标准化以后的预测值: 标准化以后,预测值从。0.2到了0.4,有明显的提高。1、k值取多大?有什么影响?
k值取很小时:容易受异常点影响。 k值取很大时:容易受k值数量(类别)的波动2、性能问题?
如果样本越来越大,运算时间非常长。3、优点:
简单,容易理解,易于实现,无需顾忌参数,无需训练。4、缺点:
懒惰算法,对测试样本分类的计算量大,内存开销大。 必须指定k值,k值选择不当则分类精度不能保证。5、使用场景:
小数据场景,几千~几万样本,具体场景具体业务去测试。转载地址:http://ovcsi.baihongyu.com/