Python AI – 监督学习:分类



本章我们将重点介绍监督学习——分类的实现。

分类技术或模型试图从观察值中得出一些结论。在分类问题中,我们有分类的输出,例如“黑色”或“白色”或“教学”和“非教学”。在构建分类模型时,我们需要一个包含数据点和相应标签的训练数据集。例如,如果我们想检查图像是否为汽车。为此,我们将构建一个包含与“汽车”和“非汽车”相关的两类的训练数据集。然后,我们需要使用训练样本训练模型。分类模型主要用于人脸识别、垃圾邮件识别等。

在 Python 中构建分类器的步骤

为了在 Python 中构建分类器,我们将使用 Python 3 和 Scikit-learn(一个机器学习工具)。按照以下步骤在 Python 中构建分类器:

步骤 1 - 导入 Scikit-learn

这是在 Python 中构建分类器的第一步。在此步骤中,我们将安装一个名为 Scikit-learn 的 Python 包,它是 Python 中最好的机器学习模块之一。以下命令将帮助我们导入该包:

Import Sklearn

步骤 2 - 导入 Scikit-learn 的数据集

在此步骤中,我们可以开始使用机器学习模型的数据集。这里,我们将使用威斯康星州乳腺癌诊断数据库。该数据集包含有关乳腺癌肿瘤的各种信息,以及**恶性**或**良性**的分类标签。该数据集包含 569 个实例(或数据),关于 569 个肿瘤的信息,并包含 30 个属性(或特征)的信息,例如肿瘤的半径、纹理、光滑度和面积。借助以下命令,我们可以导入 Scikit-learn 的乳腺癌数据集:

from sklearn.datasets import load_breast_cancer

现在,以下命令将加载数据集。

data = load_breast_cancer()

以下是重要的字典键列表:

  • 分类标签名称 (target_names)
  • 实际标签 (target)
  • 属性/特征名称 (feature_names)
  • 属性 (data)

现在,借助以下命令,我们可以为每个重要信息集创建新变量并分配数据。换句话说,我们可以使用以下命令组织数据:

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(labels[0])
0

下面给出的两个命令将生成特征名称和特征值。

print(feature_names[0])
mean radius
print(features[0])
[ 1.79900000e+01 1.03800000e+01 1.22800000e+02 1.00100000e+03
  1.18400000e-01 2.77600000e-01 3.00100000e-01 1.47100000e-01
  2.41900000e-01 7.87100000e-02 1.09500000e+00 9.05300000e-01
  8.58900000e+00 1.53400000e+02 6.39900000e-03 4.90400000e-02
  5.37300000e-02 1.58700000e-02 3.00300000e-02 6.19300000e-03
  2.53800000e+01 1.73300000e+01 1.84600000e+02 2.01900000e+03
  1.62200000e-01 6.65600000e-01 7.11900000e-01 2.65400000e-01
  4.60100000e-01 1.18900000e-01]

从以上输出中,我们可以看到第一个数据实例是恶性肿瘤,其半径为 1.7990000e+01。

步骤 3 - 将数据组织成集合

在此步骤中,我们将数据分为两部分,即训练集和测试集。将数据分成这些集合非常重要,因为我们必须在看不见的数据上测试我们的模型。为了将数据分成集合,sklearn 有一个名为**train_test_split()** 的函数。借助以下命令,我们可以将数据分成这些集合:

from sklearn.model_selection import train_test_split

以上命令将从 sklearn 导入**train_test_split** 函数,下面的命令将数据分成训练数据和测试数据。在下面的示例中,我们使用 40% 的数据进行测试,其余数据将用于训练模型。

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

步骤 4 - 建立模型

在此步骤中,我们将构建我们的模型。我们将使用朴素贝叶斯算法来构建模型。可以使用以下命令构建模型:

from sklearn.naive_bayes import GaussianNB

以上命令将导入 GaussianNB 模块。现在,以下命令将帮助您初始化模型。

gnb = GaussianNB()

我们将通过使用 gnb.fit() 将其拟合到数据来训练模型。

model = gnb.fit(train, train_labels)

步骤 5 - 评估模型及其准确性

在此步骤中,我们将通过对测试数据进行预测来评估模型。然后,我们还将找出它的准确性。为了进行预测,我们将使用 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 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** 这两个数组,我们可以找出模型的准确性。我们将使用**accuracy_score()** 函数来确定准确性。考虑以下命令:

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

结果表明,朴素贝叶斯分类器的准确率为 95.17%。

通过以上步骤,我们可以用 Python 构建我们的分类器。

