在本章中,我們將重點(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 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()
以下是字典鍵列表 -
現(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)制值0和1。這里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]
上述0和1系列是腫瘤類別的預(yù)測(cè)值 - 惡性和良性。
現(xiàn)在,通過比較兩個(gè)數(shù)組即test_labels和preds,可以發(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)建分類器。
在本節(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)制值0和1。這里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]
上述0和1系列是腫瘤類別的預(yù)測(cè)值,即惡性和良性。
現(xiàn)在,通過比較兩個(gè)數(shù)組即test_labels和preds,可以看到模型的準(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)格中使用的最小值和最大值X和Y。另外,還將定義繪制網(wǎng)格的步長(zhǎng)。
mesh_step_size = 0.02
下面定義X和Y值的網(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)建以下分類器,我們需要安裝pydotplus和graphviz。 基本上,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ī)器學(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ù)語 -
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ù) -
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ù)量。
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è)例子。