在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 人工智能監(jiān)督學(xué)習(xí)(分類)
人工智能開發(fā)環(huán)境配置
計(jì)算機(jī)視覺
啟發(fā)式搜索
人工智能監(jiān)督學(xué)習(xí)(回歸)
賭勝負(fù)
強(qiáng)化學(xué)習(xí)
人工智能無監(jiān)督學(xué)習(xí):聚類
人工智能入門概念
深度學(xué)習(xí)
NLTK包
人工智能(Python)教程
神經(jīng)網(wǎng)絡(luò)
自然語言處理
人工智能邏輯編程
遺傳算法
人工智能監(jiān)督學(xué)習(xí)(分類)
人工智能數(shù)據(jù)準(zhǔn)備
人工智能機(jī)器學(xué)習(xí)
語音識(shí)別
分析時(shí)間序列數(shù)據(jù)

人工智能監(jiān)督學(xué)習(xí)(分類)

在本章中,我們將重點(diǎn)討論監(jiān)督式學(xué)習(xí) - 分類。

分類技術(shù)或模型試圖從觀測(cè)值中得出一些結(jié)論。 在分類問題中,我們有分類輸出,如“黑色”或“白色”或“教學(xué)”和“非教學(xué)”。 在構(gòu)建分類模型時(shí),需要有包含數(shù)據(jù)點(diǎn)和相應(yīng)標(biāo)簽的訓(xùn)練數(shù)據(jù)集。 例如,如果想檢查圖像是否屬于汽車。 要實(shí)現(xiàn)這個(gè)檢查,我們將建立一個(gè)訓(xùn)練數(shù)據(jù)集,其中包含與“車”和“無車”相關(guān)的兩個(gè)類。 然后需要使用訓(xùn)練樣本來訓(xùn)練模型。 分類模型主要用于人臉識(shí)別,垃圾郵件識(shí)別等。

在Python中構(gòu)建分類器的步驟

為了在Python中構(gòu)建分類器,將使用Python 3和Scikit-learn,這是一個(gè)用于機(jī)器學(xué)習(xí)的工具。 按照以下步驟在Python中構(gòu)建分類器 -

第1步 - 導(dǎo)入Scikit-learn
這將是在Python中構(gòu)建分類器的第一步。 在這一步中,將安裝一個(gè)名為Scikit-learn的Python包,它是Python中最好的機(jī)器學(xué)習(xí)模塊之一。 以下命令導(dǎo)入包 -

import sklearn

第2步 - 導(dǎo)入Scikit-learn的數(shù)據(jù)集

在這一步中,我們可以開始使用機(jī)器學(xué)習(xí)模型的數(shù)據(jù)集。 在這里,將使用乳腺癌威斯康星診斷數(shù)據(jù)庫。 數(shù)據(jù)集包括有關(guān)乳腺癌腫瘤的各種信息,以及惡性或良性分類標(biāo)簽。 該數(shù)據(jù)集在569個(gè)腫瘤上具有569個(gè)實(shí)例或數(shù)據(jù),并且包括關(guān)于30個(gè)屬性或特征(諸如腫瘤的半徑,紋理,光滑度和面積)的信息。 借助以下命令,導(dǎo)入Scikit-learn的乳腺癌數(shù)據(jù)集 -

from sklearn.datasets import load_breast_cancer

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

data = load_breast_cancer()

以下是字典鍵列表 -

  • 分類標(biāo)簽名稱(target_names)
  • 實(shí)際標(biāo)簽(目標(biāo))
  • 屬性/功能名稱(feature_names)
  • 屬性(數(shù)據(jù))

現(xiàn)在,使用以下命令,可以為每個(gè)重要信息集創(chuàng)建新變量并分配數(shù)據(jù)。 換句話說,可以用下列命令組織數(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)

上述命令將分別打印惡性和良性的分類名稱。輸出結(jié)果如下 -

['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的惡性腫瘤。

第3步 - 組織數(shù)據(jù)

在這一步中,將把數(shù)據(jù)分成兩部分,即訓(xùn)練集和測(cè)試集。 將數(shù)據(jù)分割成這些集合非常重要,因?yàn)楸仨氃谖纯吹降臄?shù)據(jù)上測(cè)試模型。要將數(shù)據(jù)分成集合,sklearn有一個(gè)叫做train_test_split()函數(shù)的函數(shù)。 在以下命令的幫助下,可以分割這些集合中的數(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)

