1. 程式人生 > 其它 >K-近鄰11-案例2:預測facebook簽到位置

K-近鄰11-案例2:預測facebook簽到位置

1 專案描述

  • 背景:Facebook建立了一個虛擬世界,其中包括10公里*10公里共100平方公里的約10萬個地方。對於給定的座標集,您的任務將根據使用者的位置,準確性和時間戳等預測使用者下一次的簽到位置。資料被製作成類似於來自移動裝置的位置資料。
  • 目標:預測一個人將要簽到的地方

2 資料集介紹

檔案說明 train.csv, test.csv
  row id:簽入事件的id
  x y:座標
  accuracy: 準確度,定位精度
  time: 時間戳
  place_id: 簽到的位置,這也是你需要預測的內容

官網:https://www.kaggle.com/navoshta/grid-knn/data

3 步驟分析

具體步驟:

# 1.獲取資料集
# 2.基本資料處理
# 2.1 縮小資料範圍 DataFrame.query()
# 2.2 選取有用的時間特徵
# 2.3 去掉簽到較少的地方
# 2.4 確定特徵值和目標值
# 2.5 分割資料集
# 3.特徵工程 -- 特徵預處理(標準化)
# 4.機器學習 -- knn+cv (K近鄰+交叉驗證)
# 5.模型評估

4 程式碼實現

  • 1.獲取資料集
import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
facebook=pd.read_csv("./data/FBlocation/train.csv")
  • 2.基本資料處理
# 2.基本資料處理
# 2.1 縮小資料範圍
facebook_data = facebook.query("x>8.0 & x<8.5 & y>8.0 & y<8.5")
# 2.2 選擇時間特徵
# 脫敏資料,unit單位設為s時間就正常了
time = pd.to_datetime(facebook_data["time"], unit="s")
time = pd.DatetimeIndex(time)#該條語句處理後就可以直接使用time.hour
facebook_data["day"] = time.day
facebook_data["hour"] = time.hour
facebook_data["weekday"] = time.weekday
# 2.3 去掉簽到較少的地方
place_count = facebook_data.groupby("place_id").count()
place_count = place_count[place_count["row_id"]>3]
facebook_data = facebook_data[facebook_data["place_id"].isin(place_count.index)]
# 2.4 確定特徵值和目標值
x = facebook_data[["x", "y", "accuracy", "day", "hour", "weekday"]]
y = facebook_data["place_id"]
# 2.5 分割資料集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
  • 3.特徵工程--特徵預處理(標準化)
# 3.特徵工程--特徵預處理(標準化)
# 3.1 例項化一個轉換器
transfer = StandardScaler()
# 3.2 呼叫fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
  • 4.機器學習--knn+cv
# 4.機器學習--knn+cv
# 4.1 例項化一個估計器
estimator = KNeighborsClassifier()
# 4.2 呼叫gridsearchCV
param_grid = {"n_neighbors": [3, 5, 7, 9]}
# n_jobs表示用多少個CPU,-1表示所有CPU
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5, n_jobs=4)

# 4.3 模型訓練
estimator.fit(x_train, y_train)
  • 5.模型評估
# 5.模型評估
# 5.1 基本評估方式
score = estimator.score(x_test, y_test)
print("最後預測的準確率為:\n", score)

y_predict = estimator.predict(x_test)
print("最後的預測值為:\n", y_predict)
print("預測值和真實值的對比情況:\n", y_predict == y_test)

# 5.2 使用交叉驗證後的評估方式
print("在交叉驗證中驗證的最好結果:\n", estimator.best_score_)
print("最好的引數模型:\n", estimator.best_estimator_)
print("每次交叉驗證後的驗證集準確率結果和訓練集準確率結果:\n",estimator.cv_results_)
  • 6.結果