首页 > 其他分享 >使用Sklearn中‘K近邻’分类法对鸢尾花(iris)数据集进行训练分类

使用Sklearn中‘K近邻’分类法对鸢尾花(iris)数据集进行训练分类

时间:2024-03-17 23:30:44浏览次数:26  
标签:iris 数据 feature train test 鸢尾花 size data Sklearn

一、前言

1.1 数据集iris探索性分析

        Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。

该数据集包含了4个属性:

序号属性单位
1

 Sepal.Length(花萼长度)

cm
2Sepal.Width(花萼宽度)cm
3Petal.Length(花瓣长度)cm
4Petal.Width(花瓣宽度)cm

种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。

1.2 导入工具包

1.2.1 导入数据

导入数据的方法如下:
from sklearn.datasets import 数据名称
        Scikit-learn 支持以 NumPyarrays 对象、 Pandas 对象、 SciPy 的稀疏矩阵及其他可转换为数值型 arrays 的数据结构作为其输入,前提是数据必须是数值型的。 sklearn.datasets 模块提供了一系列加载和获取著名数据集如鸢尾花、波士顿房价、 Olivetti 人脸、 MNIST 数据集等的工具,也包括了一些toy data 如 S 型数据等的生成工具。

        Scikit-learn内置了很多可以用于机器学习的数据,可以用两行代码就可以使用这些数据。内置数据分为可以直接 使用的数据集、需下载的数据集以及生成数据集。

1.2.2 导入工具及加载数据

# 导入iris数据集
from sklearn.datasets import load_iris

# 分割数据模块
from sklearn.model_selection import train_test_split

# K最近(KNN,K-Nearest Neighbor)分类算法
from sklearn.neighbors import KNeighborsClassifier

# 加载iris数据集
data = load_iris()

# 导入数据和标签
data_X = data.data
data_y = data.target

1.3 利用matplotlib将数据可视化

1.3.1 代码

# ———————画图,看第一和第三特征的分布——————————————————
import matplotlib.pyplot as plt
print(data.feature_names)
# print(data.data[:, 0])
# print(data.data[:, 2])
feature_1 = data.data[:, 0]
feature_3 = data.data[:, 2]
plt.scatter(feature_1, feature_3)  # 看数据分布
plt.show()

# _--------------------150个数据的行索引号0-149------------
plt.scatter(feature_1[:50], feature_3[:50], c='red')  # 第一类
plt.scatter(feature_1[50:100], feature_3[50:100], c='blueviolet')  # 第二类
plt.scatter(feature_1[100:], feature_3[100:], c='darkred')  # 第三类
plt.show()

1.3.2 图

注:红色--第一类;紫色--第二类;深红色--第三类

二、数据预处理

2.1 划分数据集的工具

2.1.1 导入划分数据集工具train_test_split

from sklearn.model_selection import train_test_split

2.2.2 train_test_split函数的定义

def train_test_split(*arrays,test_size=None,train_size=None,random_state=None,
    shuffle=True,stratify=None,):

 参数:

1. arrays:一个或多个数据集。

2. test_size:测试集的大小,可以表示为绝对个数或相对比例。

3. train_size:训练集的大小,可以表示为绝对个数或相对比例。

4. random_state:随机数种子,用于确保获得可重复的结果。

5. shuffle:表示是否将数据集打乱后再划分。

6. stratify:表示是否按照某个因素进行分层抽样。

其中,test_size和train_size的相对比例需要满足以下条件之一:

1. test_size和train_size都为None,此时默认划分比例为0.25。

2. test_size和train_size都指定了绝对个数。

3. test_size指定了相对比例,train_size为None,此时训练集大小为1-test_size。

4. train_size指定了相对比例,test_size为None,此时测试集大小为1-train_size。

stratify参数是用于处理数据集中不平衡的情况,比如分类问题中各类别之间数据量差别较大,为了在测试集和训练集中保持类别分布的一致性,可以使用stratify参数。如果划分数据集的目标变量是y,可以将stratify=y。

 2.2 对iris数据集进行划分

