اعتبارسنجی متقابل (Cross Validation)
اعتبارسنجی متقابل یعنی سنجش مدل روی تکه های متفاوت داده. هدف، جلوگیری از نشت اطلاعات و بیش برازش است. با این کار، دقت روی داده دیده نشده بهتر سنجیده می شود.
شروع کار با داده Iris
اول داده را از sklearn می گیریم. X ویژگی است و y برچسب.
from sklearn import datasets
X, y = datasets.load_iris(return_X_y = True)
K-Fold
در K-Fold، داده به k بخش تقسیم می شود. مدل روی k-1 بخش آموزش می بیند. سپس روی بخش باقیمانده ارزیابی می شود.
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFold, cross_val_score
X, y = datasets.load_iris(return_X_y = True)
clf = DecisionTreeClassifier(random_state = 42)
k_folds = KFold(n_splits = 5)
scores = cross_val_score(clf, X, y, cv = k_folds)
print("Cross Validation Scores:", scores)
print("Average CV Score:", scores.mean())
print("Number of CV Scores used in Average:", len(scores))
Stratified K-Fold
اگر کلاس ها نامتوازن باشند، باید نسبت کلاس ها حفظ شود. Stratified K-Fold همین کار را انجام می دهد.
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score
X, y = datasets.load_iris(return_X_y = True)
clf = DecisionTreeClassifier(random_state = 42)
sk_folds = StratifiedKFold(n_splits = 5)
scores = cross_val_score(clf, X, y, cv = sk_folds)
print("Cross Validation Scores:", scores)
print("Average CV Score:", scores.mean())
print("Number of CV Scores used in Average:", len(scores))
Leave-One-Out (LOO)
در LOO، هر بار یک نمونه برای ارزیابی کنار می رود. باقی نمونه ها برای آموزش هستند. این روش پرهزینه اما دقیق است.
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import LeaveOneOut, cross_val_score
X, y = datasets.load_iris(return_X_y = True)
clf = DecisionTreeClassifier(random_state = 42)
loo = LeaveOneOut()
scores = cross_val_score(clf, X, y, cv = loo)
print("Cross Validation Scores:", scores)
print("Average CV Score:", scores.mean())
print("Number of CV Scores used in Average:", len(scores))
Leave-P-Out (LPO)
در LPO، به جای یک نمونه، p نمونه کنار می ماند. سپس آموزش و ارزیابی انجام می شود.
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import LeavePOut, cross_val_score
X, y = datasets.load_iris(return_X_y = True)
clf = DecisionTreeClassifier(random_state = 42)
lpo = LeavePOut(p = 2)
scores = cross_val_score(clf, X, y, cv = lpo)
print("Cross Validation Scores:", scores)
print("Average CV Score:", scores.mean())
print("Number of CV Scores used in Average:", len(scores))
Shuffle Split
در ShuffleSplit درصدی از داده کاملاً کنار می ماند. اندازه آموزش، آزمون و تعداد تکرار را تعیین می کنیم.
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import ShuffleSplit, cross_val_score
X, y = datasets.load_iris(return_X_y = True)
clf = DecisionTreeClassifier(random_state = 42)
ss = ShuffleSplit(train_size = 0.6, test_size = 0.3, n_splits = 5)
scores = cross_val_score(clf, X, y, cv = ss)
print("Cross Validation Scores:", scores)
print("Average CV Score:", scores.mean())
print("Number of CV Scores used in Average:", len(scores))
جمع بندی سریع
- K-Fold معیار مطمئن تری می دهد.
- Stratified نسبت کلاس ها را حفظ می کند.
- LOO دقیق اما کند است.
- LPO نسخه کلی ترِ LOO است.
- ShuffleSplit انعطاف بیشتری برای درصدها می دهد.
نکته: برای یافتن پارامترهای خوب، از جست وجوی شبکه ای کمک بگیر. همچنین اثر تجمیع را در بگینگ ببین.