《Python机器学习基础教程》学习记录(三)

第一章

1.7.4 构建第一个模型:k近邻算法

步骤

  1. 构建模型
  2. 做出预测
  3. 评估模型

  k 近邻分类器,这是一个很容易理解的算法。构建此模型只需要保存训练 集即可。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近的数据点,然后将找到的数据点的标签赋值给这个新数据点。
  k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如 说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。然后,我们可以用这些 邻居中数量最多的类别做出预测。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import mglearn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# k 近邻分类算法是在 neighbors 模块的 KNeighborsClassifier 类中实现的
from sklearn.neighbors import KNeighborsClassifier

# TODO 构建第一个模型:k 近邻算法

iris_dataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris_dataset['data'], iris_dataset['target'], random_state=0
)

"""
    knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行 预测的算法。它还包括算法从训练数据中提取的信息。
    对于 KNeighborsClassifier 来说,里面只保存了训练集。
"""
# TODO ----------------------------------------构建模型----------------------------------------↓
knn = KNeighborsClassifier(n_neighbors=1)  # KNeighborsClassifier 最重要的参数就是邻居的数目,这里我们设为 1
# 想要基于训练集来构建模型,需要调用 knn 对象的 fit 方法,输入参数为 X_train 和 y_train,二者都是 NumPy 数组,前者包含训练数据,后者包含相应的训练标签:
knn.fit(X_train, y_train)
print(knn.fit(X_train, y_train))
"""
    打印信息
    KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
                     metric_params=None, n_jobs=None, n_neighbors=1, p=2,
                     weights='uniform')
"""

# TODO ----------------------------------------做出预测----------------------------------------↓
X_new = np.array([[5, 2.9, 1, 0.2]])  # 假设在野外发现了一朵鸢尾花
prediction = knn.predict(X_new)  # 调用 knn 对象的 predict 方法来进行预测
print("X_new.shape: {}".format(X_new.shape))
print("Prediction: {}".format(prediction))
print("Predicted target name: {}".format(iris_dataset['target_names'][prediction]))

"""
    打印信息
    X_new.shape: (1, 4)
    Prediction: [0]
    Predicted target name: ['setosa']
"""


# TODO ----------------------------------------评估模型----------------------------------------↓
"""
    先前创建的测试集,没有用来构建模型,但是知道测试集中每朵鸢尾花的实际品种。
    因此,我们可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与标签(已知的品种)进行对比。我们可以通过计算精度(accuracy)
    来衡量模型的优劣,精度就是品种预测正确的花所占的比例:
"""
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)))  # 预测结果与测试集对比,计算精确度
print("Test set score: {:.2f}".format(knn.score(X_test, y_test)))  # 使用 knn 对象的 score 方法来计算测试集的精度:
"""
    打印信息
    Test set predictions:
    [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 2]
    Test set score: 0.97
    Test set score: 0.97
"""

  对于这个模型来说,测试集的精度约为 0.97,也就是说,对于测试集中的鸢尾花,我们的 预测有 97% 是正确的。根据一些数学假设,对于新的鸢尾花,可以认为我们的模型预测 结果有 97% 都是正确的。对于我们的植物学爱好者应用程序来说,高精度意味着模型足 够可信,可以使用。

1.8 小结与展望

  总结一下本章所学的内容。我们首先简要介绍了机器学习及其应用,然后讨论了监督学习 和无监督学习之间的区别,并简要介绍了本书将会用到的工具。随后,我们构思了一项任 务,要利用鸢尾花的物理测量数据来预测其品种。我们在构建模型时用到了由专家标注过 的测量数据集,专家已经给出了花的正确品种,因此这是一个监督学习问题。一共有三个 品种:setosa、versicolor 或 virginica,因此这是一个三分类问题。在分类问题中,可能的 品种被称为类别(class),每朵花的品种被称为它的标签(label)。
  鸢尾花(Iris)数据集包含两个 NumPy 数组:一个包含数据,在 scikit-learn 中被称为 X;一个包含正确的输出或预期输出,被称为== y==。数组 X 是特征的二维数组,每个数据点 对应一行,每个特征对应一列。数组 y 是一维数组,里面包含一个类别标签,对每个样 本都是一个 0 到 2 之间的整数。
  我们将数据集分成训练集(training set)和测试集(test set),前者用于构建模型,后者 用于评估模型对前所未见的新数据的泛化能力。
  我们选择了 k 近邻分类算法,根据新数据点在训练集中距离最近的邻居来进行预测。该算 法在 KNeighborsClassifier 类中实现,里面既包含构建模型的算法,也包含利用模型 进行预测的算法。我们将类实例化,并设定参数。然后调用 fit 方法来构建模型,传入 训练数据(X_train)和训练输出(y_trian)作为参数。我们用 score 方法来评估模 型,该方法计算的是模型精度。我们将 score 方法用于测试集数据和测试集标签,得出 模型的精度约为 97%,也就是说,该模型在测试集上 97% 的预测都是正确的。 这让我们有信心将模型应用于新数据(在我们的例子中是新花的测量数据),并相信模型 在约 97% 的情况下都是正确的。 下面汇总了整个训练和评估过程所必需的代码:

In[32]:

X_train, X_test, y_train, y_test = train_test_split( 
    iris_dataset['data'], iris_dataset['target'], random_state=0)
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
print("Test set score: {:.2f}".format(knn.score(X_test, y_test)))

Out[32]:

Test set score: 0.97

  这个代码片段包含了应用 scikit-learn 中任何机器学习算法的核心代码fit、predict 和 score 方法是 scikit-learn 监督学习模型中最常用的接口。学完本章介绍的概念,你可以将这些模型应用到许多机器学习任务上。下一章,我们会更深 入地介绍 scikit-learn 中各种类型的监督学习模型,以及这些模型的正确使用方法。

传送门

《Python机器学习基础教程》学习记录(四)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值