K-近邻算法

定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

两个样本的距离可以通过如下公式计算,又叫欧式距离

比如说,a(a1,a2,a3),b(b1,b2,b3)

 sklearn k-近邻算法API

sklearn.neighbors. KNeighborsClassifier ( n_neighbors =5,algorithm='auto')
n_neighbors int, 可选(默认 = 5 ), k_neighbors 查询默认使用的邻居数

        algorithm{‘auto’ball_treekd_tree‘brute’},可选用于计算最近邻居的算法:ball_tree将会使用 BallTreekd_tree将使用 KDTree‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)

案例:在整体算法过程中需要进行的一些步骤 

           1、缺失值处理  

            2、特征处理:①构造新的特征(例如时间戳转换为时间:星期、月份、小时等)
                                    ②重要特征的筛选,筛选需要的重要的,不需要的删除
                                    ③当特征值特别多时(大于100个特征时),需要进行特征的降维处理

            3、数据分割:切分为训练集和测试集

            4、确定算法:例如k—近邻算法

            5、构造模型:将训练集的数据输入算法中

            6、预测测试集的特征结果:knn.predict(x_test)

            7、对预测结果进行打分:knn.score(x_test,y_test),确定模型的精确度,至少70%才能用

此处利用位置预测案例进行说明

from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris,load_digits
from sklearn.preprocessing import StandardScaler

#读取数据
tr=pd.read_csv('./train.csv')

#处理数据,缩小数据集
tr=tr.query('x>1.0 & x<1.25 & y>2.5 & y<2.75')#利用query函数将数据集进行缩小

#处理时间数据,将时间戳转换为日期时间格式
times=pd.to_datetime(tr['time'],unit='s')#将时间戳转换为时间的字符串,最小单位为秒的格式
times=pd.DatetimeIndex(times)#将时间的字符串转换为字典格式,此时时间为时间格式而非字符串

#处理数据,构造新的特征,月、星期、小时
tr['month']=times.month
tr['week']=times.weekday
tr['hour']=times.hour
#把时间戳特征删除
tr=tr.drop('time',axis=1)
#删除地址位置小于3个用户的删除
'''palce_count=tr.groupby('place_id').aggregate(np.count_nonzero)
将分类后的元素进行非零个数的统计,aggregate和agg是同一个函数,在其中输入对应的公式就可对对应的列进行聚合计算'''
palce_count=tr.groupby('place_id').count()#简化写法,将地址位置进行分组聚合
pc=palce_count[palce_count.row_id>3].reset_index()#将place_id从行坐标中放到数据中,重新设置行索引
tr=tr[tr['place_id'].isin(pc.place_id)]#将用户数大于3的地址取出来

#设置训练集和测试集
y=tr['place_id']#特征值
x=tr.drop(['place_id','row_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)
#对数据进行训练
knn.fit(x_train,y_train)
#输入测试特征值,预测目标值
y_pridict=knn.predict(x_test)
print('测试集的预测值为:',y_pridict)
#对预测结果进行打分,测算算法准确性
print('测试集的准确性为:',knn.score(x_test,y_test))

k-近邻算法中k值的取值:

k值取很小:容易受异常点影响

k值取很大:容易受最近数据太多导致比例变化

k-近邻算法优缺点:

优点:
简单,易于理解,易于实现, 无需估计参数,无需训练
缺点:
懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定 K 值, K 值选择不当则分类精度不能保证
使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值