k-近鄰(KNN) 算法預測簽到位置


分類算法-k近鄰算法(KNN):

定義:

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

來源:

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

計算距離公式:

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

  

  

 

 sklearn k-近鄰算法API:

問題:

1. k值取多大?有什么影響?

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

  k值取很大:容易受最近數據太多導致比例變化

2. 性能問題

k-近鄰算法的優缺點:

  優點:

    簡單、易於理解,無需估計參數,無需訓練

  缺點:

    懶惰算法,對測試樣本分類時的計算量大,內存開銷大

    必須制定k值,k值選擇不當則分類精度不能保證

  使用場景:

    小數據場景,幾千~幾萬樣本,具體場景具體業務去測試

k近鄰算法實例-預測簽到位置:

數據來源:

  kaggle官網,鏈接地址:https://www.kaggle.com/c/facebook-v-predicting-check-ins/data  (需官網登錄后下載)

數據的處理:

1. 縮小數值范圍: DataFrame.query(),因為數據量過大,所以獲取部分數據

2. 處理日期數據: pd.to_datetime() 、pd.DatetimeIndex(),兩個pandas庫的接口

3. 增加分割的日期數據: 把源數據里面的時間戳數據轉換分割后,添加為新列,day、hour等

4. 刪除沒用的數據: pd.drop() ,pandas庫的接口

5. 將簽到位置少於n個用戶的數據刪除,一些pandas庫知識:

  place_count = data.groupby('place_id').aggregate(np.count_nonzero)

  tf = place_count[place_count.row_id>3].rest_index()

  data = data[data['place_id'].isin(tf.place_id)]

實例流程:

1. 數據集的處理

2. 分割數據集

3. 對數據集進行表轉化

4. estimator流程進行分類預測

代碼實現:

 1 import os
 2 import pandas as pd
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.neighbors import KNeighborsClassifier
 5 from sklearn.preprocessing import StandardScaler
 6 
 7 
 8 def knn_cls():
 9     """K-近鄰算法預測用戶簽到的位置"""
10 
11     # 一、讀取數據
12     fb_location = os.path.join(os.path.join(os.path.curdir, 'data'), 'fb_location')
13     data = pd.read_csv(os.path.join(fb_location, 'train.csv'))
14     # print(data.head(10))
15 
16     # 二、處理數據
17     # 1.縮小數據,查詢數據篩選
18     data = data.query('x>1.0 & x<1.25 & y>2.5 & y<2.75')
19     # 2.處理時間的數據
20     time_value = pd.to_datetime(data['time'], unit='s')  # 精確到秒
21     # print(time_value)
22     # 3.把日期格式轉化為字典格式
23     time_value = pd.DatetimeIndex(time_value)
24     # 4.構造一些特征
25     data.loc[:,'day'] = time_value.day
26     data.loc[:,'hour'] = time_value.hour
27     data.loc[:,'weekday'] = time_value.weekday
28     # 5.把時間戳特征刪除
29     data.drop(['time'], axis=1, inplace=True)
30     # print(data)
31     # 6.把簽到數量小於n個目標位置刪除
32     place_count = data.groupby('place_id').count()
33     tf = place_count[place_count.row_id>3].reset_index()
34     data = data[data['place_id'].isin(tf.place_id)]
35     # 7.取出特征值和目標值
36     y = data['place_id']
37     x = data.drop(['place_id', 'row_id'], axis=1)
38     # 8.進行數據的分割,訓練集和測試集
39     x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
40 
41     # 三、特征工程(標准化)
42     std = StandardScaler()
43     # 對測試集和訓練集的特征值進行標准化
44     x_train = std.fit_transform(x_train)
45     x_test = std.transform(x_test)  # 這里用std.transform就不用fit去重新計算平均值標准差一類的了
46 
47     # 四、進行算法流程
48     knn = KNeighborsClassifier(n_neighbors=9)
49 
50     # fit, predict, score
51     knn.fit(x_train, y_train)
52 
53     # 四、得出預測結果和准確率
54     y_predict = knn.predict(x_test)
55     print('預測的目標簽到位置為:', y_predict)
56     print('預測的准確率: ', knn.score(x_test, y_test))
57 
58 
59 if __name__ == '__main__':
60     knn_cls()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM