K 近邻 算法的核心思想非常直观,可以用一句古老的谚语来概括:“观其友,知其人”。
它假设一个数据点的类别或值可以由它周围最接近它的“邻居们”来决定。
-
分类问题:通过“投票”决定。取一个数据点周围最近的 K 个邻居,在这 K 个邻居中,哪种类别最多,这个数据点就属于哪种类别。
-
回归问题:通过“平均”决定。取一个数据点周围最近的 K 个邻居,将这 K 个邻居的值的平均值作为这个数据点的预测值。
KNN 算法的实现主要依赖于以下三个核心要素,其选择和组合共同决定了算法的最终表现,如下图所示:

一、 按功能任务划分
1、K 近邻分类算法
1.1、算法原理
KNN 核⼼思想:根据样本在特征空间中的 K 个最近邻居的标签来预测其类别。
决策规则:对于分类问题,采⽤多数投票原则。
任务:解决离散标签的分类问题,例如:预测一朵花是鸢尾花还是百合花。
1.2、完整学习流程
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
if __name__ == '__main__':
# 1. 加载数据
X, y = load_breast_cancer(return_X_y=True)
# 2. 数据切分
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, shuffle=True, random_state=0
)
# 3. 数据特征标准化(重要!)
mu = X_train.mean(axis=0)
sigma = X_train.std(axis=0) + 1e-9
X_train_scaled = (X_train - mu) / sigma
X_test_scaled = (X_test - mu) / sigma
# 4. 模型训练
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train_scaled, y_train)
# 5. 预测和评估
y_pred = knn.predict(X_test_scaled)
accuracy = (y_pred == y_test).mean()
print(f"准确率: {accuracy:.4f}") #0.9561
1.3、模型训练和预测拆分
将1.2模型训练和模型预测拆分为2个阶段,训练阶段训练好的模型使用pickle保存,预测阶段pickle加载模型和参数后,对数据进行预测。
1.3.1、模型训练
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import pickle
if __name__ == '__main__':
# 1. 加载数据
X, y = load_breast_cancer(return_X_y=True)
# 2. 数据切分
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, shuffle=True, random_state=0
)
# 3. 数据特征标准化(重要!)
mu = X_train.mean(axis=0) # 均值
sigma = X_train.std(axis=0) + 1e-9 # 标准差
X_train_scaled = (X_train - mu) / sigma
X_test_scaled = (X_test - mu) / sigma
# 4. 模型训练
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train_scaled, y_train)
# 5、保存单个模型和标准化参数
with open("knn_model.pkl", "wb") as model_file:
pickle.dump({'model': knn, 'mu': mu, 'sigma': sigma}, file=model_file)
print("模型和标准化参数已保存到 knn_model.pkl")
1.3.2、模型预测
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import pickle
if __name__ == '__main__':
# 1. 加载模型和标准化参数
with open('knn_model.pkl', 'rb') as model_file:
saved = pickle.load(model_file)
knn = saved['model']
mu = saved['mu']
sigma = saved['sigma']
# 2. 加载或生成新数据
X, y = load_breast_cancer(return_X_y=True)
# 2.1. 此处使用测试数据切分
X_train, X_new, y_train, y_new = train_test_split(
X, y, test_size=0.2, shuffle=True, random_state=0
)
# 3. 数据特征标准化新数据
X_new_scaled = (X_new - mu) / sigma
# 4. 进行预测
y_pred = knn.predict(X_new_scaled)
# 5、计算准确率
accuracy = (y_pred == y_new).mean()
print(f"准确率: {accuracy:.4f}")
2、K 近邻回归算法
- 决策规则:对于回归问题,采⽤多数平均原则。
-
任务:解决连续数值的预测问题,例如:预测某个区域的房价。
2.1、数据集介绍
样本数量:506 个
特征数量(x):13 个房屋相关特征
⽬标变量(y):房价(连续值)
import pandas as pd
# 1. 加载数据
data = pd.read_csv("boston_house_prices.csv", skiprows=1)
X = data.loc[:, :"LSTAT"].to_numpy() # 特征
y = data.loc[:, "MEDV"].to_numpy() # ⽬标变量(房价)
2.2、回归算法流程
from sklearn.neighbors import KNeighborsRegressor
# 2. 数据切分和标准化(与分类相同)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
mu = X_train.mean(axis=0)
sigma = X_train.std(axis=0) + 1e-9
X_train_scaled = (X_train - mu) / sigma
X_test_scaled = (X_test - mu) / sigma
# 3. 回归模型
knn_reg = KNeighborsRegressor(n_neighbors=5)
knn_reg.fit(X_train_scaled, y_train)
y_pred = knn_reg.predict(X_test_scaled)
2.3、回归评估指标
平均绝对误差 (MAE):
均⽅误差
(MSE):
# 4. 评估指标计算
mae = abs(y_pred - y_test).mean()
mse = ((y_pred - y_test) ** 2).mean()
rmse = mse ** 0.5
print(f"平均绝对误差: {mae:.4f}")
print(f"均⽅误差: {mse:.4f}")
print(f"均⽅根误差: {rmse:.4f}")
因而,机器学习标准流程为:1.数据加载 → 2. 数据切分 → 3. 特征预处理 → 4. 模型训练 → 5. 预测评估。
2万+

被折叠的 条评论
为什么被折叠?



