- Python機器學習(原書第3版)
- (美)塞巴斯蒂安·拉施卡 瓦希德·米爾賈利利
- 2204字
- 2021-06-11 16:13:39
3.2 了解scikit-learn的第一步——訓練感知器
在第2章中,我們學習了感知器規則和Adaline兩個機器學習分類算法,并親手用Python和NumPy實現了代碼。現在我們來看一下scikit-learn的API,如前所述,它結合了對用戶友好的界面和高度優化的幾種分類算法。scikit-learn軟件庫不僅提供了大量的學習算法,同時也包含了預處理數據、微調和評估模型等許多方便的功能。在第4章和第5章中,我們將對此及其他基本概念進行更詳細的討論。
作為理解scikit-learn軟件庫的起點,本章將訓練類似在第2章中實現的那種感知器。為了簡單起見,本書將在以后章節中繼續使用已經熟悉的鳶尾花數據集。這么做很方便,因為該數據集簡單且常見,經常被用于測試和檢驗算法,況且我們已經在前面使用scikit-learn軟件庫的過程中獲得了該數據集。下面將用鳶尾花數據集的兩個特征來實現可視化。
我們將把150個鳶尾花樣本的花瓣長度和寬度存入特征矩陣X
,把相應的品種分類標簽存入向量y
:

np.unique(y)
函數把返回的三個獨立分類標簽存儲在iris.target
,以整數(0
、1
、2
)分別存儲鳶尾花Iris-setosa
、Iris-versicolor
和Iris-virginica
的標簽。雖然許多scikit-learn函數和分類方法也能處理字符串形式的分類標簽,但是推薦采用整數標簽,這樣不但可以避免技術故障,還能因為所占內存更小而提高模型的計算性能。此外,用整數編碼分類標簽在大多數機器學習庫中都司空見慣。
為了評估經過訓練的模型對未知數據處理的效果,我們再進一步將數據集分割成單獨的訓練數據集和測試數據集。在第6章中,我們將圍繞評估模型的最佳實踐進行更詳細的討論:

利用scikit-learn庫model_selection
模塊的train_test_split
函數,把X
和y
數組隨機拆分為30%的測試數據集(45個樣本)和70%的訓練數據集(105個樣本)。
請注意,train_test_split
函數在分割數據集之前已經在內部對訓練數據集進行了洗牌,否則,所有分類標簽為0
和1
的樣本都會被分到訓練數據集,所有分類標簽為2
的45份樣本數據都將被分到測試數據集。通過設置random_state
參數,我們將為內部的偽隨機數生成器提供一個固定的隨機種子(random_state=1
),該生成器用于在分割數據集之前進行洗牌。采用這樣固定的random_state
可以確保結果可重現。
最后,我們通過定義stratify=y
獲得內置的分層支持。這種分層意味著調用train_test_split
方法可以返回與輸入數據集的分類標簽相同比例的訓練數據集和測試數據集。可以調用NumPy的bincount
函數統計數組中每個值出現數,以驗證數據:

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

利用前面的代碼,我們可以加載preprocessing
模塊中的StandardScaler
類,初始化一個新的StandardScaler
對象,然后將其分配給變量sc
。調用StandardScaler
的fit
方法對訓練數據的每個特征維度估計參數μ(樣本均值)和σ(標準差)進行估算。然后再調用transform
方法,利用估計的參數μ和σ標準化訓練數據。在標準化測試數據集時,要注意使用相同的縮放參數以確保訓練數據集與測試數據集的數值具有可比性。
完成訓練數據的標準化之后,我們可以動手訓練感知器模型。通過調用一對其余(OvR)方法,scikit-learn中的大多數算法都默認支持多類分類,允許把三類花的數據同時提交給感知器。具體的代碼實現如下:

scikit-learn界面會讓我們想起第2章中的感知器實現:從linear_model
模塊加載Perceptron
類之后,初始化新的Perceptron
對象,然后調用fit
方法對模型進行訓練。在這里,模型參數eta0
相當于前面感知器實現中用到的學習速率eta
,n_iter
參數定義了遍歷訓練數據集的迭代次數。
記得在第2章中討論過,要找到合適的學習速率需要一些試驗。學習速率過大,算法會錯過全局的最小代價點。學習速率過小,算法需要經過太多的迭代才會收斂,降低了學習速度,這對大型數據集的影響尤為明顯。同時,我們在每次迭代后,對訓練數據集用random_state
參數進行洗牌,以確保初始結果可以重現。
用scikit-learn訓練完模型后,我們可以調用predit
方法做預測,就像在第2章中感知器實現那樣,具體代碼如下:

執行代碼后,可以看到感知器在處理45個花朵樣本時出現過1次錯誤分類。因此,測試數據集上的分類錯誤率大約為0.022或2.2%(1/45≈0.022)。
分類錯誤率與準確率
許多機器學習實踐者報告模型的分類準確率,而不是分類錯誤率,兩者之間的關系簡單計算如下:
1-錯誤率=0.978或者97.8%
采用分類錯誤率還是準確率純粹屬于個人喜好。
scikit-learn也實現了許多不同的性能指標,我們可以通過metrics
模塊來調用。例如,可以計算測試數據集上感知器的分類準確率如下:

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

過擬合
注意,我們將根據本章的測試數據集來評估模型的性能。在第6章中,你將學到包括圖分析在內的有用技術,如用來檢測和防止過擬合的學習曲線。過擬合意味著雖然模型可以捕捉訓練數據中的模式,但卻不能很好地泛化未見過的新數據,我們在本章的后續部分將詳細討論。
最后,可以利用第2章中的plot_decision_regions
函數繪制新訓練的感知器模型的決策區,并以可視化的方式展示區分不同花朵樣本的效果。但是,略加修改通過圓圈來突出顯示來自測試數據集的樣本:


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

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

圖 3-1
第2章曾討論過感知器算法從不收斂于不完全線性可分離的數據集,這就是為什么在實踐中通常不推薦使用感知器算法。下面的章節將研究更強大的可以收斂到代價最小值的線性分類器,即使這些類不是完全線性可分的。
其他的感知器參數設置
Perceptron
以及其他scikit-learn函數和類通常會有一些我們不清楚的額外參數。可以通過Python的help
函數(例如help(Perceptron)
)閱讀更多關于這些參數的描述。或者學習杰出的scikit-learn在線文檔(http://scikit-learn.org/stable/)。
- DevOps:軟件架構師行動指南
- Instant Testing with CasperJS
- JavaScript 從入門到項目實踐(超值版)
- 薛定宇教授大講堂(卷Ⅳ):MATLAB最優化計算
- HTML5+CSS3網站設計基礎教程
- Hands-On GPU:Accelerated Computer Vision with OpenCV and CUDA
- Linux操作系統基礎案例教程
- Python算法從菜鳥到達人
- Python Data Analysis Cookbook
- Mastering React
- 智能搜索和推薦系統:原理、算法與應用
- Web性能實戰
- CRYENGINE Game Development Blueprints
- Android應用開發實戰(第2版)
- NGUI for Unity