【Oxygen Not Include】【缺氧】【消毒水庫模組】
阿新 • • 發佈:2020-12-20
問題:回憶分類問題的判定方法
什麼是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,這是您預測的目標
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值選擇不當則分類精度不能保證
- 使用場景:小資料場景,幾千~幾萬樣本,具體場景具體業務去測試