首页 > 编程语言 > 详细

15_K-近邻算法之入住位置预测

时间:2019-10-26 10:15:26      阅读:193      评论:0      收藏:0      [点我收藏+]

 案例:本次大赛的目的是预测一个人想签入到哪个地方。对于本次比赛的目的,Facebook的创建一 个人造的世界,包括位于10公里的10平方公里超过10万米的地方。对于一个给定的坐标,你的任务是返回最有可能的地方的排名列表。数据制作出类似于来自移动设备的位置的信号,给你需要什么与不准确的,嘈杂的价值观复杂的真实数据工作一番风味。不一致的和错误的位置数据可能破坏,如Facebook入住服务经验。

 

 

 

分析:表中数据代表的含义

    row_id:登记时间的ID

              xy:坐标

              accuracy:定位准确性

              time:时间戳

              place_id:业务的ID,这是您预测的目标

 

思路:由于总数据量过大(上千万条数据),可以选取其中一小部分数据来进行预测,就是在10平方公里,挑一小块地方来进行预测。

   因此要对x,y来进行范围的限制,通过data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")

   对于time也要处理成我们熟悉的格式:time_value = pd.to_datetime(data["time"], unit=‘s‘),

    得到是一个日期格式,因此还要将日期格式转换成字典格式,便于我们后续的操作,time_value = pd.DatetimeIndex(time_value)

   转换成字典之后就可以把按照年月日的格式,把里面的值取出来,然后添加到表中去,并且要把以前的time列给删除掉, 注意删除列的时候,axis=1!!!

data[‘day‘] = time_value.day
data[‘hour‘] = time_value.hour
data[‘weekday‘] = time_value.weekday

# 把时间特征戳删除
data = data.drop([‘time‘], axis=1)

  下面对place_id进行处理,可以想象一下,在现实的入住中,一般会pass掉入住人数很少、评分很低的酒店等等

  这三步有些不好理解,数据库中的分组?

# 把签到数量少于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)]

技术分享图片

 

 

 

删除place_id,因为place_id作为目标值

# 取出数据当中的特征值和目标值
y = data[‘place_id‘]
x = data.drop([‘place_id‘], axis=1)
print(x)

技术分享图片

 

 

   

 

案例步骤分解

读取到最原始的数据

data = pd.read_csv("./predict/train.csv")
print(data)

结果:

技术分享图片

将时间戳转换为我们习惯上的时间,年月日时分秒

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)

技术分享图片

 

这是拿到了原始数据,未做特征化工程,直接进行预测

 技术分享图片

 

进行了特征工程化之后,准确率得到了提高。特征化工程可以简单的理解为消除一些范围相差很大的数据,对结果造成很大的影响,也就是避免结果仅有一小部分值来决定的情况。

    # 特征工程(标准化)
    std = StandardScaler()
    # 对测试集和训练集的特征值进行标准化
    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

技术分享图片

 

完整的案例:准确率70%

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-近邻算法预测用户签到位置
    :return:
    """

    # 读取数据
    data = pd.read_csv("./predict/train.csv")
    # print(data)
    # 处理数据
    # 1.缩小数据,查询数据筛选
    data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")
    # 2.处理日期数据
    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)
    # 在sklearn中列axis=1(记住)

    # 把签到数量少于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 = data.drop([‘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.transform(x_test) # 进行算法流程 knn = KNeighborsClassifier(n_neighbors=5) # fit, predict, score knn.fit(x_train, y_train) # 得出预测结果 y_predict = knn.predict(x_test) print("预测目标的签到位置:", y_predict) # 训练集中的测试值和目标值中的测试值来进行验证,从而得出准确率 print("预测的准确率:", knn.score(x_test, y_test)) if __name__ == ‘__main__‘: knncls()

技术分享图片

这里是只预测到了70%的准确率,因为k-means算法不是很常用,所以就先预测到这里,大家可以根据自己的想法,对表中的数据进行一些拆分、删除等。

  

15_K-近邻算法之入住位置预测

原文:https://www.cnblogs.com/cwj2019/p/11733208.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!