• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

[Machine Learning] 使用经典分类模型k最近邻(kNN)实现鸢尾花分类

一、内容实现概述

本文主要讲述使用scikit-learn库内置的kNN模型,实现鸢尾花分类。具体实现过程如下:

  • 1. 导入所需库:预先导入scikit-learn库
  • 2. 导入数据:调用sklearn库内置的加载数据的方法load_iris(),导入鸢尾花数据
  • 3. 数据预处理:对鸢尾花数据进行预处理,获得特征数据与目标数据
  • 4. 数据分割:使用sklearn库的数据分割方法对步骤3中的数据进行比例分割,得到训练集和测试集数据
  • 5. 构建kNN模型:调用sklearn库的分类模型类KNeighborsClassifier构建模型(本实现已手动设置预测样本结果的邻居值为3,因为该训练样本中最多只有3个鸢尾花类别)
  • 6. 训练模型:调用sklearn库的fit()方法对训练集数据进行训练
  • 7. 预测模型:调用sklearn库的predict()方法对测试集数据进行预测
  • 8. 评估模型:由于该模型是分类模型,所以调用sklearn库的准确率评估方法accuracy_score()进行评估

注:

  • 在Python中使用(导入)scikit-learn框架时,需要先安装,本实现使用的是pip命令安装 pip install -U scikit-learn
  • Scikit-Learn官方教程

 

二、代码实现

注:源代码地址

# 主题:使用kNN(k-近邻)算法实现鸢尾花类别分类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 第一、二步:导入鸢尾花数据并进行数据预处理
X, y = load_iris(return_X_y=True)

# 第三步:分割数据集
# 设置这个随机状态(random_state)是为了保证数据集的“不随机”​。
# 因为设置random_state的目的就是确保每次运行分割程序时,获得完全一样的训练集和测试集。否则,同样的算法模型在不同的训练集和测试集上的效果不一样。如果每次都随机抽样,那么在确定模型和初始参数后,你会发现,模型每运行一次,就会得到不同的预测准确率(因为模型性能通常都对训练集敏感)​,从而使得调参无法有效进行
# 可以这样理解,每个随机状态(random_state,即某个整数值)都代表一批不同的训练集和测试集。如果它的值不变,无论程序运行多少次,获取的都是固定的一批训练集和测试集,这种稳定性为我们进行模型调参提供了方便
# 一旦模型调参完毕,这个值就不需要设置了。如果不设置这个值,就会启用它的默认值None。一旦这个值被设置为None,就启用np.random作为随机种子,即默认以系统时间为随机种子。我们知道,时光荏苒,每时每刻的系统时间都不同,反而让样本的抽取更趋近随机抽样状态。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123)

# 第四步:导入K-近邻算法模型
knn_model = KNeighborsClassifier(n_neighbors=3)

# 第五步:训练模型
knn_model.fit(X_train, y_train)

# 第六步:预测模型
y_train_pred = knn_model.predict(X_train)
y_pred = knn_model.predict(X_test)

# 第七步:绘制预测结果


# 第八步:评估模型
# 由于目标值是离散的,因此可直接使用准确率进行评估
acc_score = accuracy_score(y_test, y_pred) # 其自定义的实现为:sum(y_pred == y_test) / len(y_test) * 100
train_acc_score = accuracy_score(y_train, y_train_pred)
print("Accuracy: {:.2f}%".format(100 * acc_score))
print("Train accuracy score: {:.2f}%".format(100 * train_acc_score))

 

三、运行结果

 

posted on 2025-01-17 16:50  tony-cao  阅读(216)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3