📅  最后修改于: 2020-12-10 05:34:22             🧑  作者: Mango
分类可以定义为根据观测值或给定数据点预测类别或类别的过程。分类的输出可以采用“黑色”或“白色”或“垃圾邮件”或“无垃圾邮件”的形式。
在数学上,分类是从输入变量(X)到输出变量(Y)近似映射函数(f)的任务。它基本上属于有监督的机器学习,在该机器学习中,还提供了目标以及输入数据集。
分类问题的一个示例可以是电子邮件中的垃圾邮件检测。只能有两类输出,“垃圾邮件”和“无垃圾邮件”;因此,这是一个二进制类型分类。
为了实现这种分类,我们首先需要训练分类器。在此示例中,“垃圾邮件”和“无垃圾邮件”电子邮件将用作培训数据。成功训练分类器后,可以将其用于检测未知电子邮件。
对于分类问题,我们有两种类型的学习者-
顾名思义,这类学习者在存储训练数据后等待测试数据出现。仅在获取测试数据后才进行分类。他们花在培训上的时间更少,但花在预测上的时间更多。懒惰学习者的例子有K近邻和基于案例的推理。
与懒惰的学习者相反,热心的学习者在存储训练数据后无需等待测试数据出现就构造分类模型。他们花更多的时间在训练上,而花更少的时间在预测上。渴望学习的人的例子有决策树,朴素贝叶斯和人工神经网络(ANN)。
Scikit-learn是一个用于机器学习的Python库,可用于在Python构建分类器。在Python中构建分类器的步骤如下-
为了使用scikit-learn构建分类器,我们需要将其导入。我们可以使用以下脚本导入它-
import sklearn
导入必要的程序包后,我们需要一个数据集来建立分类预测模型。我们可以从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
]
由于我们需要在看不见的数据上测试模型,因此将数据集分为两部分:训练集和测试集。我们可以使用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
)
将数据划分为训练和测试后,我们需要构建模型。为此,我们将使用朴素贝叶斯算法。以下命令将导入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时会出现这种情况。
真负数(TN) -数据点的实际类别和预测类别都为0的情况。
误报(FP) -数据点的实际类别为0且数据点的预测类别为1的情况。
假阴性(FN) -数据点的实际类别为1而数据点的预测类别为0的情况。
我们可以借助sklearn的confusion_matrix()函数找到混淆矩阵。借助以下脚本,我们可以找到上面构建的二进制分类器的混淆矩阵-
from sklearn.metrics import confusion_matrix
[
[ 73 7]
[ 4 144]
]
它可以定义为我们的ML模型做出的正确预测的数量。我们可以借助以下公式轻松地通过混淆矩阵来计算它-
$$𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦= \ 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分类算法-
逻辑回归
支持向量机(SVM)
决策树
朴素贝叶斯
随机森林
我们将在后续章节中详细讨论所有这些分类算法。
分类算法最重要的一些应用如下-
语音识别
手写识别
生物识别
文件分类