第4步 - 建立模型
在這一步中,我們將建立模型。使用樸素貝葉斯算法來構(gòu)建模型。 以下命令可用于構(gòu)建模型 -

from sklearn.naive_bayes import GaussianNB

上述命令將導(dǎo)入GaussianNB模塊。 現(xiàn)在,以下命令用來初始化模型。

gnb = GaussianNB()

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

model = gnb.fit(train, train_labels)

第5步 - 評(píng)估模型及其準(zhǔn)確性
在這一步中,我們將通過對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)來評(píng)估模型。為了做出預(yù)測(cè),我們將使用predict()函數(shù)。 以下命令做到這一點(diǎn) -

preds = gnb.predict(test)
print(preds)
## -- 結(jié)果如下
[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)在,通過比較兩個(gè)數(shù)組即test_labelspreds,可以發(fā)現(xiàn)模型的準(zhǔn)確性。使用accuracy_score()函數(shù)來確定準(zhǔn)確性。 考慮下面的命令 -

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

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

通過這種方式,借助上述步驟,我們可以使用Python構(gòu)建分類器。

在Python中構(gòu)建分類器

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

樸素貝葉斯分類器

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

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

數(shù)據(jù)集

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

樸素貝葉斯模型

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

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

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

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

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

model = gnb.fit(train, train_labels)

現(xiàn)在,通過對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)來評(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)在,通過比較兩個(gè)數(shù)組即test_labelspreds,可以看到模型的準(zhǔn)確性。 我們將使用accuracy_score()函數(shù)來確定準(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)單圖形表示 -

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

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

數(shù)據(jù)集

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

內(nèi)核
這是SVM使用的技術(shù)。 基本上這些功能采用低維輸入空間并將其轉(zhuǎn)換到更高維空間。 它將不可分離的問題轉(zhuǎ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)格來繪制。

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é)果 -

邏輯回歸

基本上,邏輯回歸模型是監(jiān)督分類算法族的成員之一。 Logistic回歸通過使用邏輯函數(shù)估計(jì)概率來測(cè)量因變量和自變量之間的關(guān)系。

在這里,如果我們討論依賴變量和獨(dú)立變量,那么因變量就是要預(yù)測(cè)的目標(biāo)類變量,另一方面,自變量是用來預(yù)測(cè)目標(biāo)類的特征。

在邏輯回歸中,估計(jì)概率意味著預(yù)測(cè)事件的可能性發(fā)生。例如,店主想要預(yù)測(cè)進(jìn)入商店的顧客將購買游戲站(例如)或不購買。顧客將會(huì)觀察到許多顧客的特征 - 性別,年齡等,以便預(yù)測(cè)可能性的發(fā)生,即購買游戲站或不購物。邏輯函數(shù)是用來構(gòu)建具有各種參數(shù)的函數(shù)的S形曲線。

前提條件

在使用邏輯回歸構(gòu)建分類器之前,我們需要在系統(tǒng)上安裝Tkinter軟件包。 它可以從 https://docs.python.org/2/library/tkinter.html 進(jìn)行安裝。

現(xiàn)在,在下面給出的代碼的幫助下,可以使用邏輯回歸來創(chuàng)建分類器 -

首先,導(dǎo)入一些軟件包 -

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

現(xiàn)在,需要定義可以完成的樣本數(shù)據(jù),如下所示 -

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

接下來,我們需要?jiǎng)?chuàng)建邏輯回歸分類器,可以按如下方式完成 -

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

最后但重要的是,我們需要訓(xùn)練這個(gè)分類器 -

Classifier_LR.fit(X, y)

現(xiàn)在,我們?nèi)绾慰梢暬敵觯?可以通過創(chuàng)建一個(gè)名為Logistic_visualize()的函數(shù)來完成 -

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

在上面的行中,我們定義了在網(wǎng)格中使用的最小值和最大值XY。另外,還將定義繪制網(wǎng)格的步長(zhǎng)。

mesh_step_size = 0.02

下面定義XY值的網(wǎng)格,如下所示 -

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

使用以下代碼,可以在網(wǎng)格網(wǎng)格上運(yùn)行分類器 -

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

現(xiàn)在,在運(yùn)行代碼之后,我們將得到以下輸出,邏輯回歸分類器 -

 決策樹分類器

決策樹基本上是一個(gè)二叉樹流程圖,其中每個(gè)節(jié)點(diǎn)根據(jù)某個(gè)特征變量分割一組觀察值。

在這里,我們正在構(gòu)建一個(gè)用于預(yù)測(cè)男性或女性的決策樹分類器。這里將采取一個(gè)非常小的數(shù)據(jù)集,有19個(gè)樣本。 這些樣本將包含兩個(gè)特征 - “身高”和“頭發(fā)長(zhǎng)度”。

前提條件

為了構(gòu)建以下分類器,我們需要安裝pydotplusgraphviz。 基本上,graphviz是使用點(diǎn)文件繪制圖形的工具,pydotplus是Graphviz的Dot語言模塊。 它可以與包管理器或使用pip來安裝。

現(xiàn)在,可以在以下Python代碼的幫助下構(gòu)建決策樹分類器 -

首先,導(dǎo)入一些重要的庫如下 -

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

現(xiàn)在,提供如下數(shù)據(jù)集 -

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)

在提供數(shù)據(jù)集之后,需要擬合可以如下完成的模型 -

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

預(yù)測(cè)可以使用以下Python代碼來完成 -

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

使用以下Python代碼來實(shí)現(xiàn)可視化決策樹 -

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

它會(huì)將上述代碼的預(yù)測(cè)作為[‘Woman’]并創(chuàng)建以下決策樹 -

可以改變預(yù)測(cè)中的特征值來測(cè)試它。

隨機(jī)森林分類器

集成方法是將機(jī)器學(xué)習(xí)模型組合成更強(qiáng)大的機(jī)器學(xué)習(xí)模型的方法。 隨機(jī)森林是決策樹的集合,就是其中之一。 它比單一決策樹好,因?yàn)樵诒A纛A(yù)測(cè)能力的同時(shí),通過平均結(jié)果可以減少過度擬合。 在這里,我們將在scikit學(xué)習(xí)癌癥數(shù)據(jù)集上實(shí)施隨機(jī)森林模型。

導(dǎo)入必要的軟件包 -

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

現(xiàn)在,需要按照以下方式提供數(shù)據(jù)集

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

在提供數(shù)據(jù)集之后,需要擬合可以如下完成的模型 -

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

現(xiàn)在,獲得訓(xùn)練以及測(cè)試子集的準(zhǔn)確性:如果增加估計(jì)器的數(shù)量,那么測(cè)試子集的準(zhǔn)確性也會(huì)增加。

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

上面代碼,輸出結(jié)果如下所示 -

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

現(xiàn)在,與決策樹一樣,隨機(jī)森林具有feature_importance模塊,它將提供比決策樹更好的特征權(quán)重視圖。 它可以如下繪制和可視化 -

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

執(zhí)行上面代碼,得到以下輸出結(jié)果 -

分類器的性能

在實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法之后,我們需要找出模型的有效性。 衡量有效性的標(biāo)準(zhǔn)可以基于數(shù)據(jù)集和度量標(biāo)準(zhǔn)。 為了評(píng)估不同的機(jī)器學(xué)習(xí)算法,我們可以使用不同的性能指標(biāo)。 例如,假設(shè)使用分類器來區(qū)分不同對(duì)象的圖像,可以使用分類性能指標(biāo),如平均準(zhǔn)確率,AUC等。從某種意義上說,我們選擇評(píng)估機(jī)器學(xué)習(xí)模型的指標(biāo)是非常重要的,因?yàn)橹笜?biāo)的選擇會(huì)影響機(jī)器學(xué)習(xí)算法的性能如何被測(cè)量和比較。 以下是一些指標(biāo) -

混亂矩陣

基本上它用于輸出可以是兩種或更多種類的分類問題。 這是衡量分類器性能的最簡(jiǎn)單方法。 混淆矩陣基本上是一個(gè)包含兩個(gè)維度即“實(shí)際”和“預(yù)測(cè)”的表格。 這兩個(gè)維度都有“真正的正面(TP)”,“真正的負(fù)面(TN)”,“錯(cuò)誤的正面(FP)”,“錯(cuò)誤的否定(FN)”。

