如何使用Scikit-learn在Python中构建机器学习分类器

来自菜鸟教程
跳转至:导航、​搜索

介绍

机器学习是计算机科学、人工智能、统计学的一个研究领域。 机器学习的重点是训练算法学习模式并从数据中做出预测。 机器学习特别有价值,因为它让我们可以使用计算机来自动化决策过程。

你会发现到处都是机器学习应用程序。 Netflix 和亚马逊使用机器学习来推荐新产品。 银行使用机器学习来检测信用卡交易中的欺诈活动,医疗保健公司开始使用机器学习来监控、评估和诊断患者。

在本教程中,您将使用 Python 的机器学习工具 Scikit-learn 在 Python 中实现一个简单的机器学习算法。 使用乳腺癌肿瘤信息数据库,您将使用 朴素贝叶斯 (NB) 分类器来预测肿瘤是恶性还是良性。

在本教程结束时,您将了解如何在 Python 中构建您自己的机器学习模型。

先决条件

要完成本教程,您需要:

  • Python 3 和在您的计算机上设置的本地编程环境。 您可以按照适当的安装和设置指南为您的操作系统进行配置。 如果您是 Python 新手,您可以探索如何在 Python 3 中编码以熟悉该语言。
  • Jupyter Notebook 安装在本教程的 virtualenv 中。 Jupyter Notebooks 在运行机器学习实验时非常有用。 您可以运行短代码块并快速查看结果,从而轻松测试和调试代码。

第 1 步 — 导入 Scikit-learn

让我们从安装 Python 模块 Scikit-learn 开始,它是 Python 中最好的和记录最多的机器学习库之一。

要开始我们的编码项目,让我们激活 Python 3 编程环境。 确保您位于环境所在的目录中,然后运行以下命令:

. my_env/bin/activate

激活我们的编程环境后,检查是否已经安装了 Sckikit-learn 模块:

python -c "import sklearn"

如果安装了 sklearn,此命令将完成且没有错误。 如果未安装,您将看到以下错误消息:

OutputTraceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'sklearn'

错误信息表明sklearn没有安装,所以使用pip下载库:

pip install scikit-learn[alldeps]

安装完成后,启动 Jupyter Notebook:

jupyter notebook

在 Jupyter 中,创建一个名为 ML Tutorial 的新 Python Notebook。 在 Notebook 的第一个单元格中,import sklearn 模块:

机器学习教程

import sklearn

您的笔记本应如下图所示:

现在我们已经在笔记本中导入了 sklearn,我们可以开始使用机器学习模型的数据集了。

第 2 步——导入 Scikit-learn 的数据集

我们将在本教程中使用的数据集是 Breast Cancer Wisconsin Diagnostic Database。 该数据集包括有关乳腺癌肿瘤的各种信息,以及恶性良性的分类标签。 该数据集包含 569 个 实例 或 569 个肿瘤的数据,并包含有关 30 个 属性 或特征的信息,例如肿瘤的半径、纹理、平滑度和面积。

使用这个数据集,我们将建立一个机器学习模型,使用肿瘤信息来预测肿瘤是恶性还是良性。

Scikit-learn 安装了各种数据集,我们可以将其加载到 Python 中,并包含我们想要的数据集。 导入并加载数据集:

机器学习教程

...
from sklearn.datasets import load_breast_cancer


# Load dataset
data = load_breast_cancer()

data 变量 表示一个 Python 对象,其工作方式类似于 字典 。 要考虑的重要字典键是分类标签名称(target_names)、实际标签(target)、属性/特征名称(feature_names)和属性( data)。

属性是任何分类器的关键部分。 属性捕获有关数据性质的重要特征。 鉴于我们试图预测的标签(恶性与良性肿瘤),可能有用的属性包括肿瘤的大小、半径和纹理。

为每组重要信息创建新变量并分配数据:

机器学习教程

...
# Organize our data
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']

对于每组信息,我们现在都有 lists。 为了更好地理解我们的数据集,让我们通过打印我们的类标签、第一个数据实例的标签、我们的特征名称和第一个数据实例的特征值来查看我们的数据:

机器学习教程

...
# Look at our data
print(label_names)
print(labels[0])
print(feature_names[0])
print(features[0])

如果运行代码,您将看到以下结果:

如图所示,我们的类名是 malignantbenign,然后将它们映射为 01 的二进制值,其中 [X153X ] 代表恶性肿瘤,1 代表良性肿瘤。 因此,我们的第一个数据实例是平均半径1.79900000e+01的恶性肿瘤。

