当前位置: 首页 > news >正文

机器学习入门之KNN算法和交叉验证与超参数搜索(三)

机器学习入门之KNN算法和交叉验证与超参数搜索(三)

文章目录

  • 机器学习入门之KNN算法和交叉验证与超参数搜索(三)
  • 一、KNN算法-分类
    • 1. 样本距离判断
      • 明可夫斯基距离
    • 2. KNN 算法原理
    • 3. KNN 的缺点
    • 4. KNN 的 API
    • 5. 使用 sklearn 实现 KNN 示例
    • 6. 模型保存与加载
  • 二、模型选择与调优:交叉验证与超参数搜索
    • 1. 交叉验证
      • (1) 保留交叉验证(HoldOut)
      • (2) K-折交叉验证(K-fold)
      • (3) 分层 K-折交叉验证(Stratified K-fold)
      • (4) 其他验证方法
      • (5) API 示例
    • 2. 超参数搜索(网格搜索,Grid Search)
    • 3. sklearn API
    • 4. 示例:鸢尾花分类


一、KNN算法-分类

1. 样本距离判断

KNN 算法中,样本之间的距离是判断相似性的关键。常见的距离度量方式包括:

明可夫斯基距离

  • 欧式距离:明可夫斯基距离的特殊情况,公式为 (\sqrt{\sum_{i=1}^{n}(x_i - y_i)^2})。
  • 曼哈顿距离:明可夫斯基距离的另一种特殊情况,公式为 (\sum_{i=1}^{n}|x_i - y_i|)。

2. KNN 算法原理

K-近邻算法(K-Nearest Neighbors,简称 KNN)是一种基于实例的学习方法。其核心思想是:如果一个样本在特征空间中的 k 个最相似(最邻近)样本中的大多数属于某个类别,则该样本也属于这个类别。例如,假设我们有 10000 个样本,选择距离样本 A 最近的 7 个样本,其中类别 1 有 2 个,类别 2 有 3 个,类别 3 有 2 个,则样本 A 被认为属于类别 2。

3. KNN 的缺点

  • 计算量大:对于大规模数据集,需要计算测试样本与所有训练样本的距离。
  • 维度灾难:在高维数据中,距离度量可能变得不那么有意义。
  • 参数选择:需要选择合适的 k 值和距离度量方式,这可能需要多次实验和调整。

4. KNN 的 API

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
  • 参数
    • n_neighbors:用于 kneighbors 查询的近邻数,默认为 5。
    • algorithm:找到近邻的方式,可选值为 {'auto', 'ball_tree', 'kd_tree', 'brute'},默认为 'auto'
  • 方法
    • fit(X, y):使用 X 作为训练数据和 y 作为目标数据。
    • predict(X):预测提供的数据,返回预测结果。

5. 使用 sklearn 实现 KNN 示例

以下是一个使用 KNN 算法对鸢尾花进行分类的完整代码示例:

# 用 KNN 算法对鸢尾花进行分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier# 1)获取数据
iris = load_iris()
print(iris.data.shape)  # (150, 4)
print(iris.feature_names)  # ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
print(iris.target.shape)  # (150,)
print(iris.target)  # [0 0 0 ... 2 2 2]
print(iris.target_names)  # ['setosa' 'versicolor' 'virginica']# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)# 3)特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)# 4)KNN 算法预估器
estimator = KNeighborsClassifier(n_neighbors=7)
estimator.fit(x_train, y_train)# 5)模型评估
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)  # 0.9473684210526315

6. 模型保存与加载

使用 joblib 可以方便地保存和加载模型:

import joblib# 保存模型
joblib.dump(estimator, "my_knn.pkl")# 加载模型
estimator = joblib.load("my_knn.pkl")# 使用模型预测
y_test = estimator.predict([[0.4, 0.2, 0.4, 0.7]])
print(y_test)

以下是整理后的 Markdown 格式内容:


二、模型选择与调优:交叉验证与超参数搜索

1. 交叉验证

交叉验证是评估模型性能的重要方法,常见的交叉验证技术包括:

(1) 保留交叉验证(HoldOut)

  • 原理:将数据集随机划分为训练集和验证集,通常比例为 70% 训练集和 30% 验证集。
  • 优点:简单易行。
  • 缺点
    • 不适用于不平衡数据集。
    • 一部分数据未参与训练,可能导致模型性能不佳。

(2) K-折交叉验证(K-fold)

  • 原理:将数据集划分为 K 个大小相同的部分,每次使用一个部分作为验证集,其余部分作为训练集,重复 K 次。
  • 优点:充分利用数据,模型性能更稳定。
  • 缺点:计算量较大。

(3) 分层 K-折交叉验证(Stratified K-fold)

  • 原理:在每一折中保持原始数据中各个类别的比例关系,确保每个折叠的类别分布与整体数据一致。
  • 优点:适用于不平衡数据集,验证结果更可信。

(4) 其他验证方法

  • 留一交叉验证:每次只留一个样本作为验证集。
  • 蒙特卡罗交叉验证:随机划分训练集和测试集,多次重复。
  • 时间序列交叉验证:适用于时间序列数据。

(5) API 示例

from sklearn.model_selection import StratifiedKFoldstrat_k_fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
indexs = strat_k_fold.split(X, y)for train_index, test_index in indexs:X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]

2. 超参数搜索(网格搜索,Grid Search)

网格搜索是一种自动寻找最佳超参数的方法,通过遍历所有可能的参数组合来找到最优解。

3. sklearn API

from sklearn.model_selection import GridSearchCVGridSearchCV(estimator, param_grid, cv=5)
  • 参数
    • estimator:模型实例。
    • param_grid:超参数的网格,例如 {"n_neighbors": [1, 3, 5, 7, 9, 11]}
    • cv:交叉验证的折数,默认为 5。
  • 属性
    • best_params_:最佳参数。
    • best_score_:最佳模型的交叉验证分数。
    • best_estimator_:最佳模型实例。
    • cv_results_:交叉验证结果。

4. 示例:鸢尾花分类

以下是一个使用 KNN 算法对鸢尾花进行分类的完整代码示例,结合了分层 K-折交叉验证和网格搜索:

from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler# 加载数据
iris = load_iris()
X = iris.data
y = iris.target# 初始化分层 K-折交叉验证器
strat_k_fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)# 创建 KNN 分类器实例
knn = KNeighborsClassifier()# 网格搜索与交叉验证
param_grid = {"n_neighbors": [1, 3, 5, 7, 9, 11]}
grid_search = GridSearchCV(knn, param_grid, cv=strat_k_fold)
grid_search.fit(X, y)# 输出结果
print("最佳参数:", grid_search.best_params_)  # {'n_neighbors': 3}
print("最佳准确率:", grid_search.best_score_)  # 0.9553030303030303
print("最佳模型:", grid_search.best_estimator_)  # KNeighborsClassifier(n_neighbors=3)

通过分层 K-折交叉验证和网格搜索,我们可以找到最优的超参数,从而提高模型的性能。


相关文章:

  • 【在aosp中,那些情况下可以拉起蓝牙服务进程】
  • 使用Frp搭建内网穿透,外网也可以访问本地电脑。
  • 第三十三节:特征检测与描述-Shi-Tomasi 角点检测
  • Linux》Ubuntu》安装Harbor 私有仓库
  • 自制操作系统(二、输入输出和shell的简易实现)
  • MySQL中表的增删改查(CRUD)
  • SQL练习(6/81)
  • Day11-苍穹外卖(数据统计篇)
  • 大规模CFD仿真计算中,SIMPLE或者PISO算法中加速压力场方程迭代求解
  • 股票配资平台开发如何判断交易策略是否可靠
  • 实例分割AI数据标注 ISAT自动标注工具使用方法
  • 【未】[启发式算法]含初始解要求的有:TS, GA, SA, DPSO
  • 计算机网络 : 网络基础
  • NAT转换和ICMP
  • AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)
  • 运维实施31-NFS服务
  • 研华服务器ASMB-825主板无法识别PCIE-USB卡(笔记本)
  • 牛客网NC22222:超半的数
  • 【云实验】搭建个人网盘实验
  • leetcode0215. 数组中的第K个最大元素-medium
  • 蔡建忠已任昆山市副市长、市公安局局长
  • 卿晨璟靓等用服刑经历“引流”,专家:将犯罪问题娱乐化会消解刑罚严肃性
  • 王伟妻子人民日报撰文:81192,一架永不停航的战机
  • 国家卫生健康委通报关于肖某引发舆情事件调查处置进展情况
  • 辽宁盘山县一乡镇幼儿园四名老师被指多次殴打一女童,均被行拘
  • 押井守在30年前创造的虚拟世界何以比当下更超前?