Machine Learning With Python 简明教程
Classification - Introduction
Introduction to Classification
分类可以定义为从观察到的值或给定的数据点中预测类或类别。分类后的输出形式可以是“黑”或“白”或“垃圾邮件”或“无垃圾邮件”。
从数学上讲,分类是从输入变量(X)到输出变量(Y)逼近映射函数(f)的任务。它基本上属于监督机器学习,其中目标也与输入数据集一起提供。
分类问题的示例可以是电子邮件中的垃圾邮件检测。输出只能有两类,“垃圾邮件”和“无垃圾邮件”;因此,这是一个二元类型分类。
为了实现此分类,我们首先需要训练分类器。对于此示例,“垃圾邮件”和“无垃圾邮件”电子邮件将用作训练数据。成功训练分类器后,可将其用于检测未知电子邮件。
Types of Learners in Classification
在分类问题中,我们有两种类型的学习器——
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 是 Malignant 和 Benign 肿瘤分类的预测值。
Classification Evaluation Metrics
即使你已完成机器学习应用程序或模型的实现,工作还未完成。我们必须找出我们的模型有多有效?可能有不同的评估指标,但我们必须仔细选择,因为指标的选择会影响机器学习算法的性能的测量和比较方式。
以下是你可以根据你的数据集和问题类型从中进行选择的一些重要的分类评估指标 −
Confusion Matrix
这是衡量分类问题性能的最简单方法,其中输出可以是两种或更多种类的类。混淆矩阵只不过是一个有两维的表格,即“实际”和“预测”,此外,这两个维度都具有“真阳性(TP)”、“真阴性(TN)”、“假阳性(FP)”、“假阴性(FN) ”如下所示 -
与混淆矩阵相关的术语的解释如下 -
-
True Positives (TP) − 是数据点的实际类别和预测类别均为 1 的情况。
-
True Negatives (TN) − 是数据点的实际类别和预测类别均为 0 的情况。
-
False Positives (FP) − 是数据点的实际类别为 0 和数据点的预测类别为 1 的情况。
-
False Negatives (FN) – 这是数据点的实际类别为 1,而数据点的预测类别为 0 的情况。
我们可以借助 sklearn 的 confusion_matrix() 函数找到混淆矩阵。借助以下脚本,我们可以找到上述构建的二元分类器的混淆矩阵 -
from sklearn.metrics import confusion_matrix
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