python機器學習基礎K近鄰算法詳解KNN
一、k-近鄰算法原理及API
1.k-近鄰算法原理
如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。(相似的樣本,特征之間的值應該都是相近的。)
樣本之間的距離求法:
2.k-近鄰算法API
3.k-近鄰算法特點
k值取很小,容易受異常點的影響。
k值取很大,容易受k值數量(類別)波動
優點:簡單,易於理解,易於實現,無需估計參數,無需訓練(不需要迭代)
缺點:懶惰算法,對測試樣本分類時的計算量大,內存開銷大
綜上,使用該算法時必須指定K值,K值選擇不當則分類精度不能保證。同時若樣本數量非常多,算法花費的時間就會很長,因此使用場景一般是小數據場景。
二、k-近鄰算法案例分析案例信息概述
knn使用案例:以預測客人的入住位置(假設住的是酒店)為例。準備好的數據中的特征為:酒店編號(place_id)、入住登記(row_id)、客人橫坐標(x)、客人縱坐標(y)、時間戳(time)、客人定位準確度(accuracy)
也就是說,我們的目標是預測客人將會入住哪個編號的酒店。則此問題是一個分類問題。根據k-近鄰算法,我們通常考慮讓客人入住距離他最近的酒店。但同時,根據給出的其他信息,是否入住某酒店還會受其他因素影響,比如入住時間,定位準確度。
因此,我們第一步對數據進行處理的時候,需要將我們認為對客人入住有影響的所有因素考慮在內。比如客人的坐標、入住時間、定位準確度。
接下來對特征進行處理,把需要的添加進列表,不需要的刪除,或者篩選部分數據。最終處理好後,將目標值單獨拿出來作為y_train,就可以使用x_train和y_train來訓練算法瞭。
第一部分:處理數據
1.數據量縮小
假設已導入瞭data數據,由於數據量太大,因此為瞭演示的速度,將數據量縮小。
代碼:
data.query('x>0.1 & x<0.2 & y>0.5 & y<0.6')
選擇x的坐標范圍,以及y的坐標范圍
2.處理時間
時間給出的是時間戳格式,需要使用pd.to_date_time進行轉化
代碼:
time = pd.to_date_time(data['time'], unit='s')
此時得出的時間是類似於這樣:1970-01-01 18:09:40
3.進一步處理時間
將時間提取出來,轉換成 ”可以任意提取,年月日時分秒均可“ 的字典格式
代碼:
time_value = pd.DatetimeIndex(time)
4.提取並構造時間特征
直接將提取的時間特征,選擇一個特征名,加入原數據表中即可,想加幾個加幾個
代碼:
data['day'] = time_value.day
5.刪除無用特征
使用drop方法,方法中,axis=1代表整列。隻要認為沒有用的特征,均可刪除
代碼:data = data.drop([‘row’], axis=1)
6.簽到數量少於3次的地點,刪除
首先對數據進行分組,要刪除地點,就以地點來分組,並統計其他特征基於地點的數量
代碼:
place_count = data.groupby('place_id').count()
此處返回的數據表,索引就是地點place_id,其他的特征對應的列,數據都變成瞭“基於place_id”所進行的數量統計。
關於groupby().count()的解釋,以一個簡單的數據為例:
原來的特征有5個,分別為:year, team, rank, points, goals,現在按照year來分組並統計數量,那麼第一行第一列的數據“4”,意思就是:在2014年,有4個team
回到本例,row_id代表的是“登記事件的id”,也就是說每次有人登記入住一個place,那麼place_id對應的就會有一個row_id數據出現。若同一個地方有三個人登記瞭,那麼同一個place_id對應的row_id就會有三個。
因此,本例中按照groupby.count()處理之後,place_id和row_id對應的關系就是:在place_id中的a這個地方,row_id對應的數量為3。也就是相當於在a地點,有3人登記入住瞭。
接下來,將入住人數少於3的place_id刪除:
place_count[place_count.row_id>3] # 選擇入住人數大於三人的數據 tf = place_count[place_count.row_id>3].reset_index() #將索引重置,place_id還放回到特征 data = data[data['place_id'].isin (tf.place_id)] #對data中的數據進行篩選
7.提取目標值y
提取之後,需將原數據表中的目標值那一列刪除
y = data['place_id'] x = data.drop(['place_id'], axis=1)
8.數據分割
前面需要導入分割方法:from sklearn.model_selection import train_test_split
代碼:
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
至此,數據處理完畢。數據處理過程中,我們需要考慮有哪些數據是需要舍棄的,有哪些是需要我們構造的,是否需要對特征進行篩選,條件如何設置等。最終,將我們需要的目標值提取出來,剩餘的作為訓練集。並調用分割方法,按一定的比例進行數據分割。(此處25%的數據作為測試集)
第二部分:特征工程
標準化
先導入標準化類:from sklearn.preprocessing import StandardScaler
訓練集和測試集,標準化的時候,所使用的均值與標準差,都是訓練集的!因此,對測試集標準化的時候,隻調用transform方法即可。
x_train = std.fit_transform(x_train) x_test = transform(x_test)
第三部分:進行算法流程
1.算法執行
先導入算法:from sklearn.neighbors import KNeighborsClassifier
使用該算法,將訓練集數據輸入,即可訓練完畢,得到一個模型。
代碼:
knn = KNeighborsClassifier(x_train, y_train)
2.預測結果
使用predict方法, 輸入測試集數據即可得出預測的y
代碼:
y_predict = knn.predict(x_test)
3.檢驗效果
使用score方法,輸入測試集數據,以及測試集的目標值,即可得出分數
代碼:
score = knn.score(x_test, y_test)
以上就是python機器學習基礎K近鄰算法詳解KNN的詳細內容,更多關於python機器學習K近鄰算法的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- python機器學習樸素貝葉斯算法及模型的選擇和調優詳解
- 人工智能-Python實現嶺回歸
- 使用Python處理KNN分類算法的實現代碼
- python機器學習基礎線性回歸與嶺回歸算法詳解
- python機器學習算法與數據降維分析詳解