什么是K-近邻算法(KNN)
根据邻居判断类型。如果一个样本在特征空间中有K个最相似(距离相近)的样本大多数属于一个类别,则该样品也属于这个类别。
如何求距离呢?非常简单,如图。
a1,a2,a3代表样本a的特征值 b1,b2,b3代表b的样本值,根据公式可以计算出a和b两个点的距离,各个特征值越相近,则距离越近。
K-近邻算法需要做标准化。
k-近邻算法的API(算法流程,无需考虑详细数据)
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_splitimport pandas as pddata = pd.read_csv("路径")# 缩小数据范围
# data.query() 相当于sql语句,写条件,进行筛选
data = data.query("x > 1.0 & x < 1.25")
# 处理时间的数据 pd.to_datetime
time_value = pd.to_datetime(data['time'], unit='s')
# 把日期格式转换为字典数据
time = pd.DatetimeIndex(time_value)
# 构造一些特征,
data['day'] = time.day
data['hour'] = time.hour
data['weekday'] = time.weekday
# sklearn 1表示列
data = data.drop(['time'], axis=1)
# 把签到数量少于n的目标位置删除
place_count = data.groupby('place_id').count()
# reset_index() 把place_id当做一个属性,以便获取到
tf = place_count[place_count.row_id > 3].reset_index()# 判断是否存在包含关系 ,果果数据中的 place_id 不在 tf.place_id 中,被过滤
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)
# 因为前面已经fit一次了, fit会计算平均值和标准差,不用再计算一次,直接transform
x_test = std.transform(x_test)
# 进行算法流程
knn = KNeighborsClassifier(n_neighbors=5)
# fit ,predict,score
fit = knn.fit(x_train, y_train)
# 得出预测结果
y_predict = fit.predict(x_test)
# 评估预测结果,得出准确率
knn.score(x_test, y_test)
K-近邻算法优缺点
优点:
- 简单,易于理解,易于实现,无需估计参数(超参数),无需训练。
缺点:
- K值取值 , K值取很小容易受异常点影响 , K取值很大 , 容易受数量波动影响。
- 性能问题