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

本文介绍了如何使用Python的Scikit-learn库对经典的Iris数据集进行探索性数据分析,包括数据可视化、数据预处理(划分训练集和测试集)、KNN分类模型构建、训练、预测以及模型评估。最后展示了模型的准确率计算和模型的保存与加载过程。
摘要由CSDN通过智能技术生成

一、前言

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 支持以 NumPy arrays 对象、 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)

  • 33
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是机器学习鸢尾花数据集knn算法的源代码: ``` import numpy as np 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 # 加载鸢尾花数据集 iris = load_iris() X = iris.data y = iris.target # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 创建KNN分类器 knn = KNeighborsClassifier(n_neighbors=3) # 训练模型 knn.fit(X_train, y_train) # 预测测试集结果 y_pred = knn.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("准确率:", accuracy) ``` 该代码使用sklearn库中KNeighborsClassifier类来创建KNN分类器,并使用鸢尾花数据集进行训练和测试。最后计算出了模型的准确率。 ### 回答2: 机器学习鸢尾花数据集是一个经典的数据集,包含了150个样本,每个样本有4个特征,分为3个类别。对于这个数据集,可以使用knn(K-Nearest Neighbors)算法进行分类。下面是KNN算法在Python的实现: 首先,我们需要导入所需的库:numpy和sklearn ```python import numpy as np from sklearn import datasets from sklearn.neighbors import KNeighborsClassifier ``` 然后,我们需要加载数据集: ```python iris = datasets.load_iris() X = iris.data y = iris.target ``` 接下来,我们将数据集划分为训练集和测试集: ```python # 划分训练集和测试集 indices = np.random.permutation(len(X)) X_train = X[indices[:-30]] y_train = y[indices[:-30]] X_test = X[indices[-30:]] y_test = y[indices[-30:]] ``` 然后,我们可以使用sklearn库中KNeighborsClassifier类来建立模型: ```python # 创建一个knn分类器实例,k=3 knn = KNeighborsClassifier(n_neighbors=3) # 用训练训练模型 knn.fit(X_train, y_train) # 对测试集进行预测 y_pred = knn.predict(X_test) ``` 最后,我们可以使用sklearn库中的metrics类来评估模型: ```python # 评估模型,输出准确率 from sklearn import metrics print(metrics.accuracy_score(y_test, y_pred)) ``` 完整的源代码如下: ```python import numpy as np from sklearn import datasets from sklearn.neighbors import KNeighborsClassifier from sklearn import metrics iris = datasets.load_iris() X = iris.data y = iris.target # 划分训练集和测试集 indices = np.random.permutation(len(X)) X_train = X[indices[:-30]] y_train = y[indices[:-30]] X_test = X[indices[-30:]] y_test = y[indices[-30:]] # 创建一个knn分类器实例,k=3 knn = KNeighborsClassifier(n_neighbors=3) # 用训练训练模型 knn.fit(X_train, y_train) # 对测试集进行预测 y_pred = knn.predict(X_test) # 评估模型,输出准确率 print(metrics.accuracy_score(y_test, y_pred)) ``` 以上便是KNN算法在Python使用鸢尾花数据集进行分类的源代码实现。 ### 回答3: 鸢尾花数据集是机器学习比较经典的数据集之一,数据集包含了三种不同种类的鸢尾花,分别是山鸢尾、变色鸢尾和维吉尼亚鸢尾。在对这个数据集进行机器学习分类时,通常使用k近邻算法(k-nearest neighbors,简称knn)。 KNN算法的原理是通过计算相邻点之间的距离来确定未知数据的类别。KNN算法是一种有监督的学习方法,它需要训练数据集和已知数据类别,然后通过对新样本与已知样本的距离进行计算,确定样本属于哪一个类别。 下面是使用python的sklearn库实现KNN算法鸢尾花数据集进行分类的原始代码: ``` python 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 # 加载鸢尾花数据集 iris = load_iris() # 将数据集分成测试集和验证集 X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.3, random_state=42) # 定义KNN分类器,设置K值为3 knn = KNeighborsClassifier(n_neighbors=3) # 训练KNN分类器 knn.fit(X_train, y_train) # 预测测试集的类别 y_pred = knn.predict(X_test) # 计算分类器的准确率 accuracy = accuracy_score(y_test, y_pred) print("模型的准确率为:", accuracy) ``` 这段代码首先使用sklearn库中的load_iris函数加载鸢尾花数据集,然后使用train_test_split函数将数据集分成训练集和测试集。接着定义KNN分类器,并使用fit方法将训练数据喂入分类进行训练。最后使用predict方法预测测试集的类别,并使用accuracy_score方法计算分类器的准确率。输出结果为模型的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值