# 将完整数据集的70%作为训练集,30%作为测试集,
# 并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略),另外可通过设置shuffle=True 提前打乱数据。
X_train, X_test, y_train, y_test = train_test_split(data_X,
                                                    data_y,
                                                    random_state=12,
                                                    stratify=data_y,
                                                    test_size=0.3)

三、建模分析

3.1 K近邻模型函数相关定义及参数

3.1.1 定义 

KNeighborsClassifier(n_neighbors=5, weights='uniform', 
                     algorithm='auto', leaf_size=30, 
                     p=2, metric='minkowski', 
                     metric_params=None, n_jobs=1, **kwargs)

3.1.2 参数 

  • n_neighbors: 默认值为5,表示查询k个最近邻的数目
  • algorithm: {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’},指定用于计算最近邻的算法,auto表示试图采用最适合的算法计算最近邻
  • leaf_size: 传递给‘ball_tree’或‘kd_tree’的叶子大小
  • metric: 用于树的距离度量。默认'minkowski与P = 2(即欧氏度量)
  • n_jobs: 并行工作的数量,如果设为-1,则作业的数量被设置为CPU内核的数量

查看官方api:http://scikitlearn.org/dev/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier 

3.2 建立模型并进行训练预测

# 建立模型
knn = KNeighborsClassifier()
# knn=KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test))  # 计算模型的准确率

# 预测模型
y_pred = knn.predict(X_test)
print(y_pred - y_test)

3.2.1 模型预测结果

正确率:0.97777777……

 四、模型评估

4.1 用accuracy_score计算准确率

# ——用accuracy_score计算准确率— ———————
from sklearn.metrics import accuracy_score

print(accuracy_score(y_test, y_pred))  # 也可以算正确率

print(accuracy_score(y_test, y_pred, normalize=False))  # 统计测试样本分类的个数

 正确率:0.977777777……

五、加载和保存模型

# 保存和加载模型
import joblib

# 用joblib.dump保存模型
joblib.dump(knn, 'iris_KNN.pkl')
# # 用joblib.load加载已保存的模型
knn1 = joblib.load('iris_KNN.pkl')
# #测试读取后的Model
print(knn1.predict(data_X[0:1]))  # 预测第一个数据的类别
y_pred1 = knn1.predict(X_test)
print(y_pred1 - y_test)

六、完整代码

# (1)数据导入,分割数据
# 导入iris数据集
from sklearn.datasets import load_iris

# 分割数据模块
from sklearn.model_selection import train_test_split

# (2)K最近(KNN,K-Nearest Neighbor)分类算法
from sklearn.neighbors import KNeighborsClassifier

# 加载iris数据集
data = load_iris()
# 导入数据和标签
data_X = data.data
data_y = data.target

# ———————画图,看第一和第三特征的分布——————————————————
import matplotlib.pyplot as plt
print(data.feature_names)
# print(data.data[:, 0])
# print(data.data[:, 2])
feature_1 = data.data[:, 0]
feature_3 = data.data[:, 2]
plt.scatter(feature_1, feature_3)  # 看数据分布
plt.show()

# _--------------------150个数据的行索引号0-149------------
plt.scatter(feature_1[:50], feature_3[:50], c='red')  # 第一类
plt.scatter(feature_1[50:100], feature_3[50:100], c='blueviolet')  # 第二类
plt.scatter(feature_1[100:], feature_3[100:], c='darkred')  # 第三类
plt.show()

# 分割数据

# 将完整数据集的70%作为训练集,30%作为测试集,
# 并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略),另外可通过设置shuffle=True 提前打乱数据。
X_train, X_test, y_train, y_test = train_test_split(data_X,
                                                    data_y,
                                                    random_state=12,
                                                    stratify=data_y,
                                                    test_size=0.3)
# 建立模型进行训练和预测

# 建立模型
knn = KNeighborsClassifier()
# knn=KNeighborsClassifier(n_neighbors=3)

# (3)训练模型
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test))  # 计算模型的准确率

# (4)预测模型
y_pred = knn.predict(X_test)
print(y_pred - y_test)

# (5)评价— ——用accuracy_score计算准确率— ———————
from sklearn.metrics import accuracy_score

print(accuracy_score(y_test, y_pred))  # 也可以算正确率

print(accuracy_score(y_test, y_pred, normalize=False))  # 统计测试样本分类的个数

# (6)保存和加载模型
import joblib

# 用joblib.dump保存模型
joblib.dump(knn, 'iris_KNN.pkl')
# # 用joblib.load加载已保存的模型
knn1 = joblib.load('iris_KNN.pkl')
# #测试读取后的Model
print(knn1.predict(data_X[0:1]))  # 预测第一个数据的类别
y_pred1 = knn1.predict(X_test)
print(y_pred1 - y_test)

标签:iris,数据,feature,train,test,鸢尾花,size,data,Sklearn
From: https://blog.csdn.net/m0_59611146/article/details/136792251

相关文章

  • Tensorflow笔记(一):常用函数、张量操作、神经网络模型实现(鸢尾花分类)
    importpandasaspdimporttensorflowastfimportnumpyasnp#-----------------------------tensor张量-----------------------------------#创建张量a=tf.constant([1,5],dtype=tf.int64)print(a)#>tf.Tensor([15],shape=(2,),dtype=int64)#结果......
  • Sklearn支持向量机
    支持向量机(SupportVectorMachine,SVM)是一种常用的分类算法,它可以用于解决二分类和多分类问题。在Python中,你可以使用Sklearn库来实现SVM。下面是一个简单的例子,展示了如何使用Sklearn进行SVM分类。#导入必要的库fromsklearn.model_selectionimporttrain_test_split......
  • 样本轮廓系数(原理、sklearn.metrics.silhouette_score、silhouette_samples参数介绍)
    https://blog.csdn.net/maple05/article/details/110454075?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170902662116800226570765%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170902662116800226570765&biz_id=0&am......
  • sklearn学习笔记之线性回归
    AI时代扑面而来,在大众面对ChatGPT和Sora发出无数惊叹号的时候,我决定不再只当一个AI时代的API调用者,而是去学习机器学习技术本身。刚好公司也要往人工智能方向发展的计划,于是我开始从基础学习,发现了一个宝藏开源机器学习库:scikit-learn。scikit-learn文档健全,社区生态非常完善,这......
  • 【机器学习算法】KNN鸢尾花种类预测案例和特征预处理。全md文档笔记(已分享,附代码)
    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻辑回归,决策树算法,集成学习,聚......
  • 【机器学习算法】KNN鸢尾花种类预测案例和特征预处理。全md文档笔记(已分享,附代码)
    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻辑回归,决策树算法,集成学习,聚......
  • iris中的中间件调用顺序
    有一篇文章写得不错:「Go框架」深入理解web框架的中间件运行机制-知乎(zhihu.com)我这里只是写一个简单的demo来观察一下,代码如下:packagemainimport("fmt""github.com/kataras/iris/v12""github.com/kataras/iris/v12/middleware/logger""github.co......
  • R语言Kmeans聚类、PAM、DBSCAN、AGNES、FDP、PSO粒子群聚类分析iris数据结果可视化比
    全文链接:http://tecdat.cn/?p=32007原文出处:拓端数据部落公众号本文以iris数据和模拟数据为例,帮助客户了比较R语言Kmeans聚类算法、PAM聚类算法、DBSCAN聚类算法、AGNES聚类算法、FDP聚类算法、PSO粒子群聚类算法在iris数据结果可视化分析中的优缺点。结果:聚类算法的聚类结......
  • Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(七)
    原文:Hands-OnMachineLearningwithScikit-Learn,Keras,andTensorFlow译者:飞龙协议:CCBY-NC-SA4.0第十六章:使用RNN和注意力进行自然语言处理当艾伦·图灵在1950年想象他著名的Turing测试时,他提出了一种评估机器匹配人类智能能力的方法。他本可以测试许多事情,比如......
  • Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(二)
    原文:Hands-OnMachineLearningwithScikit-Learn,Keras,andTensorFlow译者:飞龙协议:CCBY-NC-SA4.0第三章:分类在第一章中,我提到最常见的监督学习任务是回归(预测值)和分类(预测类)。在第二章中,我们探讨了一个回归任务,使用各种算法(如线性回归、决策树和随机森林)来预测房屋价......