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

2021年5月2日15:50:59 发表评论 867 次浏览

机器学习是人工智能的一个子领域, 它使系统能够学习自身, 而无需进行显式编程即可学习。机器学习可用于解决许多现实问题。

让我们根据癌细胞的特征对它们进行分类,识别它们是“恶性的”还是“良性的”。我们将使用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 )

函数使用参数test_size随机分割数据。我们在这里所做的是,我们将33%的原始数据分割为测试数据(test)。剩下的数据(train)就是训练数据。此外,我们为火车变量和测试变量分别设置了标签,即train_labels和test_labels。

要了解更多关于如何使用train_test_split()函数的信息,可以参考官方文档(https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)。

步骤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进行比较)来评估模型的准确性。为此, 我们将使用内置的precision_score()在sklearn模块中起作用。

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

输出如下:

0.9414893617021277

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

首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: