定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
两个样本的距离可以通过如下公式计算,又叫欧式距离
比如说,a(a1,a2,a3),b(b1,b2,b3)
sklearn k-近邻算法API
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
案例:在整体算法过程中需要进行的一些步骤
1、缺失值处理
2、特征处理:①构造新的特征(例如时间戳转换为时间:星期、月份、小时等)
②重要特征的筛选,筛选需要的重要的,不需要的删除
③当特征值特别多时(大于100个特征时),需要进行特征的降维处理
3、数据分割:切分为训练集和测试集
4、确定算法:例如k—近邻算法
5、构造模型:将训练集的数据输入算法中
6、预测测试集的特征结果:knn.predict(x_test)
7、对预测结果进行打分:knn.score(x_test,y_test),确定模型的精确度,至少70%才能用
此处利用位置预测案例进行说明
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris,load_digits
from sklearn.preprocessing import StandardScaler
#读取数据
tr=pd.read_csv('./train.csv')
#处理数据,缩小数据集
tr=tr.query('x>1.0 & x<1.25 & y>2.5 & y<2.75')#利用query函数将数据集进行缩小
#处理时间数据,将时间戳转换为日期时间格式
times=pd.to_datetime(tr['time'],unit='s')#将时间戳转换为时间的字符串,最小单位为秒的格式
times=pd.DatetimeIndex(times)#将时间的字符串转换为字典格式,此时时间为时间格式而非字符串
#处理数据,构造新的特征,月、星期、小时
tr['month']=times.month
tr['week']=times.weekday
tr['hour']=times.hour
#把时间戳特征删除
tr=tr.drop('time',axis=1)
#删除地址位置小于3个用户的删除
'''palce_count=tr.groupby('place_id').aggregate(np.count_nonzero)
将分类后的元素进行非零个数的统计,aggregate和agg是同一个函数,在其中输入对应的公式就可对对应的列进行聚合计算'''
palce_count=tr.groupby('place_id').count()#简化写法,将地址位置进行分组聚合
pc=palce_count[palce_count.row_id>3].reset_index()#将place_id从行坐标中放到数据中,重新设置行索引
tr=tr[tr['place_id'].isin(pc.place_id)]#将用户数大于3的地址取出来
#设置训练集和测试集
y=tr['place_id']#特征值
x=tr.drop(['place_id','row_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.fit_transform(x_test)
#确定算法模型
knn=KNeighborsClassifier(n_neighbors=5)
#对数据进行训练
knn.fit(x_train,y_train)
#输入测试特征值,预测目标值
y_pridict=knn.predict(x_test)
print('测试集的预测值为:',y_pridict)
#对预测结果进行打分,测算算法准确性
print('测试集的准确性为:',knn.score(x_test,y_test))
k-近邻算法中k值的取值:
k值取很小:容易受异常点影响
k值取很大:容易受最近数据太多导致比例变化
k-近邻算法优缺点: