# 导包 # 导入数据 # 数据处理 # 特征工程 # KNN算法预估流程 # 模型评估
接下来便实现以上流程
实现该模型训练我们需要导入一下的函数
1 # 导包 2 3 import pandas as pd # 使用其文件操作 4 from sklearn.preprocessing import StandardScaler # 用来实现数据标准化 5 from sklearn.neighbors import KNeighborsClassifier # 预估器 6 from sklearn.model_selection import GridSearchCV # 网格搜索和交叉验证 7 from sklearn.model_selection import train_test_split # 可将数据分为训练集和测试集
然后导入数据
# 导入数据 data = pd.read_csv('train.csv')
# read_csv()是pandas里面的一个函数,用于读取.cvs文件,这里接的是相对路径,也可以是绝对路径
(ps:这里仅仅是解决训练模型,所以并没有导入test.cvs文件)
作者这里提供下载这两个数据:(文件挺大的,别用流量下载哇)
百度网盘:链接:https://pan.baidu.com/s/1WSHqf06brFVy-5lYUI2Idg
提取码:ss52
对于数据处理,由于是练习,所以我添加了一个减少数据量,实际中,数据量越多越好
接下来便是把数据集里面的时间戳变为更好理解的年月日;
而对于签到少的地方可以去除,因为签到少的地方不具有代表性;
然后就是把数据集里面的特征值与目标值分离出来
# 数据处理 # 1)偷懒:减少数据(练习专属) data = data.copy() data = data.query("x < 2.5 & x > 2 & y < 1.5 & y > 1.0") # 2)把时间特征转换成更有意义的年月日 time = pd.to_datetime(data["time"], unit="s") t = pd.DatetimeIndex(time) data["day"] = t.day data["weekday"] = t.weekday data["hour"] = t.hour # 3)过滤签到次数少的地方 place_count = data.groupby("place_id").count()["row_id"] data_final = data[data["place_id"].isin(place_count[place_count>3].index.values)] # 4)筛选特征值和目标值 x = data_final[["x","y","accuracy","day","weekday","hour"]] y = data_final["place_id"]
接着就是特征工程了
# 特征工程:标准化 # 数据集划分 x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1) #random_state是种子,一样的种子表示一样的分法 # 标准化 # 实例化一个预估器 transfer = StandardScaler() # 把数据标准化 x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 注:以上x_test是用transform方法,是应为fit_transform方法实际上可以分为两个方法,
一个是fit,一个是transform,fit是用来计算数据的标准差和平均数,transform是用来
转化数据的,在第一次使用fit_transform时,transfer里面已经通过fit得到了x_train
的标准差和平均值了,为了数据标准化更加真实,所以x_test也要用一样的标准差和平均值,
这就是x_test使用transform的原因
然后是KNN算法预估流程
# KNN算法预估流程 # 实例化一个预估器 estimator = KNeighborsClassifier() #使用网格搜索和CV优化 estimator = GridSearchCV(estimator=estimator, param_grid={"n_neighbors": [3, 5, 7, 9]}, cv=3)
# 第一个参数是一个预估器;
第二个参数表示的是需要进行网格搜索的所有K值,值为字典或者列表;第三个参数是交叉验证的折数 estimator.fit(x_train, y_train) # 这个是输入训练的特征值和目标值,然后训练模型
最后是模型评估了
# 模型评估 # 方法一:查看预测的目标值 y_predict = estimator.predict(x_test) print("y_predict:\n", y_predict) # 方法二:直接查看准确率 score = estimator.score(x_test, y_test) print("准确率为:", score) # 查看优化后端最佳参数 print("最佳参数:", estimator.best_params_) print("最佳结果:", estimator.best_score_) print("最佳估计器:", estimator.best_estimator_) print("最佳验证结果:", estimator.cv_results_)
整体下来,我们就完成了一个超级基础的:用KNN算法实现预测facebook签到位置模型的训练辣!
(ps:该随笔是作者一边学习一边写的,里面有一些自己的拙见,如果有错误或者哪里可以改正的话,还请大家指出并批评改正!)