📜  使用Scikit-learn进行癌细胞分类

📅  最后修改于: 2020-04-26 10:15:31             🧑  作者: Mango

机器学习是人工智能的一个子领域,它使系统能够学习自身,而无需对其进行明确的编程。机器学习可用于解决许多现实问题。
让我们根据癌细胞的特征对其进行分类,并确定它们是“恶性”还是“良性”。我们将scikit-learn用于机器学习问题。Scikit-learn是针对Python编程语言的开源机器学习,数据挖掘和数据分析库。

数据集:
Scikit-learn附带了一些小的标准数据集,不需要从任何外部网站下载任何文件。我们将用于机器学习问题的数据集是乳腺癌威斯康星州(诊断)数据集。该数据集包括有关乳腺癌肿瘤的若干数据以及分类标签,即恶性或良性。可以使用以下功能加载它:

load_breast_cancer([return_X_y])

该数据集569个肿瘤的数据,并包含有关30种属性或特征的数据,例如肿瘤的半径,纹理,周长,面积等。我们将使用这些功能来训练我们的模型。

安装必要的模块:
对于此机器学习项目,我们将需要“ Scikit-learn” Python模块。如果您的计算机中没有安装它,请通过在命令提示符下运行以下命令来下载并安装它:

pip install scikit-learn

注意:您可以在该项目中使用任何IDE,因为我们强烈建议该项目使用Jupyter笔记本。这是因为,由于Python是一种解释性语言,因此,可以通过运行几行代码并逐步查看和了解正在发生的事情,而无需编写整个脚本一次然后运行它,从而充分利用其优势。
通过在命令提示符下运行以下命令来安装它:

pip install jupyter

使用Scikit-learn逐步实现分类:

步骤#1:导入必要的模块和数据集。
我们将需要“ Scikit”模块和乳腺癌威斯康星州(诊断)数据集。

# 导入Python模块
import sklearn
# 导入数据集
from sklearn.datasets import load_breast_cancer

步骤2:将数据集加载到变量。

# loading the dataset
data = load_breast_cancer()

我们必须从该数据集中考虑的重要属性是“目标名称”(标签的含义),“目标”(分类标签),“功能名称”(要素的含义)和“数据”(数据学习)。

步骤#3:整理数据并查看。
为了更好地了解数据集包含的内容以及如何使用数据来训练模型,让我们首先组织数据,然后使用print()函数查看数据包含的内容。

# 整理我们的数据
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']

然后,使用print()函数,让我们检查数据。

# looking at the data
print(label_names)

输出:

['malignant' 'benign']

因此,我们看到肿瘤的每个数据集都被标记为“恶性”或“良性”。

print(labels)

输出:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0
 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1
 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1
 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0
 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1
 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1
 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0
 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1
 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1
 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1
 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0
 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 0 0 0 0 0 0 1]

从这里我们看到,每个标记都链接到二进制值0和1,其中0代表恶性肿瘤,而1代表良性肿瘤。

print(feature_names)

输出:

['mean radius' 'mean texture' 'mean perimeter' 'mean area'
 'mean smoothness' 'mean compactness' 'mean concavity'
 'mean concave points' 'mean symmetry' 'mean fractal dimension'
 'radius error' 'texture error' 'perimeter error' 'area error'
 'smoothness error' 'compactness error' 'concavity error'
 'concave points error' 'symmetry error' 'fractal dimension error'
 'worst radius' 'worst texture' 'worst perimeter' 'worst area'
 'worst smoothness' 'worst compactness' 'worst concavity'
 'worst concave points' 'worst symmetry' 'worst fractal dimension']

在这里,我们看到了每个肿瘤数据集具有的所有30个特征或属性。我们将在训练模型时使用这些特征的数值,并基于此特征做出正确的预测,无论肿瘤是恶性还是良性。

print(features)

输出:

[[1.799e + 01 1.038e + 01 1.228e + 02 ... 2.654e-01 4.601e-01 1.189e-01]
 [2.057e + 01 1.777e + 01 1.329e + 02 ... 1.860e-01 2.750e-01 8.902e-02]
 [1.969e + 01 2.125e + 01 1.300e + 02 ... 2.430e-01 3.613e-01 8.758e-02]
 ...
 [1.660e + 01 2.808e + 01 1.083e + 02 ... 1.418e-01 2.218e-01 7.820e-02]
 [2.060e + 01 2.933e + 01 1.401e + 02 ... 2.650e-01 4.087e-01 1.240e-01]
 [7.760e + 00 2.454e + 01 4.792e + 01 ... 0.000e + 00 2.871e-01 7.039e-02]]

这是一个庞大的数据集,其中包含所有569个肿瘤数据实例的30个属性的数值。
因此,从以上数据可以得出结论,第一例肿瘤是恶性的,其平均半径为1.79900000e + 01。

步骤4:将数据整理到集合中。
为了测试分类器的准确性,我们必须在看不见的数据上测试模型。因此,在建立模型之前,我们将数据分为两组,即训练组和测试组。我们将使用训练集来训练和评估模型,然后使用训练后的模型对看不见的测试集进行预测。
sklearn模块具有一个称为train_test_split()的内置函数,该函数会自动将数据划分为这些集合。我们将使用此函数对数据进行两次拆分。

# 导入函数
from sklearn.model_selection import train_test_split
# 分割数据
train, test, train_labels, test_labels = train_test_split(features, labels,
                                       test_size = 0.33, random_state = 42)

train_test_split()函数使用参数test_size随机分割数据。我们在这里所做的是,我们已经将原始数据的33%拆分为测试数据。剩余数据是训练数据。同样,我们为训练变量和测试变量分别设置了标签,即train_labels和test_labels。
要了解有关如何使用该train_test_split()功能的更多信息,可以参考官方文档

步骤5:建立模型。
有许多机器学习模型可供选择。它们都有自己的优点和缺点。对于此模型,我们将使用朴素贝叶斯算法,该算法通常在二进制分类任务中表现良好。首先,导入GaussianNB模块并使用GaussianNB()函数对其进行初始化。然后使用该fit()方法通过将模型拟合到数据集中的数据来训练模型。

# 导入机器学习模型的模块
from sklearn.naive_bayes import GaussianNB
# 初始化分类器
gnb = GaussianNB()
# 训练分类器
model = gnb.fit(train, train_labels)

训练完成后,我们可以使用训练后的模型对我们之前准备的测试集进行预测。为此,我们将使用内置predict()函数,该函数返回测试集中数据实例的预测值数组。然后,我们将使用print()函数打印我们的预测。

# 做出预测
predictions = gnb.predict(test)
# 打印预测
print(predictions)

输出:

[1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0
 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0
 1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0
 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 1 0 0
 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0
 0 1 1]

从上面的输出中,我们看到该predict()函数返回了一个0和1的数组。这些值代表针对肿瘤类别(恶性或良性)的测试集的预测值。

步骤#6:评估训练模型的准确性。
由于现在已经有了预测值,因此可以通过将模型与测试集的实际标签进行比较(即,将预测与test_labels进行比较)来评估模型的准确性。为此,我们将在sklearn模块中使用内置的precision_score ()函数。

# 导入精度测量函数
from sklearn.metrics import accuracy_score
# 评估准确性
print(accuracy_score(test_labels, predictions))

输出:

0.9414893617021277

因此,我们发现,基于朴素贝叶斯算法的机器学习分类器在预测肿瘤是恶性还是良性方面的准确率为94.15%。