機器學習進階 第一節 第九課

我是小白呀發表於2020-12-10

概述

一般在進行模型的測試是, 我們會將資料分為訓練集合測試集. 在給定的樣本空間中, 拿出大部分樣本作為訓練集來訓練模型, 剩餘的小部分樣本使用剛建立的模型進行預測.

訓練集與測試集

訓練集與測試集的分割可以使用 cross_validation 中的 train_test_split 方法. 大部分的交叉驗證迭代器都內建一個劃分資料前進行資料索引打散的選項, train_test_split 方法內部使用的就是交叉驗證迭代器. 預設不會進行打散, 包括設定 cv = some_integer (直接) k 摺疊交叉驗證的 cross_val_score 返回一個隨機的劃分. (如果資料具有時間性, 千萬不要打散資料在劃分)

sklearn.cross_validation.train_test_split

程式碼如下:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 例項化
li = load_iris()

# 注意返回值: 訓練集 train: x_train, y_train, 測試集 test: x_test, y_test
x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25)

# 除錯輸出
print("訓練集特徵值和目標值: ", x_train, y_train)
print("測試集特徵值和目標值: ", x_test, y_test)

上面的方法也有侷限. 應為只進行一次測試, 並不一定代表模型的真實準確率. 因為, 模型的準確率和資料的切分有關係, 在資料量不大的情況下, 影響尤其突出. 所以還是需要一個比較好的解決方案.

holdout method

評估模型泛化能力的典型方法是 holdout 交叉驗證 (holdout cross vaildation). holdout 方法很簡單, 我們只需要將袁術資料集分割為訓練集和測試集, 前者用於訓練模型, 後者用於評估模型的效能. 一般來說, Holdout 驗證並非一種交叉驗證, 因為資料並沒有交叉使用. 隨機從最初的樣本中選出部分, 形成交叉驗證資料, 而剩餘的就當做訓練資料. 一般來說, 少於原本樣本三分之一的資料被選做驗證資料, 所有這種方法得到的結果其實並不具有說服性.

k-折交叉驗證

K 折交叉驗證, 初始取樣分割成 K 個樣本, 一個單獨的子樣本被保留作為驗證模型的資料, 其他 K-1 個樣本用來訓練. 交叉驗證重複 K 次, 每個子樣本驗證異常, 平均 K 次的結果或者使用其它結合方式, 最終得到一個單一估測. 這個方法的優勢在於, 同時複用運用隨機產生的子樣本進行訓練和驗證, 每次的結果驗證一次, 10 折交叉驗證是最常用的.
在這裡插入圖片描述
例如 5 折交叉驗證, 全部可用資料集分成五個集合, 每次迭代都選用其中的 1 個集合資料作為驗證即, 另外 4 個集合作為訓練集, 經過 5 組的迭代過程, 交叉驗證的好處在於, 可以保證所有資料都有機會被訓練和驗證, 也盡最大可能讓優化的模型效能表現的更加可信.

使用交叉驗證的最簡單的方式是在估計器和資料集上使用 cross_val_score 函式.

sklearn.cross_validation.cross_val_score

程式碼如下:

from sklearn.cross_validation import cross_val_score
diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
lasso = linear_model.Lasso()
print(cross_val_score(lasso, X, y))

使用交叉驗證方法的目的主要有 2 個:

  • 從有限的學習資料中獲取儘可能多的有效資訊
  • 可以在一定程度上避免過擬合問題

estimator 的工作流程

在 sklearn 中, 估計器 (estimator) 是一個重要的角色, 分類器和迴歸都屬於 estimator. 在估計器中有兩個重要的方法是 fit 和 transform.

  • fit 方法用於從訓練集中學習模型引數
  • transform 用學習帶的引數轉換資料
    在這裡插入圖片描述

相關文章