在 Python 中构建分类器

在本节中,我们将学习如何在 Python 中构建分类器。

朴素贝叶斯分类器

朴素贝叶斯是一种分类技术,用于使用贝叶斯定理构建分类器。假设是预测变量是独立的。简单来说,它假设特定特征在一个类中的存在与任何其他特征的存在无关。为了构建朴素贝叶斯分类器,我们需要使用名为 scikit learn 的 python 库。在 scikit learn 包下,有三种类型的朴素贝叶斯模型,名为**高斯、多项式和伯努利**。

为了构建朴素贝叶斯机器学习分类器模型,我们需要以下内容:

数据集

我们将使用名为威斯康星州乳腺癌诊断数据库的数据集。该数据集包含有关乳腺癌肿瘤的各种信息,以及**恶性**或**良性**的分类标签。该数据集包含 569 个实例(或数据),关于 569 个肿瘤的信息,并包含 30 个属性(或特征)的信息,例如肿瘤的半径、纹理、光滑度和面积。我们可以从 sklearn 包导入此数据集。

朴素贝叶斯模型

为了构建朴素贝叶斯分类器,我们需要一个朴素贝叶斯模型。如前所述,在 scikit learn 包下,有三种类型的朴素贝叶斯模型,名为**高斯、多项式和伯努利**。在这里,在下面的示例中,我们将使用高斯朴素贝叶斯模型。

通过使用以上方法,我们将构建一个朴素贝叶斯机器学习模型,以使用肿瘤信息来预测肿瘤是恶性还是良性。

首先,我们需要安装 sklearn 模块。可以使用以下命令完成:

Import 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(labels[0])
0

以下两个命令将生成特征名称和特征值。

print(feature_names[0])
mean radius
print(features[0])

[ 1.79900000e+01 1.03800000e+01 1.22800000e+02 1.00100000e+03
  1.18400000e-01 2.77600000e-01 3.00100000e-01 1.47100000e-01
  2.41900000e-01 7.87100000e-02 1.09500000e+00 9.05300000e-01
  8.58900000e+00 1.53400000e+02 6.39900000e-03 4.90400000e-02
  5.37300000e-02 1.58700000e-02 3.00300000e-02 6.19300000e-03
  2.53800000e+01 1.73300000e+01 1.84600000e+02 2.01900000e+03
  1.62200000e-01 6.65600000e-01 7.11900000e-01 2.65400000e-01
  4.60100000e-01 1.18900000e-01]

从以上输出中,我们可以看到第一个数据实例是恶性肿瘤,其主要半径为 1.7990000e+01。

为了在看不见的数据上测试我们的模型,我们需要将数据分成训练数据和测试数据。可以使用以下代码完成:

from sklearn.model_selection import train_test_split

以上命令将从 sklearn 导入**train_test_split** 函数,下面的命令将数据分成训练数据和测试数据。在下面的示例中,我们使用 40% 的数据进行测试,其余数据将用于训练模型。

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

现在,我们将使用以下命令构建模型:

from sklearn.naive_bayes import GaussianNB

以上命令将导入**GaussianNB** 模块。现在,使用下面给出的命令,我们需要初始化模型。

gnb = GaussianNB()

我们将通过使用**gnb.fit()** 将模型拟合到数据来训练模型。

model = gnb.fit(train, train_labels)

现在,通过对测试数据进行预测来评估模型,这可以按如下方式完成:

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 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** 这两个数组,我们可以找出模型的准确性。我们将使用**accuracy_score()** 函数来确定准确性。考虑以下命令:

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

结果表明,朴素贝叶斯分类器的准确率为 95.17%。

那是基于朴素贝叶斯高斯模型的机器学习分类器。

支持向量机 (SVM)

基本上,支持向量机 (SVM) 是一种监督机器学习算法,可用于回归和分类。SVM 的主要概念是将每个数据项绘制为 n 维空间中的一个点,其中每个特征的值是特定坐标的值。这里 n 将是我们拥有的特征。以下是一个简单的图形表示,用于理解 SVM 的概念:

Support Vector Machines 2

在上图中,我们有两个特征。因此,我们首先需要将这两个变量绘制在二维空间中,其中每个点都有两个坐标,称为支持向量。该线将数据分成两个不同的分类组。这条线将是分类器。

在这里,我们将使用 scikit-learn 和 iris 数据集构建 SVM 分类器。Scikitlearn 库具有**sklearn.svm** 模块,并提供 sklearn.svm.svc 用于分类。下面显示了根据 4 个特征预测鸢尾花类别的 SVM 分类器。

