3.19 机器学习应用:鸢尾花分类Iris

一、数据描述、调用

测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米

类别:属于setosa、versicolor 或virginica 三个品种之一

机器学习中的个体叫作样本(sample),其属性叫作特征(feature)。data 数组的形状(shape)是样本数乘以特征数

#调用load_iris 函数来加载数据
from sklearn.datasets import load_iris
iris_dataset = load_iris()# load_iris 返回的iris 对象是一个Bunch 对象,与字典非常相似,里面包含键和值

#查看键值
print("Keys of iris_dataset:\n{}".format(iris_dataset.keys()))
#查看DESCR中数据集介绍
print(iris_dataset['DESCR'][:193] + "\n...")
#查看 'target_names'中花的品种
print("target names:{}".format(iris_dataset['target_names']))
#data类型
print("Type of data: {}".format(type(iris_dataset['data'])))
#data的容量
print("Shape of data: {}".format(iris_dataset['data'].shape))
#查看target
print("target:\n{}".format(iris_dataset['target']))

二、设定训练数据 测试数据

将收集好的带标签数据(此例中是150 朵花的测量数据)分成两部分。一部分数据用于构建机器学习模型,叫作训练数据(training data)或训练集(training set)。其余的数据用来评估模型性能,叫作测试数据(test data)、测试集(testset)或留出集(hold-out set)。

scikit-learn 中的train_test_split 函数:利用伪随机数生成器打乱数据集并进行拆分。75%训练集,25%测试集(经验比例)分配

标识:数据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) #data+target

为了确保多次运行同一函数能够得到相同的输出,我们利用random_state 参数指定了随机数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。

三、观察数据

检查数据的最佳方法之一就是将其可视化。如绘制散点图(scatter plot),但只能看两个特征。可以绘制散点图矩阵(pair plot),两两看所有特征。(散点图矩阵无法同时显示所有特征之间的关系,所以这种可视化方法可能无法展示数据的某些有趣内容。)

散点图矩阵:首先将NumPy 数组转换成pandas DataFrame。pandas 有一个绘制散点图矩阵的函数,叫作scatter_matrix。pd.plotting.scatter_matrix,其参数介绍https://blog.csdn.net/leilei9406/article/details/83538117?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

矩阵的对角线是每个特征的直方图

#散点图矩阵
# 利用X_train中的数据创建DataFrame
# 利用iris_dataset.feature_names中的字符串对数据列进行标记
import pandas as pd
import matplotlib.pyplot as plt
iris_dataframe = pd.DataFrame(X_train,columns=iris_dataset.feature_names)
#利用DataFrame创建散点图矩阵,按y_train着色
grr = pd.plotting.scatter_matrix(iris_dataframe, c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=.8)
plt.show()

四、构建模型:k近邻算法

scikit-learn 中所有的机器学习模型都在各自的类中实现,这些类被称为Estimator类。k 近邻分类算法是在neighbors 模块的KNeighborsClassifier 类中实现的。我们需要将这个类实例化为一个对象,然后才能使用这个模型。这时我们需要设置模型的参数。KNeighborsClassifier 最重要的参数就是邻居的数目

knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行预测的算法。它还包括算法从训练数据中提取的信息。对于KNeighborsClassifier 来说,里面只保存了训练集。
想要基于训练集来构建模型,需要调用knn 对象的fit 方法,输入参数为X_train 和y_train,二者都是NumPy 数组,前者包含训练数据,后者包含相应的训练标签:

#k neighbors
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train) #构建模型

fit 方法返回的是knn 对象本身并做原处修改,因此我们得到了分类器的字符串表示。从中可以看出构建模型时用到的参数

五、预测

想象一下,我们在野外发现了一朵鸢尾花,花萼长5cm 宽2.9cm,花瓣长1cm 宽0.2cm。这朵鸢尾花属于哪个品种?

我们将这朵花的测量数据转换为二维NumPy 数组的一行,这是因为scikit-learn的输入数据必须是二维数组

#预测
import numpy as np
X_new = np.array([[5,2.9,1,0.2]])
print("X_new.shape:{}".format(X_new.shape))

prediction = knn.predict(X_new)
print("prediction:{}".format(prediction))
print("Predicted target name:{}".format(iris_dataset['target_names'][prediction]))

Prediction: [0]
Predicted target name: ['setosa']

输出了类别和品种

六、评估模型

我们可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与标签(已知的品种)进行对比。我们可以通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预测正确的花所占的比例:

#评估模型

# 对测试数据进行预测
y_pred = knn.predict(X_test)
print("test set prediction:\n{}".format(y_pred))

# 两种方法 算预测准确度
print("test set score:\n{:.2f}".format(np.mean(y_pred == y_test)))
print("test set score:\n{:.2f}".format(knn.score(X_test, y_test)))

 

总结:

  1. k近邻算法的使用比较简单,先给定参数n_neighbors,建立模型knn.fit(X_train, y_train),预测用knn.predict(X_test),然后评估模型预测准确性np.mean(y_pred == y_test)或knn.score(X_test,y_test)
  2. 散点图矩阵的绘制:将NumPy 数组转换成pandas DataFrame,再用pd.plotting.scatter_matrix

参考《python机器学习基础教程》第一章

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值