官术网_书友最值得收藏!

3.5 使用邏輯回歸分類鳶尾花的種類

在機器學習領域,另一個著名的數據集稱為鳶尾花數據集(Iris dataset)。鳶尾花數據集包含3個不同種類(山鳶尾,Setosa;花斑鳶尾,Versicolor;維吉尼亞鳶尾,Viriginica)中150朵鳶尾花的測量值。這些測量值包含花瓣的長度和寬度、花萼的長度和寬度,所有的測量值均以厘米為單位。

我們的目標是建立可以學習這些鳶尾花測量值(這些花的種類是已知的)的一個機器學習模型,這樣我們就可以預測一朵新鳶尾花的種類。

3.5.1 理解邏輯回歸

在我們開始本節之前,讓我們發出警告——盡管名為邏輯回歸,但實際上是一個分類模型,尤其是在我們只有兩個類時。邏輯回歸的名稱來源于將輸入的任意實值x轉換成值在01之間的一個預測輸出值?的邏輯函數(或者Sigmoid函數),如圖3-12所示。四舍五入到最近的整數,有效地將輸入分類為0或者1

圖3-12 輸入的實值x和預測值?之間的函數關系

當然,我們的問題通常有多個輸入或者特征值x。例如,鳶尾花數據集一共提供4個特征。為了簡單起見,我們將重點關注前兩個特征:花萼長度——我們將其稱為特征f1,花萼的寬度——我們將其稱為特征f2。使用在線性回歸中學習的技巧,我們可以把輸入x表示成兩個特征f1和f2的一個線性組合:

x = w1f1 + w2f2

(3.5)

但是,與線性回歸相比,我們還沒有完成。從3.4節我們知道乘積的和將生成一個實值輸出——但是,我們感興趣的是分類值:0或者1。這就是邏輯函數的作用——充當一個壓縮函數,將可能的輸出值范圍壓縮到[0, 1]的范圍內:

?=σ(x)

(3.6)

提示

因為輸出總是在0和1之間,所以可以將輸出解釋為一個概率。如果我們只有一個輸入變量x,輸出值?可被解釋為x屬于類1的概率。

現在,讓我們把這些知識應用到鳶尾花數據集!

3.5.2 加載訓練數據

在scikit-learn中包含了鳶尾花數據集。首先,我們加載所有必要的模塊,就像我們在前面的例子中所做的那樣:

然后,加載數據集只需一行程序:

這個函數返回一個名為iris的字典,其包含一系列不同的字段:

這里,所有的數據點都包含在'data'中。有150個數據點,每個數據點有4個特征值:

這4個特征對應于花萼和花瓣的尺寸:

對于每個數據點,我們都在target中存儲了一個類標簽:

我們還可以查看類標簽,發現一共有3個類:

3.5.3 使其成為一個二值分類問題

為了簡單起見,現在我們將重點放在一個二值分類問題上,在這個問題上我們只有2個類。最簡單的方法是丟棄所有屬于某一類的數據點,例如類標簽2,選擇不屬于類2的所有行:

接下來,讓我們檢查數據。

3.5.4 數據檢查

在開始建立一個模型之前,最好先查看一下數據。在之前的城鎮地圖例子中我們就已經這樣做了,所以讓我們在這里重做一遍。使用Matplotlib,我們創建了一個散點圖,其中每個數據點的顏色與類標簽對應:

為了使繪圖更簡單,我們只使用前兩個特征(iris.feature_names[0]是花萼的長度,iris.feature_names[1]是花萼的寬度)。在圖3-13中,我們可以看到類很好地分開了。

圖3-13 Iris數據集前兩個特征的散點圖

3.5.5 將數據拆分成訓練集和測試集

在第2章中,我們學習了訓練數據和測試數據相互獨立是很重要的。在scikit-learn的眾多幫助函數中,使用其中一個輔助函數,我們可以很容易地拆分數據:

這里,我們希望將數據分為90%的訓練數據、10%的測試數據,我們使用test_size=0.1來指定這兩個數據。通過查看返回參數,我們注意到,最終我們得到90個訓練數據點,10個測試數據點:

3.5.6 訓練分類器

創建一個邏輯回歸分類器的步驟與創建一個k-NN的步驟基本相同:

接下來,我們必須指定所需的訓練方法。這里,我們可以選擇cv2.ml.LogisticRegression_BATCH或者cv2.ml.LogisticRegression_MINI_BATH。現在,我們需要知道的是,我們希望在每個數據點之后都更新模型,這可以通過下列代碼來實現:

我們還希望指定算法在終止前應該運行的迭代次數:

然后,我們可以調用對象的train方法(與前面的方法完全相同),它將在成功后返回True:

正如我們剛才看到的那樣,訓練階段的目標是找到一組最佳權重,將特征值轉換為一個輸出標簽。單個數據點由它的4個特征值(f0、f1、f2和f3)給出。因為我們有4個特征,所以我們還應該有4個權重,使得x = w0f0 + w1f1 + w2f2 + w3f3,而且? = σ(x)。但是,如前所述,該算法增加了一個額外的權重,它作為偏移量或偏置,使得x = w0f0 + w1f1 + w2f2 + w3f3 + w4。我們可以重新得到這些權重,如下所示:

這就意味著邏輯函數的輸入是x = –0.0409f0 – 0.0191f1 – 0.163f2 + 0.287f3 + 0.119。然后,在我們輸入一個新的屬于類1的數據點(f0、f1、f2和f3)時,輸出? = σ(x)應該接近于1。可是實際效果如何呢?

3.5.7 測試分類器

讓我們來計算一下訓練集的準確率得分:

完美得分!可是,這僅僅意味著該模型能夠完美地記住訓練數據集。這并不意味著該模型能夠對一個未知的、新的數據點進行分類。為此,我們需要檢查測試數據集:

很幸運,我們得到了另一個完美的得分!現在,我們可以確定我們建立的模型真的很棒。

主站蜘蛛池模板: 阳信县| 岑巩县| 赣州市| 错那县| 平远县| 英山县| 松滋市| 金门县| 克拉玛依市| 朔州市| 罗城| 泾川县| 陇川县| 如皋市| 陇西县| 南汇区| 达尔| 古蔺县| 栖霞市| 隆尧县| 渝北区| 阿尔山市| 镇宁| 渑池县| 错那县| 府谷县| 友谊县| 昭苏县| 德兴市| 都兰县| 苍南县| 通江县| 花莲县| 蛟河市| 长岛县| 许昌市| 长泰县| 杭州市| 当雄县| 大埔区| 定兴县|