如何使用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])
如果运行代码,您将看到以下结果:
如图所示,我们的类名是 malignant 和 benign,然后将它们映射为 0
和 1
的二进制值,其中 [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_labels
和 test_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()
函数返回了一个由 0
s 和 1
s 组成的数组,它们代表了我们对肿瘤类别(恶性与肿瘤)的预测值。 良性)。
现在我们有了预测,让我们评估分类器的性能。
第 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 中处理自己的数据的过程。