分类-简介


分类简介

分类可以定义为根据观察值或给定数据点预测类别或类别的过程。分类输出可以具有诸如“黑色”或“白色”或“垃圾邮件”或“无垃圾邮件”等形式。

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

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

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

分类中的学习者类型

对于分类问题,我们有两种类型的学习者 -

懒惰的学习者

顾名思义,这种学习器在存储训练数据后等待测试数据出现。获得测试数据后才进行分类。他们花在训练上的时间更少,但花在预测上的时间更多。惰性学习器的例子有 K 最近邻和基于案例的推理。

渴望学习的人

与惰性学习器相反,急切学习器在存储训练数据后无需等待测试数据出现即可构建分类模型。他们花更多的时间在训练上,但花在预测上的时间更少。渴望学习的例子有决策树、朴素贝叶斯和人工神经网络 (ANN)。

用 Python 构建分类器

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

Step1:导入必要的python包

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

import sklearn

Step2:导入数据集

导入必要的包后,我们需要一个数据集来构建分类预测模型。我们可以从 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']

以下命令将打印标签的名称,如果是我们的数据库,则为“恶性”和“良性”。

print(label_names)

上述命令的输出是标签的名称 -

['malignant' 'benign']

这些标签映射到二进制值 0 和 1。恶性肿瘤用 0 表示,良性癌症用 1 表示。

可以借助以下命令查看这些标签的特征名称和特征值 -

print(feature_names[0])

上述命令的输出是标签 0 的特征名称,即恶性肿瘤-

mean radius

同样,标签特征的名称可以生成如下 -

print(feature_names[1])

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

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:将数据组织成训练和测试集

由于我们需要在未见过的数据上测试我们的模型,因此我们将数据集分为两部分:训练集和测试集。我们可以使用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:模型评估

将数据划分为训练和测试后,我们需要构建模型。为此,我们将使用朴素贝叶斯算法。以下命令将导入 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 系列是恶性肿瘤良性肿瘤类别的预测值。

第五步:寻找准确性

我们可以通过比较两个数组 test_labels 和 preds 来发现上一步中模型构建的准确性。我们将使用 precision_score() 函数来确定准确性。

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

上面的输出表明 NaïveBayes 分类器的准确率为 95.17%。

分类评价指标

即使您已经完成了机器学习应用程序或模型的实施,这项工作也还没有完成。我们必须要找出我们的模型有多有效?评估指标可以有不同,但我们必须谨慎选择,因为指标的选择会影响机器学习算法性能的衡量和比较方式。

以下是一些重要的分类评估指标,您可以根据您的数据集和问题类型进行选择 -

混淆矩阵

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

实际的

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

  • 真阳性 (TP) - 数据点的实际类别和预测类别均为 1 时的情况。

  • True Negatives (TN) - 数据点的实际类别和预测类别均为 0 时的情况。

  • 误报 (FP) - 数据点的实际类别为 0 而数据点的预测类别为 1 时的情况。

  • 假阴性 (FN) - 数据点的实际类别为 1 而数据点的预测类别为 0 时的情况。

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

from sklearn.metrics import confusion_matrix

输出

[
   [ 73   7]
   [  4 144]
]

准确性

它可以定义为我们的 ML 模型做出的正确预测的数量。我们可以借助以下公式通过混淆矩阵轻松计算它 -

$$