机器学习_K邻近算法

182 阅读2分钟
一.分类算法: KNN(k近邻算法)定义: 如果一个样本在特征空间中个K个最相似(即特征空间中最近邻)的样本中的大多数属于某一个类别, 则改样本也属于这个类别.
来源: KNN算法是最早是有Cover和Hart提出的分类算法
K值:很小 容易受噪声影响 , 很大 容易受数量影响
性能: 计算
优点: 简单, 易于理解, 易于实现, 无需估计参数, 无需训练
缺点:

[AppleScript]
纯文本查看
复制代码
1
2
- 惰性算法, 对测试样本分类是的计算量大, 内存开销大
- 必须制定k值, K值选择不当则分类精度不能保证


使用场景: 小数据场景, 几千~几万样本, 具体场景具体业务去测试
计算距离公式: 两个两本的距离可以通过欧式距离计算




API:

[AppleScript]
纯文本查看
复制代码
1
2
3
sklearn.neighbors.KNeighborsClassfier(n_neighbors=5,algorithm='auto')
n_neighbors: int, 可选(默认=5), k_neighbors 查询默认使用的邻居数
algorithm: {'auto','ball_tree','kd_tree','brute'},可选用于计算最近邻居的算法:'ball_tree'将会使用BallTRree,'kd_tree'将使用KDTree.'auto'将促使根据传递给fit方法的值来决定最合适的算法.(不同实现方法影响效率)



[Python]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
def knn():
"""
K近邻算法预测入住位置
:return: None
"""
# 读取数据
data = pd.read_csv('./train.csv')
# 特征工程
# 1. 缩小数据的范围 x,y
data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")
print(data)
# 2. 进行时间戳转换, 多构造特征
time_value = pd.to_datetime(data['time'], unit='s')
# 转换成字典格式
time_value = pd.DatetimeIndex(time_value)
print(time_value)
# 增加特征
data['weekday'] = time_value.weekday
data['day'] = time_value.day
data['hour'] = time_value.hour
# 3. 删除不要的特征time, axis 0行1列
data = data.drop(['time'], axis=1)
# 4. 目标值进行筛选, 避免预测类别太多(入住位置少于多少人的直接忽略)
place_count = data.groupby('place_id').count() # pandas 里的分组,
tf = place_count[place_count.row_id > 3].reset_index() # 入住人数大于3
data = data[data['place_id'].isin(tf.place_id)]
print(data)
# 拿出数据的特征值和目标值
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)
# 算法估计器
kn = KNeighborsClassifier()
kn.fit(x_train, y_train)
# 预测结果
print('+' * 20)
y_predict = kn.predict(x_test)
print('预测的准确率: ', kn.score(x_test, y_test))
return None
if __name__ == '__main__':
knn()



更多免费技术资料可关注:annalin1203