分类介绍
分类可以定义为从观察值或给定数据点预测类别或类别的过程。分类输出可以具有诸如“黑色”或“白色”或“垃圾邮件”或“无垃圾邮件”的形式。
在数学上,分类是逼近从输入变量 (X) 到输出变量 (Y) 的映射函数 (f) 的任务。它基本上属于监督机器学习,其中目标也与输入数据集一起提供。
分类问题的一个例子可以是电子邮件中的垃圾邮件检测。只能有两类输出,“垃圾邮件”和“无垃圾邮件”;因此这是一个二元类型分类。
为了实现这种分类,我们首先需要训练分类器。对于此示例,“垃圾邮件”和“无垃圾邮件”电子邮件将用作训练数据。成功训练分类器后,可用于检测未知电子邮件。
分类中的学习者类型
对于分类问题,我们有两种类型的学习器:
懒惰的学习者
顾名思义,这种学习器在存储训练数据后等待测试数据出现。只有在获得测试数据后才能进行分类。他们花更少的时间在训练上,但更多的时间在预测上。惰性学习器的示例是 K-最近邻和基于案例的推理。
渴望学习者
与惰性学习者相反,渴望学习者在存储训练数据后无需等待测试数据出现即可构建分类模型。他们花更多的时间在训练上,但花在预测上的时间更少。渴望学习者的例子有决策树、朴素贝叶斯和人工神经网络 (ANN)。
在 Python 中构建分类器
Scikit-learn 是一个用于机器学习的 Python 库,可用于在 Python 中构建分类器。在 Python 中构建分类器的步骤如下:
步骤1:导入必要的python包
为了使用 scikit-learn 构建分类器,我们需要导入它。我们可以使用以下脚本来导入它:
import sklearn
步骤2:导入数据集
导入必要的包后,我们需要一个数据集来构建分类预测模型。我们可以从 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']
以下命令将打印标签的名称,‘ 恶性的 ’ and ‘ benign ’ 在我们的数据库中。
print(label_names)
上述命令的输出是标签的名称:
['malignant' 'benign']
这些标签映射到二进制值 0 和 1。 恶性 癌症由 0 和 Benign 癌症用 1 表示。
这些标签的特征名称和特征值可以通过以下命令查看:
print(feature_names[0])
上述命令的输出是标签 0 的特征名称,即 恶性 cancer:
mean radius
同样,标签的特征名称可以产生如下:
print(feature_names[1])
上述命令的输出是标签 1 的特征名称,即 Benign cancer:
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 ]
步骤3:将数据组织成训练和测试集
由于我们需要在看不见的数据上测试我们的模型,我们将数据集分为两部分:训练集和测试集。我们可以使用 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 )
步骤4:模型评估
将数据划分为训练和测试后,我们需要构建模型。为此,我们将使用朴素贝叶斯算法。以下命令将导入 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 是 恶性 and Benign 肿瘤分类。
步骤5:寻找准确性
我们可以通过比较两个数组 test_labels 和 preds 来找到上一步中模型构建的准确性。我们将使用 accuracy_score() 函数来确定准确性。
from sklearn.metrics import accuracy_score print(accuracy_score(test_labels,preds)) 0.951754385965
上面的输出显示 NaïveBayes 分类器的准确率为 95.17%。
分类评估指标
即使你已经完成了机器学习应用程序或模型的实施,这项工作也没有完成。我们必须找出我们的模型有多有效?可以有不同的评估指标,但我们必须谨慎选择,因为指标的选择会影响机器学习算法的性能如何衡量和比较。
以下是一些重要的分类评估指标,你可以根据你的数据集和问题类型选择这些指标:
混淆矩阵
这是衡量分类问题性能的最简单方法,其中输出可以是两种或多种类型的类。混淆矩阵只不过是一个二维表,即。 “Actual”和“Predicted”,此外,这两个维度都有“True Positives (TP)”、“True Negatives (TN)”、“False Positives (FP)”、“False Negatives (FN)”,如下图所示:
混淆矩阵相关术语解释如下:
-
真阳性(TP) : 数据点的实际类别和预测类别均为1时的情况。
-
真阴性 (TN) : 数据点的实际类别和预测类别均为0时的情况。
-
误报 (FP) : 数据点的实际类别为 0,预测的数据点类别为 1 的情况。
-
假阴性 (FN) : 数据点的实际类别为 1,预测的数据点类别为 0 的情况。
我们可以借助sklearn的confusion_matrix()函数找到混淆矩阵。借助以下脚本,我们可以找到上面构建的二元分类器的混淆矩阵:
from sklearn.metrics import confusion_matrix
[ [ 73 7] [ 4 144] ]
Accuracy
它可以定义为我们的机器学习模型做出的正确预测的数量。我们可以借助以下公式轻松地通过混淆矩阵计算它:
$$????????=\frac{??+??}{??+??+??+??}$$对于上面构建的二元分类器,TP + TN = 73+144 = 217 和 TP+FP+FN+TN = 73+7+4+144=228。
因此,准确度 = 217/228 = 0.951754385965,这与我们在创建二元分类器后计算的结果相同。
精确
用于文档检索的精度可以定义为我们的 ML 模型返回的正确文档的数量。我们可以借助以下公式轻松地通过混淆矩阵计算它:
$$?????????=\frac{??}{??+FP}$$对于上面构建的二元分类器,TP = 73 和 TP+FP = 73+7 = 80。
因此,精度 = 73/80 = 0.915
召回或敏感度
召回率可以定义为我们的 ML 模型返回的正数。我们可以借助以下公式轻松地通过混淆矩阵计算它:
$$??????=\frac{??}{??+FN}$$对于上面构建的二元分类器,TP = 73 和 TP+FN = 73+4 = 77。
因此,精度 = 73/77 = 0.94805
特异性
与召回相反,特异性可以定义为我们的 ML 模型返回的负数。我们可以借助以下公式轻松地通过混淆矩阵计算它:
$$???????????=\frac{?N}{?N+FP}$$对于上面构建的二元分类器,TN = 144 和 TN+FP = 144+7 = 151。
因此,精度 = 144/151 = 0.95364
各种 ML 分类算法
以下是一些重要的ML分类算法:
-
逻辑回归
-
支持向量机 (SVM)
-
决策树
-
朴素贝叶斯
-
随机森林
我们将在后续章节中详细讨论所有这些分类算法。
应用
分类算法的一些最重要的应用如下:
-
语音识别
-
手写识别
-
生物识别
-
文件分类