# 3.5. 驗證曲線: 繪制分數以評估模型
校驗者:
[@正版喬](https://github.com/apachecn/scikit-learn-doc-zh)
[@小瑤](https://github.com/apachecn/scikit-learn-doc-zh)
翻譯者:
[@Xi](https://github.com/apachecn/scikit-learn-doc-zh)
每種估計器都有其優勢和缺陷。它的泛化誤差可以用偏差、方差和噪聲來分解。估計值的偏差 **bias** 是不同訓練集的平均誤差。估計值的方差 **variance** 用來表示它對訓練集的 變化有多敏感。噪聲是數據的一個屬性。
在下面的圖中,我們可以看到一個函數 [:math:`f(x) = \\cos (\\frac{3}{2} \\pi x)`\_](#id2) 和一些來自該函數的的帶噪聲數據的樣本。 我們用三個不同的估計來擬合函數:多項式特征為 1,4 和 15 的線性回歸。我們看到,第一個估計最多只能為樣本和真正的函數提供一個很差的擬合 ,因為它太簡單了(高偏差),第二個估計幾乎完全近似,最后一個估計完全接近訓練數據, 但不能很好地擬合真實的函數,即對訓練數據的變化(高方差)非常敏感。
[](../auto_examples/model_selection/plot_underfitting_overfitting.html)
偏差和方差是估計的固有屬性,我們通常必須選擇合適的學習算法和超參數,以使偏差和 方差都盡可能的低(參見偏差方差困境 [`Bias-variance dilemma<https://en.wikipedia.org/wiki/Bias-variance\_dilemma>`\_](#id6))。 減少模型方差的另一種方法是使用更多的訓練數據。 如果真實函數過于復雜,不能用一個方 差較小的估計來近似,則只能去收集更多的訓練數據。
在示例里簡單的一維問題中,我們可以很容易看出估計是否存在偏差或方差。 然而,在高維空間中, 模型可能變得非常難以可視化。 因此,使用下面所描述的工具通常是有幫助的。
示例:
- [Underfitting vs. Overfitting](../auto_examples/model_selection/plot_underfitting_overfitting.html#sphx-glr-auto-examples-model-selection-plot-underfitting-overfitting-py)
- [Plotting Validation Curves](../auto_examples/model_selection/plot_validation_curve.html#sphx-glr-auto-examples-model-selection-plot-validation-curve-py)
- [Plotting Learning Curves](../auto_examples/model_selection/plot_learning_curve.html#sphx-glr-auto-examples-model-selection-plot-learning-curve-py)
## 3.5.1. 驗證曲線
為了驗證一個模型,我們需要一個評分函數(參見模型評估:[模型評估: 量化預測的質量](model_evaluation.html#model-evaluation)), 例如分類器的準確性。 選擇估計器的多個超參數的正確方法當然是網格搜索或類似方法 (參見調整估計的超參數 [調整估計器的超參數](grid_search.html#grid-search) ),其選擇一個或多個驗證集上的分數最高的超參數。 請注意,如果我們基于驗證分數優化了超參數,則驗證分數就有偏差了,并且不再是一個良好的泛化估計。 為了得到正確的泛化估計,我們必須在另一個測試集上計算得分。
然而,繪制單個超參數對訓練分數和驗證分數的影響,有時有助于發現該估計是否因為某些超參數 而出現過擬合或欠擬合。
本例中,下面的方程 [`validation_curve`](generated/sklearn.model_selection.validation_curve.html#sklearn.model_selection.validation_curve "sklearn.model_selection.validation_curve") 能起到如下作用:
```
>>> 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)
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> 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))
>>> train_scores
array([[ 0.94..., 0.92..., 0.92...],
[ 0.94..., 0.92..., 0.92...],
[ 0.47..., 0.45..., 0.42...]])
>>> valid_scores
array([[ 0.90..., 0.92..., 0.94...],
[ 0.90..., 0.92..., 0.94...],
[ 0.44..., 0.39..., 0.45...]])
```
如果訓練得分和驗證得分都很低,則估計器是欠擬合的。 如果訓練得分高,驗證得分低,則估計器過擬合, 否則估計會擬合得很好。 通常不可能有較低的訓練得分和較高的驗證得分。 所有三種情況都可以 在下面的圖中找到,其中我們改變了數字數據集上 SVM 的參數  。
[](../auto_examples/model_selection/plot_validation_curve.html)
## 3.5.2. 學習曲線
學習曲線顯示了對于不同數量的訓練樣本的估計器的驗證和訓練評分。它可以幫助我們發現從增加更多的訓 練數據中能獲益多少,以及估計是否受方差誤差或偏差誤差的影響更大。如果驗證分數和訓練 分數都收斂到一個相對于增加的訓練集大小來說過低的值,那么我們將不能從更多的訓練數據 中獲益。在下面的圖中看到一個例子:樸素貝葉斯大致收斂到一個較低的分數。
[](../auto_examples/model_selection/plot_learning_curve.html)
我們可能需要使用可以學習更復雜概念(即具有較低偏差)的當前估計的一個估計值或參數化。 如果訓練樣本的最大時,訓練分數比驗證分數得分大得多,那么增加訓練樣本很可能會增加泛化能力。 在下面的圖中,可以看到支持向量機可以從更多的訓練樣本中獲益。
[](../auto_examples/model_selection/plot_learning_curve.html)
我們可以使用函數 [`learning_curve`](generated/sklearn.model_selection.learning_curve.html#sklearn.model_selection.learning_curve "sklearn.model_selection.learning_curve") 繪制這樣的學習曲線(已使用的樣本數,訓練集 上的平均分數和驗證集上的平均分數)所需的值:
```
>>> 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...]])
```
- scikit-learn 0.19 中文文檔
- 用戶指南
- 1. 監督學習
- 1.1. 廣義線性模型
- 1.2. 線性和二次判別分析
- 1.3. 內核嶺回歸
- 1.4. 支持向量機
- 1.5. 隨機梯度下降
- 1.6. 最近鄰
- 1.7. 高斯過程
- 1.8. 交叉分解
- 1.9. 樸素貝葉斯
- 1.10. 決策樹
- 1.11. 集成方法
- 1.12. 多類和多標簽算法
- 1.13. 特征選擇
- 1.14. 半監督學習
- 1.15. 等式回歸
- 1.16. 概率校準
- 1.17. 神經網絡模型(有監督)
- 2. 無監督學習
- 2.1. 高斯混合模型
- 2.2. 流形學習
- 2.3. 聚類
- 2.4. 雙聚類
- 2.5. 分解成分中的信號(矩陣分解問題)
- 2.6. 協方差估計
- 2.7. 經驗協方差
- 2.8. 收斂協方差
- 2.9. 稀疏逆協方差
- 2.10. Robust 協方差估計
- 2.11. 新奇和異常值檢測
- 2.12. 密度估計
- 2.13. 神經網絡模型(無監督)
- 3. 模型選擇和評估
- 3.1. 交叉驗證:評估估算器的表現
- 3.2. 調整估計器的超參數
- 3.3. 模型評估: 量化預測的質量
- 3.4. 模型持久化
- 3.5. 驗證曲線: 繪制分數以評估模型
- 4. 數據集轉換
- 4.1. Pipeline(管道)和 FeatureUnion(特征聯合): 合并的評估器
- 4.2. 特征提取
- 4.3. 預處理數據
- 4.4. 無監督降維
- 4.5. 隨機投影
- 4.6. 內核近似
- 4.7. 成對的矩陣, 類別和核函數
- 4.8. 預測目標 (y) 的轉換
- 5. 數據集加載工具
- 6. 大規模計算的策略: 更大量的數據
- 7. 計算性能
- 教程
- 使用 scikit-learn 介紹機器學習
- 關于科學數據處理的統計學習教程
- 機器學習: scikit-learn 中的設置以及預估對象
- 監督學習:從高維觀察預測輸出變量
- 模型選擇:選擇估計量及其參數
- 無監督學習: 尋求數據表示
- 把它們放在一起
- 尋求幫助
- 處理文本數據
- 選擇正確的評估器(estimator)
- 外部資源,視頻和談話