重拾Iris鸢尾花数据集分析

article/2025/11/10 22:36:43

        最近我又又又开始了我的机器学习道路,并且回过头来重新看了一遍Iris数据分析,作为机器学习里面最经典的案例之一,鸢尾花既是我入门机器学习到放弃的地方,又是再次细读之后给予我灵感的地方。
        下面介绍一下这次灵感之旅,希望也能带给看到这篇文章的你一些帮助。

1. 从一堆鸢尾花说起

如果一个植物学家在野外看到一花萼长5cm宽2.9cm,花瓣长1cm宽0.2cm的鸢尾花,并且在他的认知里,这种鸢尾花有三个分支品种,这时候,他手里有来自UCI数据集网站的鸢尾花数据,那么他能否根据这对数据集预测这株鸢尾花的所属分支

2. 导入鸢尾花数据 

import sklearn
from sklearn.datasets import load_irisiris_dataset :sklearn.utils.Bunch= load_iris() # 这里是将Python数据指定类型,转换成强语言,为了方便读取可用方法属性print(type(iris_dataset))                       # 查看类型,返回的是一种类似于字典的数据类型
print("iris_Keys : " , iris_dataset.keys())    #对这种类似字典的数据操作,查看数据集的属性

输出:

<class 'sklearn.utils.Bunch'>
iris_Keys :  dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])

3. 核心数据

 

# 通过对values获取,得到鸢尾花特征值集合,其实也可以通过上面类字典的键获取,下面介绍
print("iris_values : \n")
iris_dataset.values()
# 这段代码可以获取鸢尾花特征名字,比如花瓣长度
iris_dataset['feature_names'] 

 

到这里我们获得一堆鸢尾花特征数据,我把它整理并放在了网上, 点击获取

4. 回望我们的目的 

一开始我就介绍,植物学家想通过数据集预测这是个什么种类的鸢尾花,这时候我们可以就获取这些相关种类了

# 获取种类
iris_dataset['target_names']

# 这里返回的是一个numpy.ndarray数组,并且以表格形式呈现

setosa
versicolor
virginica 

在实际数据集中,种类被简化成0、1、2这三个数字,我们可以通过下列方法查看。

flowerTypes = iris_dataset['target']
flowerTypes

 通过第三点的核心数据,以及第四点的种类,我们使用pandas.Dataframe转换成更明显完整的可视化表格,因为往后我还会用到这个完整表格

import pandas, numpy
data = iris_dataset['data']
col :list = iris_dataset['feature_names']
copyCol = col.copy()
copyCol.append('Type')
flowerTypes = iris_dataset['target']
newData = numpy.c_[data, flowerTypes]
dataDf = pandas.DataFrame(newData, columns=copyCol)
dataDf

 这里附上完整版本的表格(相对上一个链接多了种类),点击下载

5. 到现在我们做了什么? 

写到这,其实我们只是导入了一个数据集,并处理好,仅此而已,下面才是真正的建立模型

6. 做一个小思考

通过对上面的数据集查看,我们仅有150个鸢尾花数据,我们将围绕这一个数据集团团转,下面将要提到的额外预测方法也是,在机器学习书上,会经常提到泛化这个词,听起来很学术的一个词,其实就是想要表达一个训练过的模型的向外扩展能力怎么样(比如这里就是预测一株新的鸢尾花种类),这里就需要对数据集有经验的分类,这里暂且以25%(大佬们的经验法则)鸢尾花数据作为测试,剩下的作为训练集。

7.开始建立

按照上一点进行数据划分。

from sklearn.model_selection import train_test_split
X_train, X_test,  y_train, y_test = train_test_split(data, iris_dataset['target'], random_state=42)

对数据分析的一个很好方式就是进行可视化,这里也不例外。这里我们通过绘制散点图矩阵(就是各种特征组成坐标轴的图片,其实我好奇为什么不叫矩阵散点图@_@),mglearn库在这里是一个颜色渲染用的,大可不必纠结。

from pandas import plotting
import mglearn
grr = plotting.scatter_matrix(iris_dataframe,c=y_train,figsize=(16, 16),marker='o',hist_kwds=dict(bins=20),s=60,alpha=0.9,cmap=mglearn.cm3)
grr

你是否感到这张密密麻麻的图片不容易对数据分析,我当时感到就是这样(这图是什么鸟玩意@_@) ,那么不必担心,这时候我上面提到的第二个完整版本的数据就有用处了

