第一个应用:鸢尾花分类

鸢尾花分类

一、应用描述
假设一个人对鸢尾花的品种很感兴趣。他收集了每朵鸢尾花的测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有的测量数据都是厘米。
在这里插入图片描述
但是已经有科研人员对大量的鸢尾花进行过测量。把鸢尾花分为了三类。
但我们的目标是构建一个机器学习的模型,可以从已知的品种中预测出新的鸢尾花品种。从已知到未知,所以这是一个监督学习问题。在这个问题中,我们要在多个选项中预测其中一个鸢尾花的种类。所以这是分类问题的示例。可能的输出(鸢尾花的不同品种)叫做类别。前面的数据集中有三个分类,所以这是一个三分类问题。

初识数据

应为鸢尾花数据集是机器学习和统计学的经典案例。它包含在scikit-learn的datasets模块中。可以调用load_iris函数来加载数据。
可以自己敲一下看一下打印出来的结果

from sklearn.datasets import load_iris
#load_iris返回的iris对象是一个Bunch对象,有点像字典,有键值对
iris_datasets=load_iris()
print("Key of iris_datasets:\n{}".format(iris_datasets.keys()))
#Key of iris_datasets:
#dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

#DESCR键对应的值是数据的简要说明,可以自己去查看。
print(iris_datasets['DESCR'])

#target_names对应的是一个字符串数组,里面包含了我们要预测的花的品种
print(iris_datasets['target_names'])

#feature_names对应的是一个字符串列表,对每一个特征进行说明
print(iris_datasets["feature_names"])

#相对应的数据都包含data和target中。data里面是花萼的长度宽度和花瓣的长度宽度的测量数据,数据格式全部为Numpy数组。
print(type(iris_datasets['data']))
print(type(iris_datasets['target']))
#在data中每一行对应一朵花,每一列代表的是每一朵花的四个测量数据
print(iris_datasets['data'].shape)#(150,4)
#可以看出,数组中包含了150朵花的测量数据。在机器学习中的个体叫做样本(sample),其属性叫做特征(feature)。data数组的形状(shape)
#是样本乘以特征数。这是scikit-learn中的约定,你的数据形状始终遵循这个约定。

#下面我们看看前五个样本的特征值:
print("前五个样本特征值:\n{}".format(iris_datasets['data'][:5]))
#从数据中我们发现花瓣的宽度全部都是0.2cm,第一朵花的花萼最长5.1cm。


# target数组包含的是每朵花测量过后的品种,也是一个numpy数组。
print("Type of target \n{}".format(type(iris_datasets['target'])))

#target是数组每朵花对应其中一个数据
print("Shape of target :\n{}".format(iris_datasets['target'].shape))

#但是品种被转化为0,1,2 三个数字对用的品种。0代表setosa,1代表 versicolor ,2代表virginica  三个前面说道的鸢尾花分为的三个类别
print("Target: \n{}".format(iris_datasets['target']))

衡量模型:训练数据和测试数据

利用数据我们构建了一个机器学习的模型,但是我们没有进行过测试,我们也不知道这个模型的可信度怎么样。
我们不能将我们训练模型的数据放到模型中,应为模型会记住整个训练集。所以这样我们不能知道我们模型“泛化”的能力,不知道在新数据的测试上的预测结果是否准确。
我们的用新的数据对模型进行测试。所有我们将之前的150朵鸢尾花进行分类。构建模型的数据我们叫做训练数据。剩下的我们可以叫做测试数据
所以我们将scikit-learn中train_test_split函打乱然后进行拆分。75%作为训练数据,25%作为测试数据。训练数据和测试数据可以自己调配比例。

'X为训练的数据,y表示标签进行数据拆分之前,train_test_split 利用伪随机函数将数据集进行打乱,不然的话后25%作为测试数据可能导致
全部为2号种类。如果测试集中只有单个种类那么我们将不会知道我们训练的模型的泛华能力如何,多以我们将数据进行打乱
为了确保运行同一函数能够得到相同的输出,所以用random_state参数指定随机数生成器的种子。

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
iris_datasets=load_iris()

X_train,X_test,y_train,y_test=train_test_split(iris_datasets['data'],iris_datasets['target'],random_state=0)
#train_test_split函数的输出X_train,X_test,y_train,y_test,都是numpy数组。X_train包含75%行数据,X_test剩下的25%
print('X_tarin shape: {}'.format(X_train.shape))
print('y_tarin shape: {}'.format(y_train.shape))

print('X_test shape: {}'.format(X_test.shape))
print('y_test shape: {}'.format(y_test.shape))

