1.4 机器学习-K 近邻算法(代码干货)

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)
MSE=\frac{1}{n} \sum_{i=1}^{n}(y_{i} - \hat{y_{i}})^2
# 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. 预测评估。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广漂一枚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值