机器学习案例一:鸢尾花

1

from sklearn import datasets
import pandas as pd
import numpy as np

iris = datasets.load_iris() #Loading the dataset
print(iris.keys())
# dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

下面是对这段代码的解释:

  1. from sklearn import datasets: 这行代码导入了datasets模块,该模块包含了一些常用的示例数据集,其中包括鸢尾花数据集。

  2. import pandas as pd: 这行代码导入了pandas库并将其命名为pd

  3. import numpy as np: 这行代码导入了numpy库并将其命名为np

  4. iris = datasets.load_iris(): 这行代码使用datasets模块中的load_iris()函数来加载鸢尾花数据集。加载后的数据被赋值给变量iris

  5. iris.keys(): 这行代码调用了iris数据集的keys()方法,返回了一个包含数据集的键(key)的列表。这些键表示数据集的不同方面。返回的键包括:

    • 'data': 包含样本数据的numpy数组。
    • 'target': 包含每个样本对应的目标类别(0、1、2)的numpy数组。
    • 'frame': 数据集的一个备用表示,通常不会使用。
    • 'target_names': 目标类别的名称。
    • 'DESCR': 数据集的描述文本,包括数据集的来源和特征描述等信息。
    • 'feature_names': 特征的名称。
    • 'filename': 数据集文件的路径(如果适用)。
    • 'data_module': 数据集的Python模块路径。

这段代码演示了如何加载鸢尾花数据集,并访问其中的不同方面,如数据、目标类别、特征名称等。通常,这些数据可以用于机器学习任务,如分类、聚类等。

2

这段代码使用pandas库创建了一个名为iris的DataFrame,将鸢尾花数据集的特征数据和目标类别合并到一个表格中。下面是对这段代码的解释:

iris = pd.DataFrame(
    data=np.c_[iris['data'], iris['target']],
    columns=iris['feature_names'] + ['target']
)
  • pd.DataFrame(...): 这是pandas库中用于创建DataFrame的函数。

  • data=np.c_[iris['data'], iris['target']]: 这里使用了numpynp.c_[]函数,将鸢尾花数据集的特征数据和目标类别按列合并。iris['data']表示特征数据,iris['target']表示目标类别。np.c_[]函数的作用是按列连接两个数组,将它们合并成一个二维数组。

  • columns=iris['feature_names'] + ['target']: 这里为DataFrame的列指定了列名。iris['feature_names']表示特征名称,['target']表示目标类别的列名。通过将特征名称列表和目标类别列名连接在一起,创建了DataFrame的列名。

综上所述,这段代码创建了一个DataFrame,其中包含了鸢尾花数据集的所有样本数据以及目标类别。DataFrame的列名由特征名称和目标类别列名组成。这样的数据结构更适合进行数据分析、处理和机器学习任务。

3

species = []

for i in range(len(iris['target'])):
    if iris['target'][i] == 0:
        species.append("setosa")
    elif iris['target'][i] == 1:
        species.append('versicolor')
    else:
        species.append('virginica')


iris['species'] = species

这段代码是为了将鸢尾花数据集(iris dataset)中的目标值(target)转换为对应的鸢尾花品种名称,并将结果存储在新的一个名为 species 的列表中。代码中的三个条件分支根据目标值的不同,将对应的品种名称添加到 species 列表中。

让我逐步解释代码的运行过程:

  1. species = []:在开始时,创建一个空列表 species,用于存储转换后的品种名称。

  2. for i in range(len(iris['target']))::通过循环遍历鸢尾花数据集的目标值。len(iris['target']) 返回目标值列表的长度,因此循环将从 0 到 len(iris['target']) - 1 的索引进行迭代。

  3. if iris['target'][i] == 0::检查当前目标值是否等于 0,如果是,则表示对应的品种是 “setosa”,因此将 “setosa” 添加到 species 列表中。

  4. elif iris['target'][i] == 1::如果目标值不等于 0 但等于 1,那么表示对应的品种是 “versicolor”,因此将 “versicolor” 添加到 species 列表中。

  5. else::如果目标值既不是 0 也不是 1,那么就表示对应的品种是 “virginica”,因此将 “virginica” 添加到 species 列表中。

  6. iris['species'] = species:在循环结束后,将存储品种名称的 species 列表赋值给鸢尾花数据集中的一个新列,命名为 species。这样,每个样本都有了对应的品种名称。

通过这段代码,你可以在鸢尾花数据集中创建一个新的列 species,其中包含每个样本对应的品种名称,从而更方便地进行品种分类的分析和可视化。不过,请注意在运行这段代码之前,确保你已经正确加载了鸢尾花数据集,并且 iris['target']iris['species'] 是存在的数据结构。

