交叉驗證
學習預測函式的引數並在相同的資料上進行測試是一個方法上的錯誤:一個只重複它剛剛看到的樣本標籤的模型會得到一個完美的分數但卻無法預測任何有用的東西 - 看不見的資料。這種情況稱為過度擬合。為了避免這種情況,通常的做法是執行(監督的)機器學習實驗以將部分可用資料作為測試集 X_test, y_test
。請注意,實驗一詞並不僅僅用於表示學術用途,因為即使在商業環境中,機器學習通常也是從實驗開始的。
在 scikit-learn 中 ,可以使用 train_test_split輔助函式快速計算隨機拆分為訓練和測試集。讓我們載入虹膜資料集以適應線性支援向量機:
>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm
>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
我們現在可以快速取樣訓練集,同時保留 40%的資料用於測試(評估)我們的分類器:
>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
... iris.data, iris.target, test_size=0.4, random_state=0)
>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))
現在,在我們有訓練和測試集之後,讓我們使用它:
>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)