1. 程式人生 > >機器學習——KNN演算法以及案例預測入住位置

機器學習——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,這是您預測的目標

例項流程

  1. 資料集的處理
  2. 分割資料集
  3. 對資料集進行標準化
  4. 估計流程進行分類預測

資料的處理

  1. 縮小資料集範圍

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值選擇不當則分類精度不能保證

使用場景:小資料場景,幾千〜幾萬樣本,具體場景具體業務去測試

需要資料的留言郵箱地址