Machine Learning With Python 简明教程

Classification - Introduction

Introduction to Classification

分类可以定义为从观察到的值或给定的数据点中预测类或类别。分类后的输出形式可以是“黑”或“白”或“垃圾邮件”或“无垃圾邮件”。

从数学上讲,分类是从输入变量(X)到输出变量(Y)逼近映射函数(f)的任务。它基本上属于监督机器学习,其中目标也与输入数据集一起提供。

分类问题的示例可以是电子邮件中的垃圾邮件检测。输出只能有两类,“垃圾邮件”和“无垃圾邮件”;因此,这是一个二元类型分类。

为了实现此分类,我们首先需要训练分类器。对于此示例,“垃圾邮件”和“无垃圾邮件”电子邮件将用作训练数据。成功训练分类器后,可将其用于检测未知电子邮件。

Types of Learners in Classification

在分类问题中,我们有两种类型的学习器——

Lazy Learners

顾名思义,此类学习器会等待在存储训练数据后出现的测试数据。只有在获取测试数据后才会执行分类。它们花费在训练上的时间较少,而花费在预测上的时间较多。惰性学习器的示例包括 k 近邻和基于案例的推理。

Eager Learners

与惰性学习器相反,主动学习器会在存储训练数据后等待在测试数据出现后构建分类模型。它们花费在训练上的时间较多,而花费在预测上的时间较少。主动学习器的示例包括决策树、朴素贝叶斯和人工神经网络 (ANN)。

Building a Classifier in Python

Scikit-learn(一个用于机器学习的 Python 库)可用于在 Python 中构建分类器。在 Python 中构建分类器的步骤如下——

Step1: Importing necessary python package

要使用 scikit-learn 构建分类器,我们需要导入它。我们可以使用以下脚本导入它——

import sklearn

Step2: Importing dataset

导入必要的包后,我们需要一个数据集来构建分类预测模型。我们可以从 sklearn 数据集导入它,也可以根据我们的要求使用其他数据集。我们将使用 sklearn 的乳腺癌威斯康星州诊断数据库。我们可以借助以下脚本导入它——

from sklearn.datasets import load_breast_cancer

以下脚本将加载数据集;

data = load_breast_cancer()

我们还需要整理数据,可以使用以下脚本来完成此操作——

label_names = data['target_names']
   labels = data['target']
   feature_names = data['feature_names']
   features = data['data']

以下命令将打印标签的名称,在我们的数据库中为“ malignant ”和“ benign ”。

print(label_names)

以上命令的输出是标签名称——

['malignant' 'benign']

这些标签映射到二进制值 0 和 1。 Malignant 癌由 0 表示, Benign 癌由 1 表示。

这些标签的特征名称和特征值可以使用以下命令查看——

print(feature_names[0])

以上命令的输出是标签 0(即 Malignant 癌)的特征名称——

mean radius

类似地,可以按如下方式生成标签的特征名称:

print(feature_names[1])

上述命令的输出是标签 1 的特征名称,即 Benign 癌症 -

mean texture

我们可以使用以下命令打印这些标签的特征 −

print(features[0])

这将给出以下输出 −

[
   1.799e+01 1.038e+01 1.228e+02 1.001e+03 1.184e-01 2.776e-01 3.001e-01
   1.471e-01 2.419e-01 7.871e-02 1.095e+00 9.053e-01 8.589e+00 1.534e+02
   6.399e-03 4.904e-02 5.373e-02 1.587e-02 3.003e-02 6.193e-03 2.538e+01
   1.733e+01 1.846e+02 2.019e+03 1.622e-01 6.656e-01 7.119e-01 2.654e-01
   4.601e-01 1.189e-01
]

我们可以使用以下命令打印这些标签的特征 −

print(features[1])

这将给出以下输出 −

[
   2.057e+01 1.777e+01 1.329e+02 1.326e+03 8.474e-02 7.864e-02 8.690e-02
   7.017e-02 1.812e-01 5.667e-02 5.435e-01 7.339e-01 3.398e+00 7.408e+01
   5.225e-03 1.308e-02 1.860e-02 1.340e-02 1.389e-02 3.532e-03 2.499e+01
   2.341e+01 1.588e+02 1.956e+03 1.238e-01 1.866e-01 2.416e-01 1.860e-01
   2.750e-01 8.902e-02
]

Step3: Organizing data into training & testing sets

因为我们需要在不可见数据上测试我们的模型,我们会将我们的数据集分成两部分:一个训练集和一个测试集。我们可以使用 sklearn python 包的 train_test_split() 函数将数据分成数据集。以下命令将导入该函数 −

from sklearn.model_selection import train_test_split

