原來機(jī)器學(xué)習(xí)那么簡單—KNN回歸
一、什么是K近鄰回歸?
K近鄰回歸(K-Nearest Neighbors Regression,簡稱KNN回歸)是一種簡單直觀的機(jī)器學(xué)習(xí)算法。KNN回歸通過尋找樣本空間中與目標(biāo)點最接近的K個鄰居,利用這些鄰居的平均值或加權(quán)平均值來預(yù)測目標(biāo)點的值。KNN回歸屬于非參數(shù)模型,因為它不對數(shù)據(jù)的分布做出假設(shè),也不需要訓(xùn)練過程。
二、K近鄰回歸的原理
KNN回歸的核心思想非常直觀,即“相似的樣本具有相似的輸出”。具體步驟如下:
- 計算距離:對于待預(yù)測的樣本點,計算其與訓(xùn)練集中每一個樣本點之間的距離。常用的距離度量包括歐氏距離(Euclidean Distance)、曼哈頓距離(Manhattan Distance)等。歐氏距離的計算公式為:
- 選擇K個鄰居:根據(jù)計算得到的距離,選擇距離待預(yù)測樣本點最近的K個鄰居。
- 計算預(yù)測值:根據(jù)選中的K個鄰居的輸出值,計算待預(yù)測樣本點的輸出值。常用的方法包括簡單平均和加權(quán)平均。
如果是簡單平均,則預(yù)測值為K個鄰居的輸出值的算術(shù)平均:
三、K近鄰回歸的優(yōu)缺點
優(yōu)點:
- 簡單直觀:算法思想簡單,容易理解和實現(xiàn)。
- 無模型假設(shè):KNN回歸不對數(shù)據(jù)的分布做任何假設(shè),適用于各種數(shù)據(jù)分布。
- 高靈活性:由于無需訓(xùn)練過程,KNN回歸可以處理在線學(xué)習(xí)問題,也可以隨時加入新的數(shù)據(jù)。
缺點:
- 計算復(fù)雜度高:對于大規(guī)模數(shù)據(jù)集,計算每個樣本點的距離代價較高,影響預(yù)測效率。
- 維度災(zāi)難:隨著特征維數(shù)的增加,樣本之間的距離變得越來越難以區(qū)分,導(dǎo)致預(yù)測效果下降。
- 對異常值敏感:KNN回歸直接依賴于鄰居的輸出值,如果鄰居中存在異常值,可能會嚴(yán)重影響預(yù)測結(jié)果。
四、案例分析
在這一部分,我們還是使用加州房價數(shù)據(jù)集來演示如何應(yīng)用K近鄰回歸算法進(jìn)行預(yù)測。加州房價數(shù)據(jù)集包含了加州的街區(qū)信息,每個街區(qū)有多項特征,包括人口、收入、房屋年齡等。目標(biāo)是根據(jù)這些特征預(yù)測該街區(qū)的房屋中位數(shù)價格。
- 數(shù)據(jù)加載與預(yù)處理:
- 加載加州房價數(shù)據(jù)集并進(jìn)行標(biāo)準(zhǔn)化處理,確保所有特征都在相同的尺度上。
- 將數(shù)據(jù)集劃分為訓(xùn)練集和測試集,比例為8:2。
- 模型訓(xùn)練:
- 使用
KNeighborsRegressor
創(chuàng)建一個K近鄰回歸模型,選擇K=5
,即考慮最近的5個鄰居。 - 用訓(xùn)練集的數(shù)據(jù)來訓(xùn)練模型。
- 模型預(yù)測:
- 利用訓(xùn)練好的模型對測試集進(jìn)行預(yù)測,并計算均方誤差(MSE)作為模型性能的評估指標(biāo)。
代碼實現(xiàn):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error
# 加載加州房價數(shù)據(jù)集
california = fetch_california_housing()
X = california.data
y = california.target
# 數(shù)據(jù)標(biāo)準(zhǔn)化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 創(chuàng)建K近鄰回歸模型并訓(xùn)練
knn = KNeighborsRegressor(n_neighbors=5)
knn.fit(X_train, y_train)
# 預(yù)測測試集
y_pred = knn.predict(X_test)
# 計算均方誤差
mse = mean_squared_error(y_test, y_pred)
print(f"測試集的均方誤差: {mse:.2f}")
# 可視化結(jié)果
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, edgecolor='k', alpha=0.7)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r--', lw=3)
plt.xlabel("真實房價")
plt.ylabel("預(yù)測房價")
plt.title("K近鄰回歸預(yù)測結(jié)果")
plt.show()
結(jié)果分析:
測試集的均方誤差: 0.43。繪制模型預(yù)測的房價與真實房價之間的關(guān)系圖如下:
五、總結(jié)
K近鄰回歸是一種簡單且易于理解的回歸算法,適合用于小規(guī)模數(shù)據(jù)集或需要在線更新模型的場景。然而,在使用KNN回歸時,需要考慮數(shù)據(jù)的維數(shù)和計算復(fù)雜度,并對異常值進(jìn)行處理,以確保模型的預(yù)測效果。
本文轉(zhuǎn)載自寶寶數(shù)模AI,作者: BBSM ????