4

iris.groupby('species').size()

这段代码使用了 Pandas 库中的 groupby() 函数,针对鸢尾花数据集(iris dataset)中的 species 列进行分组,并计算每个品种出现的次数。具体来说,代码执行后将返回一个包含各个品种及其对应出现次数的 Series 对象。

假设你已经正确加载了鸢尾花数据集,并且 iris 是一个包含数据的 DataFrame。让我逐步解释这段代码:

  1. iris.groupby('species'):这部分代码使用了 Pandas 的 groupby() 函数,它根据指定的列名(这里是 'species')对数据进行分组。这意味着数据将按照不同的品种(setosa、versicolor、virginica)进行分组。

  2. .size():在进行分组后,通过调用 size() 函数,计算每个分组中的元素数量(即每个品种出现的次数)。

综合起来,执行 iris.groupby('species').size() 后,你会得到一个 Series,其中每个品种作为索引,对应的值是该品种在数据集中出现的次数。这样的结果可以帮助你了解各个鸢尾花品种在数据集中的分布情况。

5

iris.describe()

iris.describe() 是一个用于统计描述性统计信息的 Pandas 函数,针对鸢尾花数据集(iris dataset)的数值列进行统计分析。该函数会生成关于数据集中各个数值特征的统计信息,包括均值、标准差、最小值、25% 分位数、中位数(50% 分位数)、75% 分位数和最大值。

假设你已经正确加载了鸢尾花数据集,并且 iris 是一个包含数据的 DataFrame。执行 iris.describe() 后,你将会得到一个包含统计信息的表格,其中每一列代表一个数值特征,每一行代表一个统计指标。以下是统计信息的各个指标的含义:

  • count:非缺失值的数量。
  • mean:平均值。
  • std:标准差。
  • min:最小值。
  • 25%:25% 的分位数,也称为第一四分位数,表示数据中小于或等于 25% 数据的值。
  • 50%:50% 的分位数,也称为中位数,表示数据中小于或等于 50% 数据的值。
  • 75%:75% 的分位数,也称为第三四分位数,表示数据中小于或等于 75% 数据的值。
  • max:最大值。

这些统计信息可以帮助你了解数据的分布情况、集中趋势和离散程度,从而更好地理解鸢尾花数据集的特征。通常,通过分析这些统计信息,你可以获得对数据集整体情况的初步印象,并在进行进一步的数据探索和分析时有所指导。

6

import matplotlib.pyplot as plt

setosa = iris[iris.species == "setosa"]
versicolor = iris[iris.species=='versicolor']
virginica = iris[iris.species=='virginica']

fig, ax = plt.subplots()
fig.set_size_inches(13, 7) # adjusting the length and width of plot

# lables and scatter points
ax.scatter(setosa['petal length (cm)'], setosa['petal width (cm)'], label="Setosa", facecolor="blue")
ax.scatter(versicolor['petal length (cm)'], versicolor['petal width (cm)'], label="Versicolor", facecolor="green")
ax.scatter(virginica['petal length (cm)'], virginica['petal width (cm)'], label="Virginica", facecolor="red")


ax.set_xlabel("petal length (cm)")
ax.set_ylabel("petal width (cm)")
ax.grid()
ax.set_title("Iris petals")
ax.legend()

这段代码使用了Python的Matplotlib库来创建一个散点图,展示了鸢尾花数据集中不同种类(setosa、versicolor和virginica)的花瓣长度(petal length)和花瓣宽度(petal width)之间的关系。以下是代码的解释:

  1. 导入Matplotlib库:首先,代码导入了Matplotlib库的pyplot模块,将其命名为plt,以便后续使用该模块中的函数来创建和操作图形。

  2. 数据分组:代码使用类似DataFrame的结构(可能是Pandas库中的DataFrame)来分别创建名为setosa、versicolor和virginica的子数据集。这些子数据集根据花的种类(species)从原始iris数据集中筛选出不同种类的鸢尾花。

  3. 创建图形:通过plt.subplots()函数创建一个包含单个子图的图形对象,并将其分配给fig和ax变量。接着,使用fig.set_size_inches()设置图形的尺寸,使其长度为13英寸,宽度为7英寸。

  4. 绘制散点图:使用ax.scatter()函数绘制散点图。每个ax.scatter()调用绘制一个特定种类的鸢尾花的花瓣长度和宽度数据。不同种类的花使用不同的颜色(蓝色、绿色和红色)来区分。label参数指定了每个散点集的标签,facecolor参数指定了散点的填充颜色。

  5. 设置坐标轴标签:使用ax.set_xlabel()ax.set_ylabel()设置X轴和Y轴的标签,分别为"petal length (cm)“和"petal width (cm)”。

  6. 添加网格线:通过ax.grid()函数在图中添加网格线,以帮助更好地查看数据。

  7. 设置图标题:使用ax.set_title()设置图的标题为"Iris petals"。

  8. 添加图例:通过ax.legend()函数在图的适当位置添加图例,显示不同种类的鸢尾花的标识。

