K-近鄰11-案例2:預測facebook簽到位置
阿新 • • 發佈:2021-09-13
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.結果