在上面的混淆矩陣中,1表示正類,0表示負(fù)類。
以下是與混淆矩陣相關(guān)的術(shù)語 -

  • 真正 - 當(dāng)實(shí)際的數(shù)據(jù)點(diǎn)類別為1并且預(yù)測(cè)也為1時(shí),TP就是這種情況。
  • 真負(fù) - 當(dāng)數(shù)據(jù)點(diǎn)的實(shí)際類別為0并且預(yù)測(cè)也為0時(shí),TN就是這種情況。
  • 假正 - 當(dāng)實(shí)際的數(shù)據(jù)點(diǎn)類別為0并且預(yù)測(cè)也為1時(shí),F(xiàn)P就是這種情況。
  • 假負(fù) - FN是數(shù)據(jù)點(diǎn)的實(shí)際類別為1且預(yù)測(cè)也為0的情況。

準(zhǔn)確性

混淆矩陣本身并不是一個(gè)性能指標(biāo),但幾乎所有的性能矩陣均基于混淆矩陣。 其中之一是準(zhǔn)確性。 在分類問題中,它可能被定義為由模型對(duì)各種預(yù)測(cè)所做的正確預(yù)測(cè)的數(shù)量。 計(jì)算準(zhǔn)確度的公式如下 -

精確
它主要用于文件檢索。 它可能被定義為返回的文件有多少是正確的。 以下是計(jì)算精度的公式 -

召回或靈敏度
它可能被定義為模型返回的正數(shù)有多少。 以下是計(jì)算模型召回/靈敏度的公式 -

特異性
它可以定義為模型返回的負(fù)數(shù)有多少。 這與召回完全相反。 以下是計(jì)算模型特異性的公式 -

分類失衡問題

分類不平衡是屬于一個(gè)類別的觀察數(shù)量顯著低于屬于其他類別的觀測(cè)數(shù)量的場(chǎng)景。 例如,在我們需要識(shí)別罕見疾病,銀行欺詐性交易等情況下,這個(gè)問題非常突出。

不平衡分類的例子
讓我們考慮一個(gè)欺詐檢測(cè)數(shù)據(jù)集的例子來理解不平衡分類的概念 -

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

解決
平衡類的行為,解決不平衡的類問題。 平衡類的主要目標(biāo)是增加少數(shù)類的頻率或減少多數(shù)類的頻率。 以下是解決失衡類問題的方法 -

重采樣
重新采樣是用于重建樣本數(shù)據(jù)集的一系列方法 - 包括訓(xùn)練集和測(cè)試集。 重新抽樣是為了提高模型的準(zhǔn)確性。 以下是一些重新抽樣技術(shù) -

  • 隨機(jī)抽樣 - 這項(xiàng)技術(shù)旨在通過隨機(jī)排除大多數(shù)類別的例子來平衡課堂分布。 這樣做直到大多數(shù)和少數(shù)群體的實(shí)例得到平衡。
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%

在這種情況下,我們將10%的樣本從非欺詐實(shí)例中取而代之,然后將它們與欺詐實(shí)例相結(jié)合 -
隨機(jī)抽樣后的非欺詐性觀察:4950的10% = 495
將他們與欺詐觀察結(jié)合后的總觀測(cè)值: 50 + 495 = 545

因此,現(xiàn)在,低采樣后新數(shù)據(jù)集的事件率為: 9%

這種技術(shù)的主要優(yōu)點(diǎn)是可以減少運(yùn)行時(shí)間并改善存儲(chǔ)。 但另一方面,它可以丟棄有用的信息,同時(shí)減少訓(xùn)練數(shù)據(jù)樣本的數(shù)量。

  • 隨機(jī)抽樣 - 這種技術(shù)旨在通過復(fù)制少數(shù)類中的實(shí)例數(shù)量來平衡類分布。
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%

如果復(fù)制50次欺詐性觀察30次,那么在復(fù)制少數(shù)類別觀察值后欺詐觀察值將為1500。然后,在過采樣后新數(shù)據(jù)中的總觀察值將為:4950 + 1500 = 6450。因此,新數(shù)據(jù)集的事件率是:1500/6450 = 23%

這種方法的主要優(yōu)點(diǎn)是不會(huì)丟失有用的信息。 但另一方面,由于它復(fù)制了少數(shù)族群的事件,因此它有更多的過度機(jī)會(huì)。

合奏技巧

這種方法基本上用于修改現(xiàn)有的分類算法,使其適用于不平衡的數(shù)據(jù)集。 在這種方法中,我們從原始數(shù)據(jù)中構(gòu)建幾個(gè)兩階段分類器,然后匯總它們的預(yù)測(cè)。 隨機(jī)森林分類器是基于集合的分類器的一個(gè)例子。