机器学习:鸢尾花(Iris)分类

机器学习:鸢尾花(Iris)分类

背景

她还有一些鸢尾花的测量数据,这些花之前已经被植物学专家鉴定为属于 setosa、versicolor 或virginica 三个品种之一。对于这些测量数据,她可以确定每朵鸢尾花所属的品种。我们假设这位植物学爱好者在野外只会遇到这三种鸢尾花。我们的目标是构建一个机器学习模型,可以从这些已知品种的鸢尾花测量数据中进行学习,从而能够预测新鸢尾花的品种。因为我们有已知品种的鸢尾花的测量数据,所以这是一个监督学习问题。在这个问题中,我们要在多个选项中预测其中一个(鸢尾花的品种)。这是一个分类(classification)问题的示例。可能的输出(鸢尾花的不同品种)叫作类别(class)。数据集中的每朵鸢尾花都属于三个类别之一,所以这是一个三分类问题。

了解Iris数据集

准备工作

import sklearn
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris

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

#了解数据
print("keys of iris_dataset: \n{}".format(iris_dataset.keys()))
print(iris_dataset)
print(iris_dataset['DESCR']+"\n..")

print("target names: \n{}".format(iris_dataset['data']))

print("target names: \n{}".format(iris_dataset['target_names']))

print("Feature names: \n{}".format(iris_dataset['feature_names']))
#'sepal length':花萼长度 'sepal width':花萼宽度 'petal length':花瓣长度 'petal width':花瓣宽度

衡量模型是否成功:训练数据与测试数据

我们想要利用这些数据构建一个机器学习模型,用于预测新测量的鸢尾花的品种。但在将模型应用于新的测量数据之前,我们需要知道模型是否有效,也就是说,我们是否应该相信它的预测结果。

但是,我们不能将用于构建模型的数据用于评估模型。因为这样的话模型会一直记住整个训练集,所以对于训练集中的任何数据点总会预测正确的标签。这种“记忆”无法告诉我们模型的泛化(generalize)能力如何(换句话说,在新数据上能否正确预测)。

我们要用新数据来评估模型的性能。新数据是指模型之前没有见过的数据,而我们有这些新数据的标签。通常的做法是将收集好的带标签数据(此例中是 150 朵花的测量数据)分成两部分。一部分数据用于构建机器学习模型,叫作训练数据(training data)或训练集(raining set)。其余的数据用来评估模型性能,叫作测试数据(test data)、测试集(test set)或留出集(hold-out set)。

观察数据

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)
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
'''scikit-learn 中的 train_test_split 函数可以打乱数据集并进行拆分。这个函数将 75% 的
行数据及对应标签作为训练集,剩下 25% 的数据及其标签作为测试集。训练集与测试集的分配比例
可以是随意的,但使用 25% 的数据作为测试集是很好的经验法则。利用 random_state 参数指定了
随机数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同'''

grr = pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o',
  hist_kwds={
     'bins': 20}, s=60, alpha=.8)  #画出散点图

机器学习:鸢尾花(Iris)分类_第1张图片

构建模型

k近邻算法

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1) #k近邻分类器
knn.fit(X_train, y_train) 
'''想要基于训练集来构建模型,需要调用 knn 对象的 fit 方法,输入参数为 X_train 和 y_
train,二者都是 NumPy 数组,前者包含训练数据,后者包含相应的训练标签'''

'''
#prediction 测试1
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]))
'''

y_pred = knn.predict(X_test)
print("Test set predictions:\n {}".format(y_pred))

print("Test set score: {:.2f}".format(np.mean(y_pred == y_test)))

通过调整参数的值将获得不同的测试集精度
test1

knn = KNeighborsClassifier(n_neighbors=25)

在这里插入图片描述

knn = KNeighborsClassifier(n_neighbors=50)

在这里插入图片描述

你可能感兴趣的:(机器学习,深度学习,python,iris)