W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
每一個估計器都有其優(yōu)勢和劣勢。它的泛化誤差可以分解為偏差,方差和噪聲。估計器的偏差是不同訓(xùn)練集的平均誤差。估計器的方差表示對不同訓(xùn)練集,模型的敏感度。噪聲是數(shù)據(jù)的特質(zhì)。
在下圖中,可以看見一個函數(shù)和函數(shù)中的一些噪聲數(shù)據(jù)。使用三種不同的估計器來擬合函數(shù):帶有自由度為1,4和15的二項式特征的線性回歸。第一個估計器最多只能提供一個樣本與真實函數(shù)間不好的擬合,因為該函數(shù)太過簡單,第二個估計器估計的很好,最后一個估計器估計訓(xùn)練數(shù)據(jù)很好,但是不能擬合真實的函數(shù),例如對各種訓(xùn)練數(shù)據(jù)敏感(高方差)。
偏差和方差是估計器固有的特質(zhì),我們經(jīng)常選擇學(xué)習(xí)算法和超參數(shù),以使偏差和方差都盡可能小(參見Bias-variance dilemma)。另一個減少模型方差的方法是使用更多的訓(xùn)練數(shù)據(jù)。但是,如果真實函數(shù)太過復(fù)雜才能估計出一個低方差的估計器,你只能收集更多訓(xùn)練集數(shù)據(jù)。
在一個簡單的一維問題中,可以很容易看見估計器是否收到偏差或者方差的影響。但是,在高維空間中,模型很難被可視化。因為這個原因,使用工具來描述就很有用。
例子:
需要一個評分函數(shù)(詳見 度量和評分:量化預(yù)測的質(zhì)量)以驗證一個模型,例如分類器的準(zhǔn)確率。選擇一個估計器的多個超參數(shù)的好方法當(dāng)然是網(wǎng)格搜索或者相類似的方法(詳見 調(diào)整估計器的超參數(shù))通過選擇超參數(shù)以使在驗證集或者多個驗證集的分?jǐn)?shù)最大化。需要注意的是:如果基于驗證分?jǐn)?shù)優(yōu)化超參數(shù),驗證分?jǐn)?shù)是有偏的并且不是好的泛化估計。為了得到一個好的泛化估計,可以通過計算在另一個測試集上的分?jǐn)?shù)。
但是,有時繪制在訓(xùn)練集上單個參數(shù)的影響曲線也是有意義的,并且驗證分?jǐn)?shù)可以找到對于某些超參數(shù),估計器是過擬合還是欠擬合。
validation_score函數(shù)可以應(yīng)用在該例子中:
>>> import numpy as np
>>> from sklearn.model_selection import validation_curve
>>> from sklearn.datasets import load_iris
>>> from sklearn.linear_model import Ridge
>>> np.random.seed(0)
>>> X, y = load_iris(return_X_y=True)
>>> indices = np.arange(y.shape[0])
>>> np.random.shuffle(indices)
>>> X, y = X[indices], y[indices]
>>> train_scores, valid_scores = validation_curve(Ridge(), X, y, "alpha",
... np.logspace(-7, 3, 3),
... cv=5)
>>> train_scores
array([[0.93..., 0.94..., 0.92..., 0.91..., 0.92...],
[0.93..., 0.94..., 0.92..., 0.91..., 0.92...],
[0.51..., 0.52..., 0.49..., 0.47..., 0.49...]])
>>> valid_scores
array([[0.90..., 0.84..., 0.94..., 0.96..., 0.93...],
[0.90..., 0.84..., 0.94..., 0.96..., 0.93...],
[0.46..., 0.25..., 0.50..., 0.49..., 0.52...]])
如果訓(xùn)練分?jǐn)?shù)和驗證分?jǐn)?shù)都很低,估計器就是欠擬合。如果訓(xùn)練集的分?jǐn)?shù)很高,并且驗證集的分?jǐn)?shù)很低,估計器就是過擬合。除此以外,估計器的效果就很好。一個較低的訓(xùn)練分?jǐn)?shù)和一個較高的驗證分?jǐn)?shù)通常是不可能的。所有三個例子中可以在下圖中發(fā)現(xiàn),通過指定不同的支持向量機(jī)(SVM)的參數(shù)在數(shù)字集上的結(jié)果。
一個學(xué)習(xí)曲線表現(xiàn)的是在不同的訓(xùn)練樣本個數(shù)下估計器的驗證集和訓(xùn)練集得分。它是一個用于發(fā)現(xiàn)增加訓(xùn)練集數(shù)據(jù)可以獲得多大收益和是否估計器會遭受更多的方差和偏差。考慮下面的例子中,繪制了樸素貝葉斯分類器和支持向量機(jī)的學(xué)習(xí)曲線。
對于樸素貝葉斯,驗證分?jǐn)?shù)和訓(xùn)練分?jǐn)?shù)都向某一個分?jǐn)?shù)收斂,隨著訓(xùn)練集大小的增加,分?jǐn)?shù)下降的很低。因次,并不會從較大的數(shù)據(jù)集中獲益很多。
與之相對比,小數(shù)據(jù)量的數(shù)據(jù),支持向量機(jī)的訓(xùn)練分?jǐn)?shù)比驗證分?jǐn)?shù)高很多。添加更多的數(shù)據(jù)給訓(xùn)練樣本很可能會提高模型的泛化能力。
通過使用函數(shù)learning_curve繪制學(xué)習(xí)曲線所需的值(樣本被用的個數(shù),訓(xùn)練集的平均分?jǐn)?shù)和驗證集的平均分?jǐn)?shù)):
>>> from sklearn.model_selection import learning_curve
>>> from sklearn.svm import SVC
>>> train_sizes, train_scores, valid_scores = learning_curve(
... SVC(kernel='linear'), X, y, train_sizes=[50, 80, 110], cv=5)
>>> train_sizes
array([ 50, 80, 110])
>>> train_scores
array([[0.98..., 0.98 , 0.98..., 0.98..., 0.98...],
[0.98..., 1. , 0.98..., 0.98..., 0.98...],
[0.98..., 1. , 0.98..., 0.98..., 0.99...]])
>>> valid_scores
array([[1. , 0.93..., 1. , 1. , 0.96...],
[1. , 0.96..., 1. , 1. , 0.96...],
[1. , 0.96..., 1. , 1. , 0.96...]])
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: