文章目录
学习最简单的分类算法-K近邻算法
前言
一、K近邻算法的数学基础?
你的“邻居”来推断出你的类别
预测影片是爱情片
二、分类算法-k近邻算法(KNN)
1.定义
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
2.计算公式
计算距离公式
3. K近邻API
三、代码实例化演示
1.案例:
2. 数据的处理
3. 实例流程
1、数据集的处理
2、分割数据集
3、对数据集进行标准化
4、estimator流程进行分类预测
""
@author: Administrator
@file: 03_K近邻算法.py
@time: 2021/10/20
@desc:
通过K近邻算法,训练模型,预测客户的place_id
"""
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def kuns():
#1.读取训练集数据
data=pd.read_csv(r"F:\future\5-机器学习\facebook-v-predicting-check-ins\train.csv")
"""
一、处理数据
"""
#2.缩小数据范围
#print(data.head(3))
data=data.query("x>1 & x <1.25 & y >2.5 & y <2.75")
# 3.处理日期数据
time_value=pd.to_datetime(data["time"],unit="s")
# 4. 将时间序列转化为字典格式的时间序列
time_v=pd.DatetimeIndex(time_value)
data.loc[:,"day"]=time_v.day#利用loc 而非data["列名"]=value,因为只会将value的copy添加到df的新列上
data.loc[:,"hour"]=time_v.hour
data.loc[:,"weekdays"]=time_v.weekday
#5. 删除时间戳-time
data=data.drop("time",axis=1)
# 6. 将签到位置中少于3个用户的place_id进行删除
# 6.1 将place_id 进行分组与统计:
place_count=data.groupby("place_id").count()#place_count是df类型,并且与data中place_id数据一致,其他是次数
"""随便取一个column,将次数阈值设置为3"""
tf=place_count[place_count["row_id"]>3].reset_index()#重新设置index,则place_id会进入place_count中
# 7. 筛选data中的place_id值,即如果在tf中就保留在data中,即利用tf中place_id 筛选data 中place_id
data=data[data["place_id"].isin(tf.place_id)]#df["列名"]=df.列名
"""
二、特征工程
"""
# 1. 取出数据集中的特征值和目标值
y=data["place_id"]
x=data.drop("place_id",axis=1)
# 2. 进行分割数据集,形成训练集和测试集
"""
关键输出的是训练集_特征值;测试集_目标值;测试集_目标值;测试集_目标值
"""
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
# #2 标准化训练集和测试集的特征值
std=StandardScaler()
x_train=std.fit_transform(x_train)#训练集的特征值建立标准,平均值,标准差
x_test=std.transform(x_test)#直接利用训练集的特征值建立的标准
# """
# 三、 进行K近邻算法,构建模型,并利用分割的测试集进行验证
# """
# # 1、调用API,进行算法流程
knn=KNeighborsClassifier(n_neighbors=5)
# # 2. 传入训练集的特征值和目标值
knn.fit(x_train,y_train)
# # 3. 得出预测结果,进行计算测试集中特征值和上述输入的训练集的特征值之间的距离,并根据距离大小,利用类别进行判断
y_predice=knn.predict(x_test)
scor=knn.score(x_test,y_test)
print(scor)
if __name__=="__main__":
kuns()
三、k-近邻算法优缺点
优点:
简单,易于理解,易于实现,无需估计参数,无需训练
缺点:
懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定K值,K值选择不当则分类精度不能保证
四、总结
使用场景:小数据场景,几千~几万样本,具体场景具体业务
去测试