在機器學習中,我們拿到一堆數據,在對模型進行訓練之前,需要對數據進行劃分,在劃分時,有幾種不同的方法:普通劃分、K折交叉驗證、分層交叉驗證。
這里還有一個概念——超參數,我們有時會見到,他表示在開始學習過程之前設置的參數值,而不是通過訓練得到的數據機器數據常用三種方法表示,通過訓練得到的數據稱為普通參數。
普通劃分:將數據集劃分為訓練集和測試集,具體的代碼實現如下:
from sklearn.model_selection import train_test_split
from sklearn import svm
# train_test_split就是對數據進行分割,可指定分割的數據中測試集的大小,
# 若random_state指定為某一個整數,那么每次劃分都是和上一次一樣的值,得到的準確率也是一樣的
# 這里是將測試集取整個數據集的20%,訓練集取80%
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=29)
# 運行支持向量機模型,得到運行結果
clf = svm.SVC(C=1, gamma='scale')
clf.fit(x_train, y_train)
score1 = clf.score(x_test, y_test)
通過調參可得到最合適該種數據劃分的模型,當數據劃分不同時,模型效果可能就不盡如人意。
K折交叉驗證:在數據集不是很充分時選用,可大致反應模型的平均水平。基本思想:
將整個數據集分為測試集和原訓練集,又將原訓練集隨機分為k份,挑選其中一份作為驗證集,剩下(k-1)份用作訓練集。在訓練集上訓練后得到一個模型,用這個模型在驗證集上進行測試,保存模型評估指標。重復第二步K次選定最優參數,再用所有的數據訓練一個新的模型,并用測試集進行測試。得到測試準確率。
訓練集、驗證集和測試集在K折交叉驗證過程中的作用:
訓練集用于訓練模型,在調節參數過程中需要驗證集提供的反饋信息,來修改網絡模型及參數。測試集就是在模型通過訓練集和驗證集確定最優參數后,用測試集來進行訓練,可得到模型的準確率。
K折交叉驗證的一個比較特殊的情況是留一法,樣本有K個,劃分為K份,每次留一份作為驗證集進行驗證,主要針對小樣本數據。當數據量大的時候,K可適當調小機器數據常用三種方法表示,數據量小的時候,K可適當調大。常用的是十折交叉驗證。
K折交叉驗證的實現代碼如下:
from sklearn.model_selection import cross_val_score
from sklearn import svm
clf = svm.SVC(C=1, gamma='scale')
# 這是使用k折交叉驗證得到的結果,這里的k值可由cv來指定
# 得到k個結果,得到的結果是一個列表
score2 = cross_val_score(clf, x, y, cv=10)
score_mean = np.array(score2)
分層交叉驗證法:他還是屬于交叉驗證的類型,分層是指再每一折中都保持著原始數據中各個類別的比例關系。
具體實現如下:
from sklearn.model_selection import StratifiedKFold
from sklearn import svm
clf = svm.SVC(C=1, gamma='scale')
# shuffle 參數用于確定在分類前是否對數據進行打亂清洗
strKFold = StratifiedKFold(n_splits=10, shuffle=False)
scores = cross_val_score(clf, x, y, cv=strKFold)
scores = np.array(scores)
print(scores)
print(scores.mean())
參考資料: