1. 程式人生 > >機器學習演算法 -- KNN

機器學習演算法 -- KNN

概念

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

示例程式碼

示例程式碼使用的是kaggle上的facebook資料集,根據已有的資料,預測新的人員入酒店id

# KNN的距離演算法  使用的是歐氏距離  即算空間中點的距離 (根號下的 差的平方和)
# 要注意的是knn演算法是需要做 標準化處理的
# API:(引數:n_neighbors=5)預設使用5個鄰居  鄰居的數量對演算法的結果有影響 數量越大則要判斷的點越多
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler


def knncls():
    data = pd.read_csv("./data/facebook/train.csv")
    #     處理資料
    print(data.head(10))
    # 縮小資料集
    # 使用query查詢資料篩選資料 輸入字串 用& 表示與
    data = data.query("x>1.0 & x<1.25 &y>2.5 & y <2.75")
    # 處理時間戳 轉換成年月日 時分秒
    # 呼叫pd.to_datatime() 可以吧時間戳轉換為時間年月日
    time_values = pd.to_datetime(data['time'])
    print(time_values)
    # 構造更多的特徵  年月都一致  不再使用年月
    # 獲取引數 使用打他timeindex
    time_values = pd.DatetimeIndex(time_values)
    data['day'] = time_values.day
    data['hour'] = time_values.hour
    data['weekday'] = time_values.weekday
    data['weekday'] = time_values.weekday
    # 刪除時間戳特徵
    # 第一個引數是一個列表  傳入要刪除的特徵lable  第二個引數表示軸 在sklearn裡邊0 代表列
    # 而在pandas裡邊 1 表示列
    data = data.drop(['time'], axis=1)
    print('*' * 100)
    print(data)
    # 簽到數 比較少的 篩選掉
    # 即簽到數量少於n
    place_count = data.groupby("place_id").count()
    tf = place_count[place_count.row_id > 3].reset_index()
    # 篩選在tf裡邊的place
    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, 0.25)

    # 特徵工程 標準化(不做標準化 準確率大概在 3% ) 測試集 訓練集 的特徵值都需要標準化
    std = StandardScaler()
    X_train = std.fit_transform(X_train)
    # 不用再呼叫fit_transform 已經標準化了一次
    X_test = std.transform(X_test)
    # 標準化之後準確率大概為 40%

    # 進行演算法流程
    knn = KNeighborsClassifier(n_neighbors=5)
    # 輸入資料
    knn.fit(X_train, Y_train)
    # 得出預測結果(測試集)
    y_predict = knn.predict(X_test)
    print("預測位置為:" + y_predict)
    # 得出預測的準確率
    print("預測準確率:", knn.score(X_test, Y_test))
    return None


if __name__ == '__main__':
    knncls()