数据准备
鸢尾花数据附带在Python scikit-learn 的 datasets 模块中,我们只需要调用这个数据即可,用于打开机器学习的大门。
load_iris 返回的 iris 对象是一个 Bunch 对象,与字典非常相似,里面包含键和值:
我们如何区分了,看看下面这个例子:
In [1]: from sklearn.datasets import base ...: buch = base.Bunch(A=1,B=2,c=3) In [2]: type(buch) Out[2]: sklearn.datasets.base.Bunch In [3]: buch Out[3]: {'A': 1, 'B': 2, 'c': 3} #类似于字典的格式 In [4]: buch['A'] #通过字典类似的方法也可以调用 Out[4]: 1 In [5]: buch.A #对象.属性,用该方法也可以调用 Out[5]: 1 In [6]: dt = {'A':1,'B':2,'C':3} In [7]: type(dt) Out[7]: dict In [8]: dt['A'] Out[8]: 1 In [9]: dt.A #但是字典就不可以了,这就是它们的最大区别 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-9-7b8328c57719> in <module>() ----> 1 dt.A
这个就是它们的区别,有些东西需要了解,不一定要精通
数据展示
print("前五行的数据展示:\n", iris_dataset['data'][:5])
print("Type of data:", type(iris_dataset['data']))
因为我们的数据类型类型现在已经变成了numpy的数组类型了,所以我们用的是索引切片,约束我们的数据。
模型搭建
在机器学习的过程中,模型的选择和搭建是非常的重要的,一个好的模型可以让我们的数据变得更有价值。
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)
scikit-learn 中的数据通常用大写的 X 表示,而标签用小写的 y 表示。这是受到了数学标准公式 f(x)=y 的启发,其中 x 是函数的输入, y 是输出。我们用大写的 X 是因为数据是一个二维数组(矩阵),用小写的 y 是因为目标是一个一维数组(向量),这也是数学中的约定。
scikit-learn 中的 train_test_split 函数可以打乱数据集并进行拆分。这个函数将 75% 的
行数据及对应标签作为训练集,剩下 25% 的数据及其标签作为测试集。训练集与测试集的
分配比例可以是随意的,但使用 25% 的数据作为测试集是很好的经验法则。这样的分配原则在模型的训练和测试是比较的智能科学的。
为了确保多次运行同一函数能够得到相同的输出,我们利用 random_state 参数指定了随机
数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。
我们可以看看我们的具体的数据类型,这样我们就可以明显的了解到为什么会有两个变量接收,在上面的参数解释,也说明了,因为是一个二维数组,对应的数据
观察数据和检查数据
在构建机器学习模型之前,通常最好检查一下数据,看看如果不用机器学习能不能轻松完成任务,或者需要的信息有没有包含在数据中。
检查数据的最佳方法之一就是将其可视化。一种可视化方法是绘制散点图(scatter plot)。数据散点图将一个特征作为 x 轴,另一个特征作为 y 轴,将每一个数据点绘制为图上的一个点。不幸的是,计算机屏幕只有两个维度,所以我们一次只能绘制两个特征(也可能是3 个)。用这种方法难以对多于 3 个特征的数据集作图。解决这个问题的一种方法是绘制散点图矩阵(pair plot),从而可以两两查看所有的特征。
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15),
marker='o', hist_kwds={'bins': 20}, s=60,
alpha=.8, cmap=mglearn.cm3)
通过观察我们,可以发现不同的标签,也呈现出“物以类聚”的特点,这就说明机器学习可以比较很好的区分出,也是比较的适合分类算法的
参数解释
dataframe:iris_dataframe 按行取数据
c=y_train 颜色,用不同着色度区分不同种类
figsize=(15,15) 图像区域大小,英寸为单位
marker=‘0’ 点的形状,0是圆,1是¥
hist_kwds={‘bins’:50} 对角线上直方图的参数元组
s=60 描出点的大小
alpha=.8 图像透明度,一般取(0,1]
cmap=mglearn.cm3 mylearn实用函数库,主要对图进行一些美化等私有功能
构建模型
K近邻算法
k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如
说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。然后,我们可以用这些
邻居中数量最多的类别做出预测。
模型参数比较重要
KNeighborsClassifier 最重要的参数就是邻居的数目,这里我们设为 1:
knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行
预测的算法。它还包括算法从训练数据中提取的信息。对于 KNeighborsClassifier 来说,
里面只保存了训练集。
根据我们模型的预测,这朵新的鸢尾花属于类别 0,也就是说它属于 setosa 品种,这里我们也可以自动的要求我们的用户输入,直接可以出结果。
模型评估
我们可以通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预测正确的花所占的比例:
可以使用 knn 对象的 score 方法来计算测试集的精度:
总结与归纳
我们构思了一项任务,要利用鸢尾花的物理测量数据来预测其品种。我们在构建模型时用到了由专家标注过的测量数据集,专家已经给出了花的正确品种,因此这是一个监督学习问题。一共有三个
品种: setosa、 versicolor 或 virginica,因此这是一个三分类问题。在分类问题中,可能的品种被称为类别(class),每朵花的品种被称为它的标签(label)。
鸢尾花(Iris)数据集包含两个 NumPy 数组:一个包含数据,在 scikit-learn 中被称为 X;一个包含正确的输出或预期输出,被称为 y。数组 X 是特征的二维数组,每个数据点对应一行,每个特征对应一列。数组 y 是一维数组,里面包含一个类别标签,对每个样本都是一个 0 到 2 之间的数。
K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。(这就类似于现实生活中少数服从多数的思想)
这里我们使用了,K近邻算法进行模型的搭建,当然也可以运用其他的算法模型进行预测,比如逻辑回归......
使用k近邻算法的条件:
1. 你需要一个训练的数据集,这个数据集包含各种特征值和对应的label值 ,在使用前需要将各种特征归一化处理。
2. 利用训练的数据集来对要分类的数据进行分类:
根据欧式距离计算出要预测的数据与训练数据集中距离最短的前k个值,然后根据前k个值对应的label
统计出 label值最最多的,如选择的前k个对应的label:['dog','dog','dog','fish'] ,那么这个结果是dog类。
k近邻算法特点:
优点: 计算精度高,不受异常值影响。
缺点: 计算复杂度高,空间复杂度高
适用于: 带lable的数值类
每文一语
有的人21岁毕业,到27岁才找到工作;有的人一毕业就拥有了一切;有的人没有上过大学,却在20出头的年纪里,干着自己热爱的事业;有的人明明彼此相爱却不能在一起,其实人生中的每一件事,都取决于我们的时间安排;有些人也许遥遥领先于我们,有些人也许落后与我们,但凡事都有它自己的节奏;30岁还没结婚,按但只要过得快乐也是一种幸福;耐心一点,踏实一点,;因为爱因斯坦说过:并不是每一件算得出来的事都有意义,也不是每一件有意义的事都能被算出来,真正重要的是:打破传统思维,获得精神上的自由,我们要创造一个属于自己充满意义的人生,不嫉妒、不羡慕、不被任何事影响!