当前位置:   article > 正文

鸢尾花分类_在这个数据集中,每朵花的数据构成了一个什么

在这个数据集中,每朵花的数据构成了一个什么

Python机器学习基础教程学习笔记

鸢尾花分类:

初识数据:

鸢尾花,测量数据:花瓣的长度和宽度,花萼的长度和宽度,所有测量结果都以厘米为单位。这一类花有三个品种:setosa,versicolor,virginnica。我们的目标是建立一个基础的机器学习的模型预测鸢尾花的品种。这是最基础的三分类问题,数据集中每朵鸢尾花叫做一个数据点,它的品种叫做它的标签。在这数据集里插入图片描述
scikit-learn的datasets模块中,可以调用一些基础的训练数据集,其中之一就是load_iris函数,载入iris数据集。

from sklearn.datasets import load_iris
iris_dataset=load_iris()
  • 1
  • 2

该函数返回一个Bunch对象,它直接继承自Dict类,与字典类似,由键值对组成。
同样可以使用bunch.keys(),bunch.values(),bunch.items()等方法。

print(iris_dataset.keys())
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
  • 1
  • 2

data属性:

print(type(iris_dataset['data']))
<class 'numpy.ndarray'>
print(iris_dataset['data'].shape)
(150, 4)
print(iris_dataset['target'].shape)
(150,)
print(iris_dataset['target_names'])
['setosa' 'versicolor' 'virginica']
print(iris_dataset['target'])
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

data数组的每一行对应一朵花的测量数据,列代表每朵花的四个测量数据。机器学习的个体叫做样本,其属性叫做特征,data数组的形状是样本数乘以特征数。你的数据形状应遵循这个特点。data中的每个数据点被转换成target的一个值:0,1,2。分别代表三个品种。

训练数据和测试数据:

一部分数据用于构建模型,叫做训练数据,另一部分用于评估模型性能,叫做测试数据。利用scikit-learn中的train_test_split函数可以实现这个功能。这个函数将%75的数据用作训练集,将25%用作测试集。
scikit-learn中的数据通常用大写的X表示,标签用小写的y表示,f(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)
print("X_train:{}".format(X_train[:10]))
print("y_train:{}".format(y_train[:10]))

X_train:[[5.9 3.  4.2 1.5]
 [5.8 2.6 4.  1.2]
 [6.8 3.  5.5 2.1]
 [4.7 3.2 1.3 0.2]
 [6.9 3.1 5.1 2.3]
 [5.  3.5 1.6 0.6]
 [5.4 3.7 1.5 0.2]
 [5.  2.  3.5 1. ]
 [6.5 3.  5.5 1.8]
 [6.7 3.3 5.7 2.5]]
y_train:[1 1 2 0 2 0 0 1 2 2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

以上是部分数据。这个函数需要设置random_state,给其赋一个值,当多次运行此段代码能够得到完全一样的结果,别人运行此代码也可以复现你的过程。若不设置此参数则会随机选择一个种子,执行结果也会因此而不同了。虽然可以对random_state进行调参,但是调参后在训练集上表现好的模型未必在陌生训练集上表现好,所以一般会随便选取一个random_state的值作为参数。

构建模型:

scikit-learn 中有许多可用的分类算法。这里用的是 k 近邻分类器,这是一个很容易理解的算法。构建此模型只需要保存训练 集即可。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近 的数据点,然后将找到的数据点的标签赋值给这个新数据点。 k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如 说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。
如下图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在, 我们不知道中间那个绿色的数据是从属于哪一类(蓝色小正方形or红色小三角形),下面,我们就要解决这个问题:给这个绿色的圆分类。
  我们常说,物以类聚,人以群分,判别一个人是一个什么样品质特征的人,常常可以从他/她身边的朋友入手,所谓观其友,而识其人。我们不是要判别上图中那个绿色的圆是属于哪一类数据么,好说,从它的邻居下手。但一次性看多少个邻居呢?从上图中,你还能看到:
  如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
  如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
   我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。
在这里插入图片描述
k 近邻分类算法是在neighbors 模块的KNeighborsClassifier 类中实现的。我们需 要将这个类实例化为一个对象,然后才能使用这个模型。这时我们需要设置模型的参数。

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

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=1, p=2,
           weights='uniform')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

实例化对象后,我们就已经建立一个训练模型了,接下来我们要进行测试。

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

Prediction: [0] 
Predicted target name: ['setosa']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

需要注意的是,我们在建立一个数组的时候要将他转换为二维数组的一行,因为该函数的输入数据必须满足之前提到的约定:二维数组。接下来只要调用predict方法进行预测。
我们进行了预测,但是如何知道预测的结果是否可信,这就取决于训练模型的精度了。

评估模型:

使用KNN的对象的score方法进行计算测试集的精度。

print("Test set score:{}".format(knn.score(X_test,y_test)))
Test set score: 0.97
  • 1
  • 2

如上,我们已经建立了一个基础的模型。并且该模型拥有较高的精度。我们还可以采用其他方法提高精度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/686439
推荐阅读
相关标签
  

闽ICP备14008679号