一、算法概述
来源:KNN算法最早是由Cover和Hart提出的一种分类算法。
注:K-近邻算法:需要做标准化处理。
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。
用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
1、距离计算公式
二、sklearn k-近邻算法API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
- n_neighbors:int,可选(默认=5),k_neighbors查询默认使用的邻居数
- algotithm:{‘auto’,'ball_tree',‘kd_tree’,'brute'},可选用计算最近邻居的算法:‘ball_tree’将会选用 BallTree,‘kd_tree’将使用KDTree。‘auto’将尝试根据传递给fit方法的值来决定最适合的算法。(不同实现方式影响效率)
三、预测入住位置
数据来源:链接:https://pan.baidu.com/s/1Ph-N1HEDlVxeD3jYjpNedA 提取码:vwi8
这项比赛的目的是预测一个人想签到哪个地方。为了比赛的目的,Facebook创建了一个人工世界,由10万乘10公里的正方形中的100,000多个地方组成。对于给定的一组坐标,您的任务是返回最可能的位置的排名列表。数据被制作成类似于来自移动设备的位置信号,从而使您具有处理真实数据(复杂的数值和嘈杂的值)所需的风味。不一致和错误的位置数据可能会破坏Facebook Check In等服务的体验。
在本案例中,将根据用户的位置,准确性和时间戳来预测用户正在检查的业务。
1、查看档案说明信息
2、具体处理流程
有无特征工程处理(标准化)区别:会影响到预测的准确率(做了标准化,准确率会提高)
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import pandas as pd
def knncls():
"""
k-近邻预测用户签到位置
:return: None
"""
#读取数据(获取)
file_path = "E:\python\pyData\\facebook-v-predicting-check-ins\\train.csv"
data = pd.read_csv(file_path)
print(data.info())
#处理数据
#1、缩小数据的范围(按照x,y),查询数据进行筛选
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)
time_value = pd.DatetimeIndex(time_value) #把日期格式转换成字典格式
print(time_value)
print("*"*100)
#构造一些新特征
data['day'] = time_value.day
data['hour'] = time_value.hour
data['weekday'] = time_value.weekday
data = data.drop(['time'], axis=1) #1代表列;把时间戳特征删除
#把签到数量少于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.fit_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()
不做特征化处理(标准化)结果:
做特征处理(标准化)结果:
四、K-近邻算法总结
1、K值取多大?有什么影响?
- K值取很小:容易受异常点的影响
- K值取很大:容易受K值数量(类型)的影响
2、优缺点明确
优点:
- 简单,易于理解,无需估计参数,无需训练
缺点:
- 懒惰算法,对测试样本分类时的计算量大,内存开销大
- 必须指定K值,K值选择不当,则分类精度不能保障
注:算法实例化中传入的参数叫做超参数,如n_neighbors
3、使用场景
小数据场景,几千~几万样本,具体场景、具体业务去测试