机器学习---KNN算法(预测facebook签到位置)
【摘要】 机器学习初尝试:预测facebook签到位置
流程熟悉:
1)获取数据 2)数据处理 3)特征工程:标准化 4)KNN算法预估流程 5)模型选择与调优 6)模型评估
数据集介绍
本次大赛的目的是预测一个人想签入到哪个地方。对于本次比赛的目的,Facebook的创建一个人造的世界,包括位于10公里的10平方公里超过10万米的地方。对于一个给定的坐标,你的任务是返回最有可能的地方的排名列表。数据制作出类似于来自移动设备的位置的信号,给你需要什么与不准确的,杂的价值观复杂的真实数据工作一番风味。不一致的和错误的位置数据可能破坏,如Facebook入住服务经验。
流程分析
1)获取数据
2)数据处理
目的:
特征值
目标值
a.缩小数据范围(为方便)
2<x<2.5
1.0<y<1.5
b.time -> 年月日 时分秒
c.过滤签到次数少的地点
数据集划分
3)特征工程:标准化
4)KNN算法预估流程
5)模型选择与调优
6)模型评估
import pandas as pd
1、获取数据
data=pd.read_csv("C:/Users/86139/machine learning/kaggle/FBlocation/train.csv")
data.head()
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()
data_final = data[data["place_id"].isin(place_count [place_count > 3].index.values)]
data_final.head()
筛选特征值和目标值
x = data_final[["x","y","accuracy","day","weekday","hour"]]
y = data_final["place_id"]
x.head()
y.head()
数据集划分
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)