![在这里插入图片描述](https://img-blog.csdnimg.cn/20191122111926190.png

观察数据

前面我们对数据进行了划分,但是在构建机器学习模型中我们得先检查数据,看看需要的数据有没有包含在数据中。
检查数据也是发现异常的一种方法,比如说数据的单位不统一可能造成的误差等等。
但是观察数据我们不能通过肉眼每一个每一个去检查,所以检查数据最好的方法就是将数据进行可视化。这里我们利用散点矩阵图(pair plot),可以两两查看所有特征。
绘制相关散点矩阵图

"""绘制相关的散点矩阵图"""

from sklearn.datasets import load_iris

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


#利用X_train中的数据创建DataFrame
#利用iris_datasets.feature_names中的字符串对数据进行标记
iris=load_iris()



iris_dataframe=pd.DataFrame(iris.data,columns=iris.feature_names)
iris_dataframe['target']=iris.target

grr=sns.pairplot(iris_dataframe,size=2.5,hue='target')
plt.show()

在这里插入图片描述
从图中可以看出鸢尾花分为3类。

构建第一个模型:K临近算法

接下来我们需要构建相应的机器学习的模型。在scikit-learn中有许多分类的算法,这里我们选择k近邻分类器。构建这个模型只需要保存训练集。当对一个新的数据做出预测的时候,会找出距离训练集最近的相似的点,然后将找到的数据点的标签赋值给这个新的数据点。
scikit-learn中所有的机器学习都在各自的类中实现,这些类被称为Estimator类。k邻近分类算法是在neighbors模块中的KNeighborsClassifier类中实现。我们需要将这个类实例化成一个对象,然后才能使用模型。 KNeighborsClassifier最重要的参数就是邻居的数目,这里我们设为:
#knn对象对算法进行了封装,包括了训练数据构建模型的算法,也包括了对新数据点预测的算法。它还包括了算法从训练数据中提取的信息。
#对于KNeighborsClassifier来说里面只有训练集

from sklearn.neighbors import KNeighborsClassifier
#knn对象对算法进行了封装,包括了训练数据构建模型的算法,也包括了对新数据点预测的算法。它还包括了算法从训练数据中提取的信息。
#对于KNeighborsClassifier来说里面只有训练集

knn=KNeighborsClassifier(n_neighbors=1)

想要基于训练集来构建模型,需要调用knn对象的fit方法,输入参数X_train和y_train,都是numpy数组,前面的是训练数据后面的是训练标签:

knn.fit(X_train,y_train)
print(knn)
#KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
                     #metric_params=None, n_jobs=None, n_neighbors=1, p=2,
                     #weights='uniform')

fit方法返回的是knn对象本身并做原处修改,所以我们得到的分类器的字符串的表示。我们看到了构建模型是需要的参数。

做出预测

前面模型我们已经构建完成,现在如果我们有一组新的数据。花萼5长宽为4cm,2.9cm,花瓣长宽为1cm,0.2cm。那么我们怎么进行判断呢?我们将这些数据放在Numpy数组中,再次计算形状,数组形状为样本数1,特征值是4:

X_new=np.arry([[5,2.9,1,0.2]])
print(X_new.shape)

注意我们将未知数据转换为二维Numpy数组中的一行,这是应为scikit-learn的输入数据必须是二维数组
我们调用knn对象的predict方法进行预测:

import numpy as np
#所以我们预测的这朵新花属于类别0,也就是属于setosa品种
X_new=np.array([[5,2.9,1,0.2]])
prediction=knn.predict(X_new)
print(prediction)
print('prediction target name:{}'.format(iris_datasets['target_names'][prediction]))

如果用不同数据会是不同种类

评估模型

前面我们有分训练集和测试集,这里我们就需要把测试集拿来进行评估。来衡量这个模型的优劣,精度就是品种正确的花所占的比例。

y_pred=knn.predict(X_test)
print("测试集的预测:\n{}".format(y_pred))
#测试集的精确
print("测试集的精度:\n{}".format(np.mean(y_pred==y_test)))
#还可以使用knn的score方法进行精度的预测
print("测试集精度:\n{}".format(knn.score(X_test,y_test)))

在这里插入图片描述对于这个模型来说测试集的精度达到97%,这时候可以预测出大部分的鸢尾花类型了。

总结

我们利用一直的数据集进行机器学习然后来预测未知的品种,所以这是一个监督学习的问题。
应为鸢尾花有三种分类,所有这个一个三分类问题。那么在分类问题中,可能的品种被称为类别,每朵花的品种被称为他的标签。
我们将数据分为训练集和测试集,前者构建模型,后者看模型的泛华能力怎么样。
我们选用k邻近分类算法,根据新数据点在训练集中数据的距离进行预测种类。
上面代码包含了应用scikit-learn中任何机器学习的核心代码。fit,prediction和score都是常用的接口

create by 0125c

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值