机器学习---KNN算法(预测facebook签到位置)

举报
Pengpengpeng 发表于 2024/12/28 23:30:01 2024/12/28
429 0 0
【摘要】 机器学习初尝试:预测facebook签到位置 流程熟悉: 1)获取数据 2)数据处理 3)特征工程:标准化 4)KNN算法预估流程 5)模型选择与调优 6)模型评估

image.png

数据集介绍

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

流程分析

    1)获取数据
    2)数据处理
    目的:
        特征值
        目标值
        a.缩小数据范围(为方便)
            2<x<2.5
            1.0<y<1.5
        b.time -> 年月日 时分秒
        c.过滤签到次数少的地点
        数据集划分
    3)特征工程:标准化
    4KNN算法预估流程
    5)模型选择与调优
    6)模型评估

import pandas as pd

1、获取数据

data=pd.read_csv("C:/Users/86139/machine learning/kaggle/FBlocation/train.csv")
data.head()
image.png

2、基本的数据处理

1)缩小数据范围

data = data.query("x<2.5 & x>2.0 & y<1.5 & y>1.0")

2)处理时间特征

time_value = pd.to_datetime(data["time"],unit = "s") #将原始时间戳转换为易于阅读和分析的日期时间格式
date = pd.DatetimeIndex(time_value) #DatetimeIndex 支持直接提取年、月、日、时等属性,还支持时间范围的选择与筛选。
data["day"] =date.day
data["weekday"] = date.weekday
data["hour"] = date.hour

3、过滤掉签到次数少的地点

place_count = data.groupby("place_id").count()["row_id"] #对 data 按 place_id 列进行分组后,计算每个组的记录数(即按组统计 row_id 列的计数
place_count [place_count > 3].head()
image.png

data_final = data[data["place_id"].isin(place_count [place_count > 3].index.values)]
data_final.head()
image.png

筛选特征值和目标值

x = data_final[["x","y","accuracy","day","weekday","hour"]]
y = data_final["place_id"]
x.head()
image.png

y.head()
image.png

数据集划分

from sklearn.model_selection import train_test_split # Scikit-learn 中的一个常用方法,用于将数据集划分为训练集和测试集。
x_train,x_test,y_train,y_test=train_test_split(x,y)
from sklearn.preprocessing import StandardScaler #用于对特征数据进行标准化处理,使其均值为 0,标准差为 1,有助于提升模型的性能。
from sklearn.neighbors import KNeighborsClassifier #K-最近邻分类器(KNN)的实现,适用于分类任务。通过计算样本之间的距离,寻找最近的 K 个邻居并预测分类。
from sklearn.model_selection import GridSearchCV#用于网格搜索的工具,可以通过交叉验证来选择模型的最佳超参数。

特征工程:标准化

transfer = StandardScaler() #创建一个 StandardScaler 对象,用于对数据进行标准化(标准化处理)
x_train = transfer.fit_transform(x_train) #对训练集 x_train 进行标准化(标准化是将数据的均值变为 0,标准差变为 1)
X_test = transfer.transform(x_test) #使用已经在训练集上计算的均值和标准差,对测试集 x_test 进行标准化。

KNN算法预估器

estimator = KNeighborsClassifier() #用于初始化一个 K-Nearest Neighbors (KNN) 分类器对象。

加入网格搜索与交叉验证

一个超参数网格,用于指定在模型调优中测试的超参数组合。
在这个字典中:
键 n_neighbors 对应 KNN 模型中的参数 𝑘
值 [3,5,7,9] 是要尝试的不同 k 值。

param_dict={"n_neighbors":[3,5,7,9]}

用于模型超参数调优的步骤。这里使用了 GridSearchCV 进行 网格搜索,通过交叉验证寻找给定超参数网格中的最佳组合。

estimator = GridSearchCV(estimator,param_grid = param_dict,cv = 3)

在这一行代码中,estimator 是通过 GridSearchCV 封装的模型,这一方法会:

执行网格搜索:
遍历 param_grid 中的每种参数组合。
对每种组合进行交叉验证(由 cv 参数指定折数,如 cv=3)。
计算交叉验证的平均性能指标(默认是准确率,或者通过 scoring 指定)。
选择最佳参数:
根据交叉验证的结果,自动选择性能最优的参数组合。
将模型保存在 estimator.best_estimator_ 中。
训练最终模型:
使用最佳参数和整个训练数据集 x_train, y_train 进行最终模型训练。

estimator.fit(x_train,y_train)

模型评估

方法1 直接比对真实值和预测值

y_predict=estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test == y_predict)

方法2 计算准确率

score = estimator.score(x_test,y_test)
print("准确率为:\n",score)

y_predict:

[2809108094 2809108094 2809108094 ... 2809108094 2809108094 3695846783]
直接比对真实值和预测值:
28320804    False
24134479    False
2352792     False
5070412     False
1084406     False
        ...  
15684022    False
20506018    False
23868630    False
7321277     False
16872       False
Name: place_id, Length: 20228, dtype: bool

准确率为:
 0.005734625271900337

最佳参数:best_params_

print("最佳参数:\n",estimator.best_params_)
#最佳结果:best_score_
print("最佳结果:\n",estimator.best_score_)

最佳估计器:best_score_

print("最佳估计器:\n",estimator.best_estimator_)
#交叉验证结果:cv_results_
print("交叉验证结果:\n",estimator.cv_results_)

最佳参数:

   {'n_neighbors': 5}

最佳结果:

 0.33578327271474956

最佳估计器:

KNeighborsClassifier()

交叉验证结果:

 {'mean_fit_time': array([0.07245763, 0.06660533, 0.06621114, 0.05974015]), 
 'std_fit_time':  array([0.0128387 , 0.00814308, 0.00357601, 0.00167752]), 
 'mean_score_time': array([1.12918472, 1.14530794, 1.33627431, 1.28905654]), 
 'std_score_time': array([0.04845406, 0.00744367, 0.05988206, 0.02157798]),
 'param_n_neighbors': masked_array(data=[3, 5, 7, 9],
         mask=[False, False, False, False],
   fill_value=999999), 'params': [{'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 7}, {'n_neighbors': 9}],
   'split0_test_score': array([0.32281985, 0.3352284 , 0.33503065, 0.33033419]),             'split1_test_score': array([0.32654373, 0.33964503, 0.33727196, 0.33450339]),
   'split2_test_score': array([0.31986948, 0.33247639, 0.33306966, 0.32842241]), 'mean_test_score': array([0.32307769, 0.33578327, 0.33512409, 0.33108666]), 
   'std_test_score': array([0.00273084, 0.00295277, 0.00171686, 0.00253893]), 'rank_test_score': array([4, 1, 2, 3], dtype=int32)}

·
·
·
·
附件是原markdown PDF文件

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。