newX_train, newX_test, newy_train, newy_test = train_test_split(newData, iris_dataset['target'], random_state=42)
new_iris_dataframe = pandas.DataFrame(newX_train, columns=copyCol)
new_grr = plotting.scatter_matrix(new_iris_dataframe,c=newy_train,figsize=(16, 16),marker='0',hist_kwds=dict(bins=20),s=60,alpha=0.9,cmap=mglearn.cm3)

 我把种类也作为特征,并对每一种本身特征进行划分,从下图边缘几个图你会很容易看到

 

 如果让坐标轴放大并且更精确,我们简直可以对着数据找种类,但是我们不打算这么做,因为有模型这种强大的工具,可以帮我们以高精度演算,并且对于决策边界周围那样的数据(比如上图左下角可以看出sepal length=5.5cm可能属于0代表的种类,也可能是1代表的种类,假如其他三个特征也有这类情况出现),我肯定不希望另起草稿算可能性分布来帮助机器预测,这恐怕事与愿违,反而,应该是机器帮助我预测。

8.重头戏——模型建立

终于,在经历种种准备后,我们要开始建模了,就像是一个固定的“流水线”,把处理好的数据导入模型,下面我们开始第一个用于分类的模型——KNN(K近邻算法)。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

"流水线"一般分为以下几个步骤:

 1. 选择模型并且导入

from sklearn.neighbors import KNeighborsClassifier

 2. 创建模型实例并传入参数

knn = KNeighborsClassifier(n_neighbors=5)

 3. 准备数据

X_train, X_test,  y_train, y_test = train_test_split(data, iris_dataset['target'], random_state=42)

 4. 数据拟合

knn.fit(X_train, y_train)
# 预测
X_new = numpy.array([[5, 2.9, 1, 0.2]])
prediction = knn.predict(X_new)
print("predict : " , prediction)
print("prediction type : " , iris_dataset['target_names'][prediction])

 

5. 预测

 见上述代码

结果:

predict :  [0]
prediction type :  ['setosa']

 得到预测种类了,我们是不是可以告诉植物学家这是一种 'setosa'鸢尾花,还没有!

我们不知道,我们创建的这个模型准确率如何?下面还得验证一下。

y_pre = knn.predict(X_test)
print(y_pre) # [1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 12]
knn.score(X_test, y_test)  # 0.97

97%! 已经是一个很高的预测准确率了。

下面尝试另一种方法,SVM,可以将每一种种类可能性都预测一遍,返回一组评估数组

from sklearn.svm import SVC
svmClf = SVC(random_state=42)
svmClf.fit(X_train, y_train)
all_pre_and_get_score = svmClf.decision_function(X_new)
all_pre_and_get_score

结果: 

2.237142,1.101841,-0.247978

 我们得到的数组有三个值,分别对应0、1、2这三个种类,我们尝试用softmax函数在保持数大小关系不动的前提将它们转换成0~1之间的数,目的是折换成概率(你也可以跳过softmax函数,因为我们只追求SVM作用)

Softmax函数实现:

# Softmax函数
def Softmax(s : list or numpy.ndarray):S = numpy.array([numpy.exp(i) for i in s])u = numpy.sum(S)for j in S:yield j/u
# 转换
for i in Softmax(all_pre_and_get_score):print(i)

结果:

[0.71192572 0.22875983 0.05931445]

我们得到71%概率是0代表种类,……

在SVM中,哪种预测结果最大,我们就认为该结果属于最大一类,因此我们可以通过SVM预测和测试集算出准确率。

# SVM基础上对测试集预测,并算出准确率
pre_list = []
for i in X_test:# 获取SVM预测对应的索引,索引即种类代号i = numpy.array([i])each_pre = svmClf.decision_function(i)eh = each_pre.reshape(-1)pre_list.append(numpy.where(eh == numpy.max(eh))[0][0])
pre_list = numpy.array(pre_list).reshape(y_test.shape)
print(pre_list == y_test)

结果:

[ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True]

结果很让人吃惊,居然达到100%准确率。

总结: 

1. 机器学习的模型布创建步骤以及实践,即上述——“流水线”,其实这里需要补充一点,通过对参数的设置,会打乱数据(因为数据原来是有规律的——前面是一种鸢尾花,中间是一种,后面是一种)。 所以,打乱反而是好事

