1. 程式人生 > 實用技巧 >【Oxygen Not Include】【缺氧】【消毒水庫模組】

【Oxygen Not Include】【缺氧】【消毒水庫模組】

問題:回憶分類問題的判定方法

什麼是K-近鄰演算法

  • 你的“鄰居”來推斷出你的類別

1、K-近鄰演算法(KNN)

1.1 定義

如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

來源:KNN演算法最早是由Cover和Hart提出的一種分類演算法

1.2 距離公式

兩個樣本的距離可以通過如下公式計算,又叫歐式距離

2、電影型別分析

假設我們有現在幾部電影

其中? 號電影不知道類別,如何去預測?我們可以利用K近鄰演算法的思想

2.1 問題

  • 如果取的最近的電影數量不一樣?會是什麼結果?

2.2 K-近鄰演算法資料的特徵工程處理

  • 結合前面的約會物件資料,分析K-近鄰演算法需要做什麼樣的處理

3、K-近鄰演算法API

  • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
    • n_neighbors:int,可選(預設= 5),k_neighbors查詢預設使用的鄰居數
    • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可選用於計算最近鄰居的演算法:‘ball_tree’將會使用 BallTree,‘kd_tree’將使用 KDTree。‘auto’將嘗試根據傳遞給fit方法的值來決定最合適的演算法。 (不同實現方式影響效率)

4、案例:預測簽到位置

資料介紹:將根據使用者的位置,準確性和時間戳預測使用者正在檢視的業務。

train.csv,test.csv 
row_id:登記事件的ID
xy:座標
準確性:定位準確性 
時間:時間戳
place_id:業務的ID,這是您預測的目標

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

4.1 分析

  • 對於資料做一些基本處理(這裡所做的一些處理不一定達到很好的效果,我們只是簡單嘗試,有些特徵我們可以根據一些特徵選擇的方式去做處理)

    • 1、縮小資料集範圍 DataFrame.query()

    • 4、刪除沒用的日期資料 DataFrame.drop(可以選擇保留)

    • 5、將簽到位置少於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)]

  • 分割資料集

  • 標準化處理

  • k-近鄰預測

4.2 程式碼

def knncls():
    """
    K近鄰演算法預測入住位置類別
    :return:
    """
    # 一、處理資料以及特徵工程
    # 1、讀取收,縮小資料的範圍
    data = pd.read_csv("./data/FBlocation/train.csv")

    # 資料邏輯篩選操作 df.query()
    data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")

    # 刪除time這一列特徵
    data = data.drop(['time'], axis=1)

    print(data)

    # 刪除入住次數少於三次位置
    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)]

    # 3、取出特徵值和目標值
    y = data['place_id']
    # y = data[['place_id']]

    x = data.drop(['place_id', 'row_id'], axis=1)

    # 4、資料分割與特徵工程?

    # (1)、資料分割
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # (2)、標準化
    std = StandardScaler()

    # 隊訓練集進行標準化操作
    x_train = std.fit_transform(x_train)
    print(x_train)

    # 進行測試集的標準化操作
    x_test = std.fit_transform(x_test)

    # 二、演算法的輸入訓練預測
    # K值:演算法傳入引數不定的值    理論上:k = 根號(樣本數)
    # K值:後面會使用引數調優方法,去輪流試出最好的引數[1,3,5,10,20,100,200]
    knn = KNeighborsClassifier(n_neighbors=1)

    # 呼叫fit()
    knn.fit(x_train, y_train)

    # 預測測試資料集,得出準確率
    y_predict = knn.predict(x_test)

    print("預測測試集類別:", y_predict)

    print("準確率為:", knn.score(x_test, y_test))

    return None

4.3 結果分析

準確率: 分類演算法的評估之一

  • 1、k值取多大?有什麼影響?

k值取很小:容易受到異常點的影響

k值取很大:受到樣本均衡的問題

  • 2、效能問題?

距離計算上面,時間複雜度高

5、K-近鄰總結

  • 優點:
    • 簡單,易於理解,易於實現,無需訓練
  • 缺點:
    • 懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大
    • 必須指定K值,K值選擇不當則分類精度不能保證
  • 使用場景:小資料場景,幾千~幾萬樣本,具體場景具體業務去測試