AI人工智能 在Python中構(gòu)建分類器

2021-03-12 14:36 更新

在本節(jié)中,我們將學(xué)習(xí)如何在 Python 中構(gòu)建分類器。

樸素貝葉斯分類器

樸素貝葉斯是一種使用貝葉斯定理建立分類器的分類技術(shù)。 假設(shè)是預(yù)測(cè)變量是獨(dú)立的。 簡(jiǎn)而言之,它假設(shè)類中某個(gè)特征的存在與任何其他特征的存在無(wú)關(guān)。要構(gòu)建樸素貝葉斯分類器,我們需要使用名為 scikit learn 的 python庫(kù)。 在 scikit 學(xué)習(xí)包中,有三種類型的樸素貝葉斯模型被稱為 Gaussian,Multinomial 和 Bernoulli。

要構(gòu)建樸素貝葉斯機(jī)器學(xué)習(xí)分類器模型,需要以下“減號(hào)”

數(shù)據(jù)集

我們將使用名為 Breast Cancer Wisconsin Diagnostic Database數(shù)據(jù)集_blank。 數(shù)據(jù)集包括有關(guān)乳腺癌腫瘤的各種信息,以及惡性或良性分類標(biāo)簽。 該數(shù)據(jù)集在 569 個(gè)腫瘤上具有 569 個(gè)實(shí)例或數(shù)據(jù),并且包括關(guān)于 30 個(gè)屬性或特征(諸如腫瘤的半徑,紋理,光滑度和面積)的信息??梢詮?sklearn 包中導(dǎo)入這個(gè)數(shù)據(jù)集。

樸素貝葉斯模型

為了構(gòu)建樸素貝葉斯分類器,需要一個(gè)樸素貝葉斯模型。 如前所述,scikit 學(xué)習(xí)包中有三種類型的 Na?veBayes 模型,分別稱為 Gaussian,Multinomial 和 Bernoulli。 在下面的例子中,將使用高斯樸素貝葉斯模型。

通過(guò)使用上述內(nèi)容,我們將建立一個(gè)樸素貝葉斯機(jī)器學(xué)習(xí)模型來(lái)使用腫瘤信息來(lái)預(yù)測(cè)腫瘤是否是惡性的或良性的。

首先,我們需要安裝 sklearn 模塊。 它可以通過(guò)以下命令完成 -

import sklearn

現(xiàn)在,需要導(dǎo)入名為 Breast Cancer Wisconsin Diagnostic Database 的數(shù)據(jù)集。

from sklearn.datasets import load_breast_cancer

現(xiàn)在,以下命令將加載數(shù)據(jù)集。

data = load_breast_cancer()

數(shù)據(jù)可以按如下方式組織 -

label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']

現(xiàn)在,為了使它更清晰,可以在以下命令的幫助下打印類標(biāo)簽,第一個(gè)數(shù)據(jù)實(shí)例的標(biāo)簽,功能名稱和功能的值 -

print(label_names)

上述命令將分別打印惡性和良性的類名。 它顯示為下面的輸出 -

['malignant' 'benign']

現(xiàn)在,下面給出的命令將顯示它們映射到二進(jìn)制值 01。這里 0 表示惡性腫瘤,1 表示良性癌癥。 它顯示為下面的輸出 -

print(labels[0])
0

以下兩個(gè)命令將生成功能名稱和功能值。

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]

從以上輸出可以看出,第一個(gè)數(shù)據(jù)實(shí)例是一個(gè)主要半徑為 1.7990000e + 01 的惡性腫瘤。

要在未看到的數(shù)據(jù)上測(cè)試模型,我們需要將數(shù)據(jù)分解為訓(xùn)練和測(cè)試數(shù)據(jù)。 它可以在下面的代碼的幫助下完成 -

from sklearn.model_selection import train_test_split

上述命令將從 sklearn 中導(dǎo)入 train_test_split 函數(shù),下面的命令將數(shù)據(jù)分解為訓(xùn)練和測(cè)試數(shù)據(jù)。 在下面的例子中,使用 40%的數(shù)據(jù)進(jìn)行測(cè)試,并將提示數(shù)據(jù)用于訓(xùn)練模型。

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

現(xiàn)在,使用以下命令構(gòu)建模型 -

from sklearn.naive_bayes import GaussianNB

上述命令將從 sklearn 中導(dǎo)入train_test_split 函數(shù),下面的命令將數(shù)據(jù)分解為訓(xùn)練和測(cè)試數(shù)據(jù)。 在下面的例子中,我們使用 40% 的數(shù)據(jù)進(jìn)行測(cè)試,并將提示數(shù)據(jù)用于訓(xùn)練模型。

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

現(xiàn)在,使用以下命令構(gòu)建模型 -

from sklearn.naive_bayes import GaussianNB

上述命令將導(dǎo)入 GaussianNB 模塊。 現(xiàn)在,使用下面給出的命令,需要初始化模型。

gnb = GaussianNB()

將通過(guò)使用 gnb.fit()將它擬合到數(shù)據(jù)來(lái)訓(xùn)練模型。

model = gnb.fit(train, train_labels)

現(xiàn)在,通過(guò)對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)來(lái)評(píng)估模型,并且可以按如下方式完成 -

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]

上述01系列是腫瘤類別的預(yù)測(cè)值,即惡性和良性。

現(xiàn)在,通過(guò)比較兩個(gè)數(shù)組即 test_labelspreds,可以看到模型的準(zhǔn)確性。 我們將使用 accuracy_score() 函數(shù)來(lái)確定準(zhǔn)確性。 考慮下面的命令 -

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

結(jié)果顯示 Na?veBayes 分類器準(zhǔn)確率為 95.17%。

這是基于 Na?veBayse 高斯模型的機(jī)器學(xué)習(xí)分類器。

支持向量機(jī)(SVM) 基本上,支持向量機(jī)(SVM)是一種有監(jiān)督的機(jī)器學(xué)習(xí)算法,可用于回歸和分類。 SVM 的主要概念是將每個(gè)數(shù)據(jù)項(xiàng)繪制為n維空間中的一個(gè)點(diǎn),每個(gè)特征的值是特定坐標(biāo)的值。以下是了解 SVM 概念的簡(jiǎn)單圖形表示 -

img

在上圖中,有兩個(gè)特征。 因此,首先需要在二維空間中繪制這兩個(gè)變量,其中每個(gè)點(diǎn)都有兩個(gè)坐標(biāo),稱為支持向量。 該行將數(shù)據(jù)分成兩個(gè)不同的分類組。 這條線將是分類器。

在這里,將使用 scikit-learn 和 iris 數(shù)據(jù)集來(lái)構(gòu)建 SVM 分類器。 Scikitlearn 庫(kù)具有 sklearn.svm 模塊并提供 sklearn.svm.svc 進(jìn)行分類。 下面顯示了基于 4 個(gè)特征來(lái)預(yù)測(cè)虹膜植物種類的 SVM 分類器。

數(shù)據(jù)集

我們將使用包含3個(gè)類別(每個(gè)類別為 50 個(gè)實(shí)例)的虹膜數(shù)據(jù)集,其中每個(gè)類別指的是一類虹膜工廠。 每個(gè)實(shí)例具有四個(gè)特征,即萼片長(zhǎng)度,萼片寬度,花瓣長(zhǎng)度和花瓣寬度。 下面顯示了基于4個(gè)特征來(lái)預(yù)測(cè)虹膜植物分類的 SVM 分類器。

內(nèi)核 這是 SVM 使用的技術(shù)。 基本上這些功能采用低維輸入空間并將其轉(zhuǎn)換到更高維空間。 它將不可分離的問(wèn)題轉(zhuǎn)換成可分離的問(wèn)題。 核函數(shù)可以是線性,多項(xiàng)式,rbf 和 sigmoid 中的任何一種。 在這個(gè)例子中,將使用線性內(nèi)核。

現(xiàn)在導(dǎo)入下列軟件包 -

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

現(xiàn)在,加載輸入數(shù)據(jù) -

iris = datasets.load_iris()

我們使用前兩個(gè)功能 -

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

我們將用原始數(shù)據(jù)繪制支持向量機(jī)邊界,創(chuàng)建一個(gè)網(wǎng)格來(lái)繪制。

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()]

需要給出正則化參數(shù)的值。

C = 1.0

需要?jiǎng)?chuàng)建 SVM 分類器對(duì)象。參考以下代碼 -

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')

執(zhí)行后得到以下結(jié)果 -

img

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)