2. 两种模型的对比和模型总结:

        (1 ).两种模型都获得了理想的预测准确率(虽然我们不知道植物学家会不会相信我们的预测,但高准确率的结果让我们足够有把握)

        (2).若想提高准确率(虽然以及够高了,甚至SVM达到100%),但是我们必须接受事实——数据集实在太少了,准确率就会有明显差,当数据集逐渐增加,我们能轻松想象到一个收敛函数终究收敛到一个值,如果出现97.3%, 97.5%都无所谓了,我就可以认为是97%(对于我来说)(假如97%已经算够高的!),另外这里仅仅用了2个模型,还可以尝试别的模型,比如SGD分类(我试了,虽然获得的精度不尽人意)


http://chatgpt.dhexx.cn/article/AZ9SOe67.shtml

相关文章

Python-鸢尾花数据集Iris 数据可视化 :读取数据、显示数据、描述性统计、散点图、直方图、KDE图、箱线图

本博客运行环境为Jupyter Notebook、Python3。使用的数据集是鸢尾花数据集&#xff08;Iris&#xff09;。主要叙述的是数据可视化。 IRIS数据集以鸢尾花的特征作为数据来源&#xff0c;数据集包含150个数据集&#xff0c;有4维&#xff0c;分为3 类&#xff0c;每类50个数据&a…

《机器学习》分析鸢尾花数据集

转载地址&#xff1a;https://www.cnblogs.com/mandy-study/p/7941365.html 分析鸢尾花数据集 下面将结合Scikit-learn官网的逻辑回归模型分析鸢尾花示例&#xff0c;给大家进行详细讲解及拓展。由于该数据集分类标签划分为3类&#xff08;0类、1类、2类&#xff09;&#xff…

笔记篇二:鸢尾花数据集分类

目录 一、鸢尾花数据集 二、逻辑回归分析 三、逻辑回归实现鸢尾花数据集分类 四、散点图绘制 一、鸢尾花数据集 1、问题 Iris 鸢尾花数据集是一个经典数据集&#xff0c;在统计学习和机器学习领域都经常被用作示例。数据集内包含 3 类共 150 条记录&#xff0c;每类各 5…

IRIS鸢尾花数据集(多种格式)-下载地址

最近看的例子有用到IRIS数据集&#xff0c; 个人找了半天&#xff0c;才找到合适格式的数据集。 因此&#xff0c;将我找到的数据集分享给大家&#xff0c;以免大家像我一样找很久。 我这里有3种格式的数据集&#xff0c;分别是&#xff1a; 1. iris.csv 2. Iris.data 3.…

鸢尾花数据集基本用法

Iris鸢尾花数据集是一个经典的数据集。 包含3类共150条记录&#xff0c;每类各50项数据&#xff0c;每一条记录都有四个体征。 可以通过这四个特征来预测鸢尾花属于哪一个品种。 一.鸢尾花数据集 首先导入数据集&#xff0c;用pandas读入iris.csv数据集&#xff0c;读取后的…

鸢尾花(iris)数据集分析

原文链接&#xff1a;https://www.jianshu.com/p/52b86c774b0b Iris 鸢尾花数据集是一个经典数据集&#xff0c;在统计学习和机器学习领域都经常被用作示例。数据集内包含 3 类共 150 条记录&#xff0c;每类各 50 个数据&#xff0c;每条记录都有 4 项特征&#xff1a;花萼长度…

鸢尾花(iris)数据集

鸢尾花&#xff08;iris&#xff09;数据集 更新时间&#xff1a;2021-03-21 01:01:09标签&#xff1a;数据集 鸢尾花 说明 机器学习教程 正在计划编写中&#xff0c;欢迎大家加微信 sinbam 提供意见、建议、纠错、催更。 鸢【音&#xff1a;yuān】尾花&#xff08;Iris&a…

数据分析——鸢尾花数据集

鸢尾花数据集 Iris 鸢尾花数据集内包含 3 类分别为山鸢尾&#xff08;Iris-setosa&#xff09;、变色鸢尾&#xff08;Iris-versicolor&#xff09;和维吉尼亚鸢尾&#xff08;Iris-virginica&#xff09;&#xff0c;共 150 条记录&#xff0c;每类各 50 个数据&#xff0c;每…

机器学习--鸢尾花数据集实战