现在我们已经加载了数据,我们可以使用我们的数据来构建我们的机器学习分类器。

第 3 步——将数据组织成集合

要评估分类器的执行情况,您应该始终在看不见的数据上测试模型。 因此,在构建模型之前,将数据分成两部分: 训练集测试集

您在开发阶段使用训练集来训练和评估模型。 然后,您使用经过训练的模型对看不见的测试集进行预测。 这种方法让您了解模型的性能和稳健性。

幸运的是,sklearn 有一个名为 train_test_split() 的函数,它将您的数据分成这些集合。 导入该函数,然后使用它来拆分数据:

机器学习教程

...
from sklearn.model_selection import train_test_split


# Split our data
train, test, train_labels, test_labels = train_test_split(features,
                                                          labels,
                                                          test_size=0.33,
                                                          random_state=42)

该函数使用 test_size 参数随机拆分数据。 在这个例子中,我们现在有一个测试集 (test),它代表原始数据集的 33% of。 剩余的数据(train)然后组成训练数据。 我们也有训练/测试变量各自的标签,即 train_labelstest_labels

我们现在可以继续训练我们的第一个模型。

第 4 步——构建和评估模型

机器学习有很多模型,每个模型都有自己的长处和短处。 在本教程中,我们将重点介绍一种通常在二进制分类任务中表现良好的简单算法,即 Naive Bayes (NB)

首先,导入GaussianNB模块。 然后使用 GaussianNB() 函数初始化模型,然后通过使用 gnb.fit() 拟合数据来训练模型:

机器学习教程

...
from sklearn.naive_bayes import GaussianNB


# Initialize our classifier
gnb = GaussianNB()

# Train our classifier
model = gnb.fit(train, train_labels)

在我们训练模型之后,我们可以使用训练后的模型对我们的测试集进行预测,我们使用 predict() 函数进行预测。 predict() 函数返回测试集中每个数据实例的预测数组。 然后,我们可以打印我们的预测,以了解模型确定的内容。

使用带有 test 集的 predict() 函数并打印结果:

机器学习教程

...
# Make predictions
preds = gnb.predict(test)
print(preds)

运行代码,您将看到以下结果:

正如您在 Jupyter Notebook 输出中看到的那样,predict() 函数返回了一个由 0s 和 1s 组成的数组,它们代表了我们对肿瘤类别(恶性与肿瘤)的预测值。 良性)。

现在我们有了预测,让我们评估分类器的性能。

第 5 步——评估模型的准确性

使用真实类标签数组,我们可以通过比较两个数组(test_labels vs. preds)。 我们将使用 sklearn 函数 accuracy_score() 来确定我们机器学习分类器的准确性。

机器学习教程

...
from sklearn.metrics import accuracy_score


# Evaluate accuracy
print(accuracy_score(test_labels, preds))

您将看到以下结果:

正如您在输出中看到的,NB 分类器的准确率为 94.15%。 这意味着分类器有 94.15% 的时间能够正确预测肿瘤是恶性还是良性。 这些结果表明我们的 30 个属性的特征集是肿瘤类别的良好指标。

您已经成功构建了您的第一个机器学习分类器。 让我们通过将所有 import 语句放在 Notebook 或脚本的顶部来重新组织代码。 代码的最终版本应如下所示:

机器学习教程

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score


# Load dataset
data = load_breast_cancer()

# Organize our data
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']

# Look at our data
print(label_names)
print('Class label = ', labels[0])
print(feature_names)
print(features[0])

# Split our data
train, test, train_labels, test_labels = train_test_split(features,
                                                          labels,
                                                          test_size=0.33,
                                                          random_state=42)

# Initialize our classifier
gnb = GaussianNB()

# Train our classifier
model = gnb.fit(train, train_labels)

# Make predictions
preds = gnb.predict(test)
print(preds)

# Evaluate accuracy
print(accuracy_score(test_labels, preds))

现在您可以继续使用您的代码,看看您是否可以让您的分类器表现得更好。 您可以尝试不同的功能子集,甚至尝试完全不同的算法。 查看 Scikit-learn 的网站 了解更多机器学习想法。

结论

在本教程中,您学习了如何在 Python 中构建机器学习分类器。 现在,您可以使用 Scikit-learn 在 Python 中加载数据、组织数据、训练、预测和评估机器学习分类器。 本教程中的步骤应该可以帮助您简化在 Python 中处理自己的数据的过程。