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.python.club.tw/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.