機器學習——KNN演算法以及案例預測入住位置
ķ最近鄰
KNN分類演算法其核心思想是假定所有的資料物件都對應於Ñ維空間中的點,如果一個數據物件在特徵空間中的ķ個最相鄰物件中的大多數屬於某一個類別,則該物件也屬於這個類別,並具有這個類別上樣本的特性.KNN方法在進行類別決策時,只與極少量的相鄰樣本有關。
定義:如果一個樣本在特徵空間中的ķ個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別
兩個樣本的距離可以通過如下公式計算,又稱歐式距離
比如說:A(A1,A2,A3),B(B1,B2,B3)
距離L =
sklearn k-近鄰演算法API
sklearn.neighbors.KNeighborsClassifier(N_NEIGHBORS = 5,演算法= '自動')
- N_NEIGHBORS:INT,可選(預設= 5),k_neighbors查詢預設使用的鄰居數
- 演算法:{ “自動”, “ball_tree”, “kd_tree”, “畜生”},可選用計算最近鄰居的演算法: 'ball_tree' 將會使用BallTree, 'kd_tree' 將使用KDTree.'auto“將嘗試根據傳遞給擬合方法的值來決定最合適的演算法。(不同實現方式影響效率)
KNN演算法實現預測入住位置
下面是資料的部分截圖:
檔案說明:ROW_ID:登記時間的ID
xy:座標
準確性:定位準確性
時間:時間戳
place_id:業務的ID,這是您預測的目標
例項流程
- 資料集的處理
- 分割資料集
- 對資料集進行標準化
- 估計流程進行分類預測
資料的處理
- 縮小資料集範圍
DataFrame.query()
2.處理日期資料
pd.to_datetime
pd.DatetimeIndex
3.增加分割的日期資料
4.刪除沒用的日期資料
DataFrame.drop
5.將簽到位置少於Ñ個使用者的刪除
place_count = data.groupby( 'place_id')。計數
TF = place_count [place_count.row_id> 3] .reset_index()
資料=資料[資料['place_od“]。ISIN(tf.place_id)]
下面程式碼實現:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import pandas as pd
def knncls():
"""
k-近鄰預測使用者簽到位置
:return:
"""
#讀取資料
data=pd.read_csv("./train.csv")
print(data.head(10))
#處理資料
#1.縮小資料,查詢資料篩選
data=data.query("x>1.0 & x<1.25 & y>2.5 &y<2.75")
#處理時間資料
time_value=pd.to_datetime(data['time'],unit='s')
# print(time_value)
#特徵工程(標準化)
#構造一些特徵
time_value=pd.DatetimeIndex(time_value)
data['day']=time_value.day
data['hour']=time_value.hour
data['weekday']=time_value.weekday
#把時間戳特徵刪除
data=data.drop(['time'],axis=1)
print(data.head(10))
#把簽到數量少於n個目標位置刪除
place_count=data.groupby('place_id').count()
tf=place_count[place_count.row_id>3].reset_index()
data=data[data['place_id'].isin(tf.place_id)]
#取出資料當中的特徵值和目標值
y=data['place_id']
x=data.drop(['place_id'],axis=1)
#進行資料的分割訓練集集合測試集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
#特徵工程(標準化)
std=StandardScaler()
#對測試集和訓練集特徵值進行標準化
x_train=std.fit_transform(x_train)
x_test=std.transform(x_test)
#進行演算法流程
knn=KNeighborsClassifier(n_neighbors=5)
#fit,pedict,score
knn.fit(x_train,y_train)
#得出預測結果
y_predict=knn.predict(x_test)
print('預測目標籤到位置為:',y_predict)
#得出準確率
y_score=knn.score(x_test,y_test)
print('預測準確率',y_score)
return None
if __name__=="__main":
knncls()
執行結果如下所示:
預測的準確率為40%
ķ值取很小:容易受異常點影響
ķ值取很大:容易受ķ值數量(類別)波動
KNN演算法優缺點
- 優點
簡單,易於理解,易於實現,無需估計引數,無需訓練
- 缺點
懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大
必須指定ķ值,K值選擇不當則分類精度不能保證
使用場景:小資料場景,幾千〜幾萬樣本,具體場景具體業務去測試
需要資料的留言郵箱地址