数据集

我们将使用 iris 数据集,该数据集包含 3 个类别的 50 个实例,每个类别代表一种鸢尾花类型。每个实例都有四个特征,即萼片长度、萼片宽度、花瓣长度和花瓣宽度。下面显示了根据 4 个特征预测鸢尾花类别的 SVM 分类器。

内核

这是一种支持向量机 (SVM) 使用的技术。基本上,这些函数将低维输入空间转换为高维空间。它将不可分问题转换为可分问题。核函数可以是线性、多项式、RBF 和 sigmoid 中的任何一个。在本例中,我们将使用线性核。

现在让我们导入以下包:

import pandas as pd
import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt

现在,加载输入数据:

iris = datasets.load_iris()

我们采用前两个特征:

X = iris.data[:, :2]
y = iris.target

我们将用原始数据绘制支持向量机边界。我们正在创建一个网格来绘制。

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
X_plot = np.c_[xx.ravel(), yy.ravel()]

我们需要给出正则化参数的值。

C = 1.0

我们需要创建 SVM 分类器对象。

Svc_classifier = svm_classifier.SVC(kernel='linear', 
C=C, decision_function_shape = 'ovr').fit(X, y)
Z = svc_classifier.predict(X_plot)
Z = Z.reshape(xx.shape)
plt.figure(figsize = (15, 5))
plt.subplot(121)
plt.contourf(xx, yy, Z, cmap = plt.cm.tab10, alpha = 0.3)
plt.scatter(X[:, 0], X[:, 1], c = y, cmap = plt.cm.Set1)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
svc with liner kernel

逻辑回归

基本上,逻辑回归模型是监督分类算法家族的成员之一。逻辑回归通过使用逻辑函数估计概率来衡量因变量和自变量之间的关系。

在这里,如果我们谈论因变量和自变量,则因变量是我们将要预测的目标类别变量,另一方面,自变量是我们将用来预测目标类别的特征。

在逻辑回归中,估计概率意味着预测事件发生的可能性。例如,店主想预测进入商店的顾客是否会购买 PlayStation(例如)。顾客会有很多特征——性别、年龄等——店主会观察这些特征来预测可能性,即是否购买 PlayStation。逻辑函数是 sigmoid 曲线,用于构建具有各种参数的函数。

先决条件

在使用逻辑回归构建分类器之前,我们需要在系统上安装 Tkinter 包。它可以从 https://docs.pythonlang.cn/2/library/tkinter.html 安装。

现在,借助以下提供的代码,我们可以使用逻辑回归创建一个分类器:

首先,我们将导入一些包:

import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt

现在,我们需要定义样本数据,可以按如下方式完成:

X = np.array([[2, 4.8], [2.9, 4.7], [2.5, 5], [3.2, 5.5], [6, 5], [7.6, 4],
              [3.2, 0.9], [2.9, 1.9],[2.4, 3.5], [0.5, 3.4], [1, 4], [0.9, 5.9]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3])

接下来,我们需要创建逻辑回归分类器,可以按如下方式完成:

Classifier_LR = linear_model.LogisticRegression(solver = 'liblinear', C = 75)

最后但并非最不重要的一点是,我们需要训练这个分类器:

Classifier_LR.fit(X, y)

现在,我们如何可视化输出?可以通过创建一个名为 Logistic_visualize() 的函数来完成:

Def Logistic_visualize(Classifier_LR, X, y):
   min_x, max_x = X[:, 0].min() - 1.0, X[:, 0].max() + 1.0
   min_y, max_y = X[:, 1].min() - 1.0, X[:, 1].max() + 1.0

在上行中,我们定义了要在网格中使用的 X 和 Y 的最小值和最大值。此外,我们将定义用于绘制网格的步长。

mesh_step_size = 0.02

让我们按如下方式定义 X 和 Y 值的网格:

x_vals, y_vals = np.meshgrid(np.arange(min_x, max_x, mesh_step_size),
                 np.arange(min_y, max_y, mesh_step_size))

借助以下代码,我们可以对网格运行分类器:

output = classifier.predict(np.c_[x_vals.ravel(), y_vals.ravel()])
output = output.reshape(x_vals.shape)
plt.figure()
plt.pcolormesh(x_vals, y_vals, output, cmap = plt.cm.gray)
 
plt.scatter(X[:, 0], X[:, 1], c = y, s = 75, edgecolors = 'black', 
linewidth=1, cmap = plt.cm.Paired)

