鸢尾花分类

在这里插入图片描述

鸢尾花分类

load dataset

鸢尾花数据是机器学习和统计学中经典的数据集,包含在scikir-learn的datasets中,使用load_iris函数加载数据

from  sklearn.datasets import load_iris
iris_dataset = load_iris()
print("Keys of iris_dataset: \n{}".format(iris_dataset.keys()))
print("Target name: \n{}".format(iris_dataset['target_names']))
print("Feature names: \n{}".format(iris_dataset['feature_names']))
print("Target: \n{}".format(iris_dataset['target']))
print("data shape: \n{}".format(iris_dataset['data'].shape))

在这里插入图片描述
其中 load_iris返回iris对象的一个Bunch对象,里面包含有键和值,与字典非常相似
数据包含在target和data字符你,其中data包含花萼长度与宽度,花瓣长度与宽度测量数据,其中data数据的每一行对应一朵花

Training and testing data

通常的做法是将收集好的带标签数据(此例中是 150 朵花的测量数据)分成两部分。一部分数据用于构建机器学习模型,叫作训练数据(training data)或训练集(training set)。其余的数据用来评估模型性能,叫作测试数据(test data)、测试集(test set)或留出集(hold-out set)
scikit-learn 中的 train_test_split 函数可以打乱数据集并进行拆分。这个函数将 75% 的行数据及对应标签作为训练集,剩下 25% 的数据及其标签作为测试集。训练集与测试集的分配比例可以是随意的,但使用 25% 的数据作为测试集是很好的经验法则
scikit-learn 中的数据通常用大写的 X 表示,而标签用小写的 y 表示。这是受到了数学标准公式 f(x)=y 的启发,其中 x 是函数的输入,y 是输出。我们用大写的 X 是因为数据是一个二维数组(矩阵),用小写的 y 是因为目标是一个一维数组(向量),这也是数学中的约定。

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

Building your first model: k nearest neighbors

KNeighborsClassifier 最重要的参数就是邻居的数目,这里我们设为 1

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

在这里插入图片描述
knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行预测的算法。它还包括算法从训练数据中提取的信息。对于 KNeighborsClassifier 来说,里面只保存了训练集。想要基于训练集来构建模型,需要调用 knn 对象的 fit 方法,输入参数为 X_train 和 y_train ,二者都是 NumPy 数组,前者包含训练数据,后者包含相应的训练标签
fit 方法返回的是 knn 对象本身并做原处修改,因此我们得到了分类器的字符串表示。

Making predictions

现在我们可以用这个模型对新数据进行预测了,我们可能并不知道这些新数据的正确标签。想象一下,我们在野外发现了一朵鸢尾花,花萼长 5cm 宽 2.9cm,花瓣长 1cm 宽0.2cm。这朵鸢尾花属于哪个品种?我们可以将这些数据放在一个 NumPy 数组中,再次计算形状,数组形状为样本数(1)乘以特征数(4):

X_new = np.array([[5, 2.9, 1, 0.2]])
prediction = knn.predict(X_new)
print("Prediction: {}".format(prediction))
print("Predicted target name: {}".format(iris_dataset['target_names'][prediction]))

Evaluating the model

y_pred = knn.predict(X_test)
print("Test set predictions:\n {}".format(y_pred))
print("Test set score: {:.2f}".format(knn.score(X_test, y_test)))

在这里插入图片描述
对于这个模型来说,测试集的精度约为 0.97,也就是说,对于测试集中的鸢尾花,我们的预测有 97% 是正确的。根据一些数学假设,对于新的鸢尾花,可以认为我们的模型预测结果有 97% 都是正确的。对于我们的植物学爱好者应用程序来说,高精度意味着模型足够可信,可以使用。

总结

# 导入数据
from  sklearn.datasets import load_iris
iris_dataset = load_iris()
# 讲数据集打乱划分为训练集和测试机
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'],
                                                    iris_dataset['target'],
                                                    random_state=0)
# 使用KNN算法
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
# 进行预测
X_new = np.array([[5, 2.9, 1, 0.2]])
prediction = knn.predict(X_new)
print("Prediction: {}".format(prediction))
print("Predicted target name: {}".format(iris_dataset['target_names'][prediction]))
# 评估模型
y_pred = knn.predict(X_test) # 1 X 20 向量
print("Test set predictions:\n {}".format(y_pred))
print("Test set score: {:.2f}".format(knn.score(X_test, y_test)))

这个代码片段包含了应用 scikit-learn 中任何机器学习算法的核心代码fit 、 predict 和score 方法是 scikit-learn 监督学习模型中最常用的接口
利用鸢尾花的物理测量数据来预测其品种。我们在构建模型时用到了由专家标注过的测量数据集,专家已经给出了花的正确品种,因此这是一个监督学习问题。一共有三个品种:setosa、versicolor 或 virginica,因此这是一个三分类问题
在分类问题中,可能的品种被称为类别(class),每朵花的品种被称为它的标签(label)。鸢尾花(Iris)数据集包含两个 NumPy 数组:一个包含数据,在 scikit-learn 中被称为 X ;一个包含正确的输出或预期输出,被称为 y 。数组 X 是特征的二维数组,每个数据点对应一行,每个特征对应一列。数组 y 是一维数组,里面包含一个类别标签,对每个样本都是一个 0 到 2 之间的整数。
我们将数据集分成训练集(training set)测试集(test set),前者用于构建模型,后者用于评估模型对前所未见的新数据的泛化能力。
我们选择了 k 近邻分类算法根据新数据点在训练集中距离最近的邻居来进行预测。该算法在 KNeighborsClassifier 类中实现,里面既包含构建模型的算法,也包含利用模型进行预测的算法。我们将类实例化,并设定参数。然后调用 fit 方法来构建模型,传入训练数据( X_train )和训练输出( y_trian )作为参数。我们用 score 方法来评估模型,该方法计算的是模型精度。
我们将 score 方法用于测试集数据和测试集标签,得出模型的精度约为 97%,也就是说,该模型在测试集上 97% 的预测都是正确的。这让我们有信心将模型应用于新数据(在我们的例子中是新花的测量数据),并相信模型在约 97% 的情况下都是正确的。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子孤岛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值