Iris数据集实战 本次主要围绕Iris数据集进行一个简单的数据分析, 另外在数据的可视化部分进行了重点介绍. 环境 win8, python3.7, jupyter notebook 目录 1. 项目背景 2. 数据概览 3. 特征工程 4. 构建模型 正文 1. 项目背景 鸢尾属(拉丁学名&#xff1a;Iris L.), …

sklearn基础篇(三)-- 鸢尾花(iris)数据集分析和分类

后面对Sklearn的学习主要以《Python机器学习基础教程》和《机器学习实战基于scikit-learn和tensorflow》&#xff0c;两本互为补充进行学习&#xff0c;下面是开篇的学习内容。 1 初识数据 iris数据集的中文名是安德森鸢尾花卉数据集&#xff0c;英文全称是Anderson’s Iris d…

机器学习——鸢尾花数据集

机器学习——鸢尾花数据集 数据集简介导入数据集可视化主成分分析 鸢尾花数据集即iris iris数据集文件&#xff1a; https://pan.baidu.com/s/1saL_4Q9PbFJluU4htAgFdQ .提取码&#xff1a;1234 数据集简介 数据集包含150个样本&#xff08;数据集的行&#xff09;数据集包含…

实验一:鸢尾花数据集分类

实验一&#xff1a;鸢尾花数据集分类 一、问题描述 利用机器学习算法构建模型&#xff0c;根据鸢尾花的花萼和花瓣大小&#xff0c;区分鸢尾花的品种。实现一个基础的三分类问题。 二、数据集分析 Iris 鸢尾花数据集内包含 3 种类别&#xff0c;分别为山鸢尾&#xff08;Iris…

C++优化之使用emplace

在C开发过程中&#xff0c;我们经常会用STL的各种容器&#xff0c;比如vector&#xff0c;map&#xff0c;set等&#xff0c;这些容器极大的方便了我们的开发。在使用这些容器的过程中&#xff0c;我们会大量用到的操作就是插入操作&#xff0c;比如vector的push_back&#xff…

C++ emplace_back

概述 在C11中&#xff0c;在引入右值的升级后&#xff0c;调用push_back变的更为高效&#xff0c;原本需要调用构造函数构造这个临时对象&#xff0c;然后调用拷贝构造函数将这个临时对象放入容器中。在C11升级后&#xff0c;只需要调用构造函数&#xff0c;然后调用移动拷贝函…

list容器下的 emplace_front() splice() 函数

目录 emplace_front()splice()作者的坑时间复杂度注意点&#xff1a;疑惑处 emplace_front() emplace中文为安置&#xff0c;那么这个函数就是安置到什么什么前面。 void emplace_front(value_type val) ;时间复杂度&#xff1a;O(1) splice() splice译为粘接&#xff0c;作用…

C++优化之使用emplace、emplace_back

在C开发过程中&#xff0c;我们经常会用STL的各种容器&#xff0c;比如vector&#xff0c;map&#xff0c;set等。在使用这些容器的过程中&#xff0c;我们会大量用到的操作就是插入操作&#xff0c;比如vector的push_back&#xff0c;map的insert&#xff0c;set的insert。这些…

emplace_back深度剖析

一&#xff0c;emplace_back和push_back 1&#xff0c;直接插入对象&#xff1a;emplace_back和push_back无区别 ①当传递已经存在的对象时&#xff0c;是无区别的 #include <iostream> #include <vector>using namespace std;/* C11 STL 容器 push/inser…

push_back和emplace_back区别

在使用vector容器时&#xff0c;往容器里添加元素时&#xff0c;有push_back和emplace_back两种方法&#xff0c;一般用得最多得是push_back&#xff0c;下面看看这两种方法得区别&#xff1a; push_back源码&#xff0c;有重载得左值和右值&#xff0c;关于左值和右值可以查看…

C++11之emplace_back

在之前的学习中&#xff0c;了解到在STL中&#xff0c;进行插入元素的时候&#xff0c;有insert和push两种选择方式&#xff0c;而在有了右值引用和移动语义的时候&#xff0c;就提出了更高效的插入方法&#xff1a;emplace_back&#xff0c;下面来介绍一下C11新特性中的emplac…

C++的emplace

一、背景 在C开发过程中&#xff0c;我们经常会用STL的各种容器&#xff0c;比如vector&#xff0c;map&#xff0c;set等&#xff0c;这些容器极大的方便了我们的开发。在使用这些容器的过程中&#xff0c;我们会大量用到的操作就是插入操作&#xff0c;比如vector的push_bac…