#!/usr/bin/env python # coding: utf-8 # In[78]: import pandas as pd # In[79]: # 1 获取数据 data = pd.read_csv("./FBlocation/train.csv") # In[80]: data.head() # In[81]: # 2 基本数据处理 # 1) 缩小数据处理 data = data.query("x > 1.5 & x < 2.5 & y > 1.0 & y < 1.5") # In[82]: data.head() # In[83]: # 2) 处理时间特征 time_value = pd.to_datetime(data["time"], unit="s") # In[84]: date = pd.DatetimeIndex(time_value) # In[85]: data["day"] = date.day data["weekday"] = date.weekday data["hour"] = date.hour # In[86]: data.head() # In[87]: # 3) 过滤签到次数少的地点 place_count = data.groupby("place_id").count()["row_id"] # In[88]: place_count[place_count > 3].head() # In[89]: data_final = data[data["place_id"].isin(place_count[place_count > 3].index.values)] # In[90]: # 4) 筛选特征值和目标值 x = data_final[["x", "y", "accuracy", "day", "weekday", "hour"]] y = data_final["place_id"] # In[91]: x.head() # In[92]: y.head() # In[93]: # 5) 数据集划分 from sklearn.model_selection import train_test_split # In[94]: x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22) # 数据处理完毕 # In[95]: from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCV # In[96]: # 3. 特征工程 标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) # fit_transform训练集 x_test = transfer.transform(x_test) # transform测试集 # 4. KNN 算法预估 estimator = KNeighborsClassifier() # 加入网格搜索与交叉验证 # 参数准备 param_grid = {"n_neighbors": [3, 5, 7, 9]} estimator = GridSearchCV(estimator, param_grid=param_grid, cv=3) estimator.fit(x_train, y_train) # 5. 模型评估 # 方法一: 直接比对真实值和预测值 y_predict = estimator.predict(x_test) print("y_predict:\n", y_predict) print("直接比对真实值和预测值:\n", y_test == y_predict) # 方法二: 计算准确率 score = estimator.score(x_test, y_test) print("准确率: \n", score) # 6. 获取最佳参数 print("最佳参数: \n", estimator.best_params_) print("最佳结果: \n", estimator.best_score_) print("最佳估计器: \n", estimator.best_estimator_) print("交叉验证结果: \n", estimator.cv_results_)