现在,下一个命令会将数据分成训练和测试数据。在这个示例中,我们将 40% 的数据用于测试目的,60% 的数据用于训练目的 −

train, test, train_labels, test_labels = train_test_split(
   features,labels,test_size = 0.40, random_state = 42
)

Step4: Model evaluation

在将数据分成训练和测试后,我们需要构建模型。为此,我们将使用朴素贝叶斯算法。以下命令会导入 GaussianNB 模块 −

from sklearn.naive_bayes import GaussianNB

现在,初始化模型如下所示 −

gnb = GaussianNB()

接下来,在以下命令的帮助下,我们可以训练模型 −

model = gnb.fit(train, train_labels)

现在,为了评估的目的,我们需要进行预测。它可以通过使用 predict() 函数来完成,如下所示 −

preds = gnb.predict(test)
print(preds)

这将给出以下输出 −

[
   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 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 1 1 0
   1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0
   1

]

输出中上述一系列 0 和 1 是 MalignantBenign 肿瘤分类的预测值。

Step5: Finding accuracy

我们可以通过比较 test_labels 和 preds 这两个数组来找到上一步构建的模型的精确度。我们将使用 accuracy_score() 函数来确定精确度。

from sklearn.metrics import accuracy_score
   print(accuracy_score(test_labels,preds))
   0.951754385965

上述输出显示 NaiveBayes 分类器准确率为 95.17%。

Classification Evaluation Metrics

即使你已完成机器学习应用程序或模型的实现,工作还未完成。我们必须找出我们的模型有多有效?可能有不同的评估指标,但我们必须仔细选择,因为指标的选择会影响机器学习算法的性能的测量和比较方式。

以下是你可以根据你的数据集和问题类型从中进行选择的一些重要的分类评估指标 −

Confusion Matrix

这是衡量分类问题性能的最简单方法,其中输出可以是两种或更多种类的类。混淆矩阵只不过是一个有两维的表格,即“实际”和“预测”,此外,这两个维度都具有“真阳性(TP)”、“真阴性(TN)”、“假阳性(FP)”、“假阴性(FN) ”如下所示 -

actual

与混淆矩阵相关的术语的解释如下 -

  1. True Positives (TP) − 是数据点的实际类别和预测类别均为 1 的情况。

  2. True Negatives (TN) − 是数据点的实际类别和预测类别均为 0 的情况。

  3. False Positives (FP) − 是数据点的实际类别为 0 和数据点的预测类别为 1 的情况。

  4. False Negatives (FN) – 这是数据点的实际类别为 1,而数据点的预测类别为 0 的情况。

我们可以借助 sklearn 的 confusion_matrix() 函数找到混淆矩阵。借助以下脚本,我们可以找到上述构建的二元分类器的混淆矩阵 -

from sklearn.metrics import confusion_matrix

Output

[
   [ 73   7]
   [  4 144]
]

Accuracy

可以将其定义为由我们的机器学习模型做出的正确预测的数目。我们可以通过以下公式借助混淆矩阵轻松计算它 -

对于上述构建的二元分类器,TP + TN = 73 + 144 = 217 和 TP+FP+FN+TN = 73+7+4+144=228。

因此,准确性 = 217/228 = 0.951754385965,这与我们在创建二元分类器后计算得出的值相同。

Precision

精度,用于文档检索,可以定义为由我们的机器学习模型返回的正确文档数。我们可以通过以下公式借助混淆矩阵轻松计算它 -

对于上述构建的二元分类器,TP = 73 和 TP+FP = 73+7 = 80。

因此,精度 = 73/80 = 0.915

Recall or Sensitivity

召回率可以定义为由我们的机器学习模型返回的正例数。我们可以通过以下公式借助混淆矩阵轻松计算它 -

对于上述构建的二元分类器,TP = 73 和 TP+FN = 73+4 = 77。

因此,精度 = 73/77 = 0.94805

Specificity

特异性与召回率相反,可以定义为我们的 ML 模型返回的负样本数量。我们可以通过使用以下公式轻松地通过混淆矩阵计算它−

对于上述构建的二元分类器,TN = 144,TN+FP = 144+7 = 151。

因此,精度 = 144/151 = 0.95364

Various ML Classification Algorithms

以下是某些重要的 ML 分类算法 −

  1. Logistic Regression

  2. Support Vector Machine (SVM)

  3. Decision Tree

  4. Naïve Bayes

  5. Random Forest

我们将在后面的章节中详细讨论所有这些分类算法。

Applications

分类算法的一些最重要的应用程序如下 −

  1. Speech Recognition

  2. Handwriting Recognition

  3. Biometric Identification

  4. Document Classification