分类算法----K近邻算法:
算法描述:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
(一)最重要的一点就是求距离。
距离公式----欧氏距离
上述公式就是求了两者之间的距离。
相似的样本,特征值之间的值应该是相似的。
附加:
K-近邻算法:为防止某一项对结果的影响,需要做标准化处理。
(二)API:
API: sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors
:
int,
可选(默认
= 5
),
k_neighbors
查询默认使用的邻居数
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
算法:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
def knncls():
"""K-近邻算法"""
# 读取数据
data = pd.read_scv("读取文件位置")
# 数据处理
# 1 缩小数据范围,查询数据
data = data.query("x > 1.0 & x < 1.25")
# 处理事件
time_value = pd.to_datetime(data["time"], unit="s")
# 日期格式转换成字典格式
time_value = pd.DatetimeIndex(time_value)
# 构造一些特征
data["day"] = time_value.day
data["hour"] = time_value.hour
# 删除掉原来的时间戳 1:列
data.drop(["time"], axis= 1)
# 删除签到人数少的
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)
# 数据的分割
train_x, test_x, train_y,test_y = train_test_split(x, y ,test_size=0.25)
# 特征工程(标准化)
std = StandardScaler()
# 对测试训练集进行标准化
train_x = std.fit_transform(train_x)
test_x = std.transform(test_x)
# 进行算法流程
knn = KNeighborsClassifier(n_neighbors=5)
# fit, predict, ````
knn.fit(train_x, train_y)
# 得出预测结果
y_predict = knn.predict(test_x)
print("预测结果", y_predict)
# 预测准确率
print("准确率:", knn.score(test_x, test_y))
if __name__ == '__main__':
knncls()
总结:
k值取很小:容易受异常点影响
k值取很大:容易受最近数据太多导致比例变化
•
优点:
•
简单,易于理解,
易于实现,无需估计参数,无需训练
•
缺点:
•
懒惰算法,对测试样本分类时的计算量大,内存开销大
•
必须指定
K
值,
K
值选择不当则分类精度不能保证