以下代码行将指定绘图的边界

plt.xlim(x_vals.min(), x_vals.max())
plt.ylim(y_vals.min(), y_vals.max())
plt.xticks((np.arange(int(X[:, 0].min() - 1), int(X[:, 0].max() + 1), 1.0)))
plt.yticks((np.arange(int(X[:, 1].min() - 1), int(X[:, 1].max() + 1), 1.0)))
plt.show()

现在,运行代码后,我们将得到以下输出,逻辑回归分类器:

Logistic Regression

决策树分类器

决策树基本上是一个二叉树流程图,其中每个节点根据某些特征变量分割一组观测值。

在这里,我们正在构建一个决策树分类器来预测男性或女性。我们将采用一个非常小的数据集,其中包含 19 个样本。这些样本将包含两个特征——“身高”和“头发长度”。

先决条件

为了构建以下分类器,我们需要安装 **pydotplus** 和 **graphviz**。基本上,graphviz 是一个使用 dot 文件绘制图形的工具,而 **pydotplus** 是 Graphviz 的 Dot 语言的模块。可以使用包管理器或 pip 安装。

现在,我们可以借助以下 Python 代码构建决策树分类器:

首先,让我们导入一些重要的库,如下所示:

import pydotplus
from sklearn import tree
from sklearn.datasets import load_iris
from sklearn.metrics import classification_report
from sklearn import cross_validation
import collections

现在,我们需要提供数据集,如下所示:

X = [[165,19],[175,32],[136,35],[174,65],[141,28],[176,15],[131,32],
[166,6],[128,32],[179,10],[136,34],[186,2],[126,25],[176,28],[112,38],
[169,9],[171,36],[116,25],[196,25]]

Y = ['Man','Woman','Woman','Man','Woman','Man','Woman','Man','Woman',
'Man','Woman','Man','Woman','Woman','Woman','Man','Woman','Woman','Man']
data_feature_names = ['height','length of hair']

X_train, X_test, Y_train, Y_test = cross_validation.train_test_split
(X, Y, test_size=0.40, random_state=5)

提供数据集后,我们需要拟合模型,可以按如下方式完成:

clf = tree.DecisionTreeClassifier()
clf = clf.fit(X,Y)

可以使用以下 Python 代码进行预测:

prediction = clf.predict([[133,37]])
print(prediction)

我们可以借助以下 Python 代码可视化决策树:

dot_data = tree.export_graphviz(clf,feature_names = data_feature_names,
            out_file = None,filled = True,rounded = True)
graph = pydotplus.graph_from_dot_data(dot_data)
colors = ('orange', 'yellow')
edges = collections.defaultdict(list)

for edge in graph.get_edge_list():
edges[edge.get_source()].append(int(edge.get_destination()))

for edge in edges: edges[edge].sort()

for i in range(2):dest = graph.get_node(str(edges[edge][i]))[0]
dest.set_fillcolor(colors[i])
graph.write_png('Decisiontree16.png')

对于上面的代码,它将给出预测为 **['Woman']** 并创建以下决策树:

deision_tree

我们可以更改预测中特征的值来测试它。

随机森林分类器

众所周知,集成方法是将机器学习模型组合成更强大的机器学习模型的方法。随机森林,一系列决策树,就是其中之一。它优于单个决策树,因为它在保持预测能力的同时,可以通过平均结果来减少过拟合。在这里,我们将对 scikit learn 癌症数据集实现随机森林模型。

导入必要的包:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
import matplotlib.pyplot as plt
import numpy as np

现在,我们需要提供数据集,可以按如下方式完成:

cancer = load_breast_cancer()
X_train, X_test, y_train,
y_test = train_test_split(cancer.data, cancer.target, random_state = 0)

提供数据集后,我们需要拟合模型,可以按如下方式完成:

forest = RandomForestClassifier(n_estimators = 50, random_state = 0)
forest.fit(X_train,y_train)

现在,获得训练和测试子集的准确性:如果我们增加估计器的数量,那么测试子集的准确性也会提高。

print('Accuracy on the training subset:(:.3f)',format(forest.score(X_train,y_train)))
print('Accuracy on the training subset:(:.3f)',format(forest.score(X_test,y_test)))

输出

Accuracy on the training subset:(:.3f) 1.0
Accuracy on the training subset:(:.3f) 0.965034965034965

现在,与决策树一样,随机森林具有 **feature_importance** 模块,它将提供比决策树更好的特征权重视图。它可以绘制和可视化,如下所示:

n_features = cancer.data.shape[1]
plt.barh(range(n_features),forest.feature_importances_, align='center')
plt.yticks(np.arange(n_features),cancer.feature_names)
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.show()
Feature Importance

分类器的性能

实现机器学习算法后,我们需要找出模型的有效性。衡量有效性的标准可能基于数据集和指标。为了评估不同的机器学习算法,我们可以使用不同的性能指标。例如,假设如果使用分类器来区分不同对象的图像,我们可以使用分类性能指标,例如平均准确率、AUC 等。从某种意义上说,我们选择用于评估机器学习模型的指标非常重要,因为指标的选择会影响如何衡量和比较机器学习算法的性能。以下是一些指标:

混淆矩阵

它基本上用于分类问题,其中输出可以是两种或多种类型的类别。这是衡量分类器性能最简单的方法。混淆矩阵基本上是一个二维表,即“实际”和“预测”。这两个维度都有“真阳性 (TP)”、“真阴性 (TN)”、“假阳性 (FP)”、“假阴性 (FN)”。

confusion matrix

在上图的混淆矩阵中,1 代表正类,0 代表负类。

以下是与混淆矩阵相关的术语:

  • **真阳性 -** TP 是数据点的实际类别为 1 且预测也为 1 的情况。

  • **真阴性 -** TN 是数据点的实际类别为 0 且预测也为 0 的情况。

  • **假阳性 -** FP 是数据点的实际类别为 0 且预测为 1 的情况。

  • **假阴性 -** FN 是数据点的实际类别为 1 且预测为 0 的情况。

准确率

混淆矩阵本身并非性能度量,但几乎所有性能矩阵都基于混淆矩阵。其中之一是准确率。在分类问题中,它可以定义为模型对所有类型的预测所做的正确预测的数量。计算准确率的公式如下:

$$Accuracy = \frac{TP+TN}{TP+FP+FN+TN}$$

精确率

它主要用于文档检索。它可以定义为返回的文档中有多少是正确的。计算精确率的公式如下:

$$Precision = \frac{TP}{TP+FP}$$

召回率或灵敏度

它可以定义为模型返回多少阳性。计算模型召回率/灵敏度的公式如下:

$$Recall = \frac{TP}{TP+FN}$$

特异性

它可以定义为模型返回多少阴性。它与召回率恰好相反。计算模型特异性的公式如下:

$$Specificity = \frac{TN}{TN+FP}$$

类别不平衡问题

类别不平衡是指属于一个类别的观测值数量明显低于属于其他类别的观测值数量的情况。例如,当我们需要识别罕见疾病、银行中的欺诈交易等时,这个问题很突出。

类别不平衡的示例

让我们考虑一个欺诈检测数据集的示例,以了解类别不平衡的概念:

Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%

解决方案

**平衡类别**是对类别不平衡的解决方案。平衡类别的主要目标是增加少数类别的频率或减少多数类别的频率。以下是解决类别不平衡问题的几种方法:

重采样

重采样是一系列用于重建样本数据集的方法——训练集和测试集。重采样是为了提高模型的准确性。以下是一些重采样技术:

  • **随机欠采样 -** 此技术旨在通过随机消除多数类示例来平衡类分布。这样做直到多数类和少数类实例平衡。

Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%

在这种情况下,我们从非欺诈实例中抽取 10% 的样本(不放回),然后将它们与欺诈实例结合:

随机欠采样后的非欺诈观察值 = 非欺诈实例的 10% = 495

将它们与欺诈观察值组合后的总观察值 = 50 + 495 = 545

因此,现在欠采样后新数据集的事件发生率 = 9%

此技术的主要优点是可以减少运行时间并提高存储空间。但另一方面,它可能会在减少训练数据样本数量时丢弃有用的信息。

  • 随机过采样 − 此技术旨在通过增加少数类实例的数量来平衡类别分布,方法是复制少数类实例。

Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%

例如,如果我们复制50个欺诈观察值30次,那么复制少数类观察值后的欺诈观察值将为1500个。然后,过采样后新数据中的总观察值将为4950+1500 = 6450。因此,新数据集的事件发生率将为1500/6450 = 23%。

这种方法的主要优点是不会丢失有用的信息。但另一方面,由于它复制了少数类事件,因此增加了过拟合的可能性。

集成技术

此方法主要用于修改现有的分类算法,使其适用于不平衡数据集。在这种方法中,我们从原始数据中构建多个两阶段分类器,然后聚合它们的预测结果。随机森林分类器就是一个基于集成方法的分类器的例子。

广告
© . All rights reserved.