总之,这段代码创建了一个散点图,用于比较不同种类的鸢尾花的花瓣长度和宽度之间的关系。通过不同颜色的散点和图例,可以直观地区分不同种类的花。这样的可视化有助于展示数据之间的模式和趋势,以及不同种类之间的差异。

7

from sklearn.model_selection import train_test_split

# Droping the target and species since we only need the measurements
X = iris.drop(['target','species'], axis=1)

# converting into numpy array and assigning petal length and petal width
X = X.to_numpy()[:, (2,3)]
y = iris['target']

# Splitting into train and test
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.5, random_state=42)

这段代码涉及到使用 scikit-learn 库中的 train_test_split 函数,对数据集进行训练集和测试集的分割。以下是代码的解释:

  1. 导入必要的库:首先,代码导入了从 scikit-learn 库中的 train_test_split 函数,这个函数用于将数据集分割成训练集和测试集。

  2. 特征和标签的准备:代码从鸢尾花数据集中移除了 ‘target’ 列和 ‘species’ 列,因为只需要花的测量数据作为特征。这一步骤是为了获取仅包含花瓣长度和花瓣宽度这两个特征的数据。然后,通过 .to_numpy() 方法将特征转换为 NumPy 数组,并提取出特征矩阵 X,其中只包含了第 2 列(花瓣长度)和第 3 列(花瓣宽度)的数据。

  3. 标签的准备:将原始数据集中的 ‘target’ 列作为标签数组 y。这个数组包含了鸢尾花的分类标签,用来表示花的种类。

  4. 数据集分割:使用 train_test_split 函数,将特征矩阵 X 和标签数组 y 分割成训练集和测试集。具体来说,代码设置了测试集的大小为 50%(test_size=0.5),并且使用了随机种子 random_state=42,以确保随机划分的结果可重复。

  5. 分割结果:分割后的结果是四个数组:X_train 包含训练集的特征数据,X_test 包含测试集的特征数据,y_train 包含训练集的标签数据,y_test 包含测试集的标签数据。

总之,这段代码的主要目的是将鸢尾花数据集分割成训练集和测试集,以便后续可以使用这些数据来训练机器学习模型并进行性能评估。训练集包含一部分数据用于模型的训练,测试集用于评估模型的泛化能力。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力为您解答。首先,让我们来了解一下凑硬币问题。 在凑硬币问题中,我们需要找到最少的硬币数来凑成给定的金额。例如,如果我们需要凑成 11 元,而有 1 元、2 元、5 元三种不同面值的硬币可供使用,那么最少需要使用 3 枚硬币,即 5 元、5 元和 1 元。 下面是一种使用动态规划解决凑硬币问题的方法: 1. 创建一个长度为 amount+1 的数组 dp,其中 dp[i] 表示凑成面值为 i 元所需的最少硬币数。 2. 初始化 dp[0] 为 0,其余元素初始化为一个较大的数(例如 amount+1),表示当前面值无法被凑成。 3. 遍历硬币数组 coins,对于每个硬币,遍历 dp 数组,更新 dp[j] 的值为 dp[j-coins[i]]+1,其中 j>=coins[i],表示当前面值可以被凑成。 4. 最终 dp[amount] 就是凑成 amount 元所需的最少硬币数,如果 dp[amount]>amount,则表示无法凑成给定金额。 下面是使用 JavaScript 实现该算法的代码: ```javascript function coinChange(coins, amount) { const dp = new Array(amount + 1).fill(amount + 1); dp[0] = 0; for (let i = 0; i < coins.length; i++) { for (let j = coins[i]; j <= amount; j++) { dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1); } } return dp[amount] > amount ? -1 : dp[amount]; } ``` 这个函数接受两个参数,一个是硬币数组 coins,另一个是需要凑成的金额 amount。最终返回凑成 amount 元所需的最少硬币数,如果无法凑成则返回 -1。 例如,若 coins = [1, 2, 5],amount = 11,则 coinChange(coins, amount) 的返回值为 3,表示凑成 11 元最少需要 3 枚硬币。 希望这个简单的解释和代码能够帮到您,如果您还有其他问题,请随时问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值