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

3.2 了解scikit-learn的第一步——訓練感知器

在第2章中,我們學習了感知器規則和Adaline兩個機器學習分類算法,并親手用Python和NumPy實現了代碼。現在我們來看一下scikit-learn的API,如前所述,它結合了對用戶友好的界面和高度優化的幾種分類算法。scikit-learn軟件庫不僅提供了大量的學習算法,同時也包含了預處理數據、微調和評估模型等許多方便的功能。在第4章和第5章中,我們將對此及其他基本概念進行更詳細的討論。

作為理解scikit-learn軟件庫的起點,本章將訓練類似在第2章中實現的那種感知器。為了簡單起見,本書將在以后章節中繼續使用已經熟悉的鳶尾花數據集。這么做很方便,因為該數據集簡單且常見,經常被用于測試和檢驗算法,況且我們已經在前面使用scikit-learn軟件庫的過程中獲得了該數據集。下面將用鳶尾花數據集的兩個特征來實現可視化。

我們將把150個鳶尾花樣本的花瓣長度和寬度存入特征矩陣X,把相應的品種分類標簽存入向量y

051-01

np.unique(y)函數把返回的三個獨立分類標簽存儲在iris.target,以整數(012)分別存儲鳶尾花Iris-setosaIris-versicolorIris-virginica的標簽。雖然許多scikit-learn函數和分類方法也能處理字符串形式的分類標簽,但是推薦采用整數標簽,這樣不但可以避免技術故障,還能因為所占內存更小而提高模型的計算性能。此外,用整數編碼分類標簽在大多數機器學習庫中都司空見慣。

為了評估經過訓練的模型對未知數據處理的效果,我們再進一步將數據集分割成單獨的訓練數據集和測試數據集。在第6章中,我們將圍繞評估模型的最佳實踐進行更詳細的討論:

051-02

利用scikit-learn庫model_selection模塊的train_test_split函數,把Xy數組隨機拆分為30%的測試數據集(45個樣本)和70%的訓練數據集(105個樣本)。

請注意,train_test_split函數在分割數據集之前已經在內部對訓練數據集進行了洗牌,否則,所有分類標簽為01的樣本都會被分到訓練數據集,所有分類標簽為2的45份樣本數據都將被分到測試數據集。通過設置random_state參數,我們將為內部的偽隨機數生成器提供一個固定的隨機種子(random_state=1),該生成器用于在分割數據集之前進行洗牌。采用這樣固定的random_state可以確保結果可重現。

最后,我們通過定義stratify=y獲得內置的分層支持。這種分層意味著調用train_test_split方法可以返回與輸入數據集的分類標簽相同比例的訓練數據集和測試數據集。可以調用NumPy的bincount函數統計數組中每個值出現數,以驗證數據:

051-03

許多機器學習和優化算法也需要進行特征縮放以獲得最佳性能,正如在第2章的梯度下降示例中所看到的那樣。在這里,使用scikit-learn的preprocessing模塊的StandardScaler類來標準化特征:

052-01

利用前面的代碼,我們可以加載preprocessing模塊中的StandardScaler類,初始化一個新的StandardScaler對象,然后將其分配給變量sc。調用StandardScalerfit方法對訓練數據的每個特征維度估計參數μ(樣本均值)和σ(標準差)進行估算。然后再調用transform方法,利用估計的參數μ和σ標準化訓練數據。在標準化測試數據集時,要注意使用相同的縮放參數以確保訓練數據集與測試數據集的數值具有可比性。

完成訓練數據的標準化之后,我們可以動手訓練感知器模型。通過調用一對其余(OvR)方法,scikit-learn中的大多數算法都默認支持多類分類,允許把三類花的數據同時提交給感知器。具體的代碼實現如下:

052-02

scikit-learn界面會讓我們想起第2章中的感知器實現:從linear_model模塊加載Perceptron類之后,初始化新的Perceptron對象,然后調用fit方法對模型進行訓練。在這里,模型參數eta0相當于前面感知器實現中用到的學習速率etan_iter參數定義了遍歷訓練數據集的迭代次數。

記得在第2章中討論過,要找到合適的學習速率需要一些試驗。學習速率過大,算法會錯過全局的最小代價點。學習速率過小,算法需要經過太多的迭代才會收斂,降低了學習速度,這對大型數據集的影響尤為明顯。同時,我們在每次迭代后,對訓練數據集用random_state參數進行洗牌,以確保初始結果可以重現。

用scikit-learn訓練完模型后,我們可以調用predit方法做預測,就像在第2章中感知器實現那樣,具體代碼如下:

052-03

執行代碼后,可以看到感知器在處理45個花朵樣本時出現過1次錯誤分類。因此,測試數據集上的分類錯誤率大約為0.022或2.2%(1/45≈0.022)。

008-01

分類錯誤率與準確率

許多機器學習實踐者報告模型的分類準確率,而不是分類錯誤率,兩者之間的關系簡單計算如下:

1-錯誤率=0.978或者97.8%

采用分類錯誤率還是準確率純粹屬于個人喜好。

scikit-learn也實現了許多不同的性能指標,我們可以通過metrics模塊來調用。例如,可以計算測試數據集上感知器的分類準確率如下:

053-01

這里y_test是真分類標簽,而y_pred是先前預測的分類標簽。另外,每個scikit-learn分類器都有一個評分方法,可以通過綜合調用predictaccuracy_score計算出分類器的預測準確率:

053-02

008-01

過擬合

注意,我們將根據本章的測試數據集來評估模型的性能。在第6章中,你將學到包括圖分析在內的有用技術,如用來檢測和防止過擬合的學習曲線。過擬合意味著雖然模型可以捕捉訓練數據中的模式,但卻不能很好地泛化未見過的新數據,我們在本章的后續部分將詳細討論。

最后,可以利用第2章中的plot_decision_regions函數繪制新訓練的感知器模型的決策區,并以可視化的方式展示區分不同花朵樣本的效果。但是,略加修改通過圓圈來突出顯示來自測試數據集的樣本:

053-03
054-01

通過小幅修改plot_decision_regions函數,我們可以在結果圖上定義樣本的標記索引。代碼如下:

054-02

正如從結果圖上所看到的那樣,三類花不能被線性決策邊界完全分離,如圖3-1所示。

054-03

圖 3-1

第2章曾討論過感知器算法從不收斂于不完全線性可分離的數據集,這就是為什么在實踐中通常不推薦使用感知器算法。下面的章節將研究更強大的可以收斂到代價最小值的線性分類器,即使這些類不是完全線性可分的。

008-01

其他的感知器參數設置

Perceptron以及其他scikit-learn函數和類通常會有一些我們不清楚的額外參數。可以通過Python的help函數(例如help(Perceptron))閱讀更多關于這些參數的描述。或者學習杰出的scikit-learn在線文檔(http://scikit-learn.org/stable/)。

主站蜘蛛池模板: 武汉市| 汤原县| 修武县| 潮安县| 临夏县| 潢川县| 遵化市| 辛集市| 汉川市| 绵阳市| 藁城市| 姜堰市| 新丰县| 乌兰县| 建水县| 和田县| 武汉市| 瑞金市| 枞阳县| 南安市| 中宁县| 深水埗区| 延长县| 保康县| 余姚市| 平陆县| 疏勒县| 天全县| 莆田市| 门源| 独山县| 沂水县| 江都市| 田东县| 左云县| 垫江县| 鄂伦春自治旗| 尼勒克县| 台江县| 金山区| 息烽县|