分類算法-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()