社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
KNN分类算法其核心思想是假定所有的数据对象都对应于Ñ维空间中的点,如果一个数据对象在特征空间中的ķ个最相邻对象中的大多数属于某一个类别,则该对象也属于这个类别,并具有这个类别上样本的特性.KNN方法在进行类别决策时,只与极少量的相邻样本有关。
定义:如果一个样本在特征空间中的ķ个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别
两个样本的距离可以通过如下公式计算,又称欧式距离
比如说:A(A1,A2,A3),B(B1,B2,B3)
距离L =
sklearn.neighbors.KNeighborsClassifier(N_NEIGHBORS = 5,算法= '自动')
下面是数据的部分截图:
文件说明:ROW_ID:登记时间的ID
xy:坐标
准确性:定位准确性
时间:时间戳
place_id:业务的ID,这是您预测的目标
实例流程
数据的处理
DataFrame.query()
2.处理日期数据
pd.to_datetime
pd.DatetimeIndex
3.增加分割的日期数据
4.删除没用的日期数据
DataFrame.drop
5.将签到位置少于Ñ个用户的删除
place_count = data.groupby( 'place_id')。计数
TF = place_count [place_count.row_id> 3] .reset_index()
数据=数据[数据['place_od“]。ISIN(tf.place_id)]
下面代码实现:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import pandas as pd
def knncls():
"""
k-近邻预测用户签到位置
:return:
"""
#读取数据
data=pd.read_csv("./train.csv")
print(data.head(10))
#处理数据
#1.缩小数据,查询数据筛选
data=data.query("x>1.0 & x<1.25 & y>2.5 &y<2.75")
#处理时间数据
time_value=pd.to_datetime(data['time'],unit='s')
# print(time_value)
#特征工程(标准化)
#构造一些特征
time_value=pd.DatetimeIndex(time_value)
data['day']=time_value.day
data['hour']=time_value.hour
data['weekday']=time_value.weekday
#把时间戳特征删除
data=data.drop(['time'],axis=1)
print(data.head(10))
#把签到数量少于n个目标位置删除
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)
#进行数据的分割训练集集合测试集
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)
#进行算法流程
knn=KNeighborsClassifier(n_neighbors=5)
#fit,pedict,score
knn.fit(x_train,y_train)
#得出预测结果
y_predict=knn.predict(x_test)
print('预测目标签到位置为:',y_predict)
#得出准确率
y_score=knn.score(x_test,y_test)
print('预测准确率',y_score)
return None
if __name__=="__main":
knncls()
运行结果如下所示:
预测的准确率为40%
ķ值取很小:容易受异常点影响
ķ值取很大:容易受ķ值数量(类别)波动
简单,易于理解,易于实现,无需估计参数,无需训练
懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定ķ值,K值选择不当则分类精度不能保证
使用场景:小数据场景,几千〜几万样本,具体场景具体业务去测试
需要数据的留言邮箱地址
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!