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

📅  最后修改于: 2021-04-17 02:08:34             🧑  作者: Mango

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

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

load_breast_cancer([return_X_y])

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

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

pip install scikit-learn

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

pip install jupyter

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

步骤1:导入必要的模块和数据集。

我们将需要“ Scikit学习”模块和乳腺癌威斯康星州(诊断)数据集。

# importing the Python module
import sklearn
  
# importing the dataset
from sklearn.datasets import load_breast_cancer

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

# loading the dataset
data = load_breast_cancer()

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

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

# Organize our data
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 0 1 1 1 0 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 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 1 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 1 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 1 0
 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 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 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 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 1 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 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 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 0 1 0 0 1 0 1 1 1 1 1 0 1 1
 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 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 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()的内置函数,该函数会自动将数据划分为这些集合。我们将使用此函数对数据进行两次拆分。

# importing the function
from sklearn.model_selection import train_test_split
  
# splitting the data
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()方法将模型拟合到数据集中的数据来训练模型。

# importing the module of the machine learning model
from sklearn.naive_bayes import GaussianNB
  
# initializing the classifier
gnb = GaussianNB()
  
# training the classifier
model = gnb.fit(train, train_labels)

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

# making the predictions
predictions = gnb.predict(test)
  
# printing the predictions
print(predictions)

输出:

[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 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 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 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 ()函数。

# importing the accuracy measuring function
from sklearn.metrics import accuracy_score
  
# evaluating the accuracy
print(accuracy_score(test_labels, predictions))

输出:

0.9414893617021277

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