一、模型驗證
進行模型驗證的一個重要目的是要選出一個最合適的模型,對於監督學習而言,我們希望模型對於未知數據的泛化能力強,所以就需要模型驗證這一過程來體現不同的模型對於未知數據的表現效果。
這里我們將訓練集再分成訓練集與驗證集兩部分,大概比例就是3:1吧。一般來講不同的訓練集、驗證集分割的方法會導致其准確率不同,而交叉驗證的基本思想是:將數據集進行一系列分割,生成一組不同的訓練驗證集,然后分別訓練模型並計算測試准確率,這樣就會得到多個模型與多個准確率,然后取其平均值即可,這樣就有效防止因為數據的特定分割導致的准確率偽過高,過擬合問題,對於模型的評價更加客觀、有說服力!
二、K折交叉驗證
- 將數據集平均分割成K個等份
- 使用1份數據作為測試數據,其余作為訓練數據
- 計算測試准確率
- 使用不同的測試集,重復2、3步驟
- 對測試准確率做平均,作為對未知數據預測准確率的估計
三、交叉驗證的應用
1)模型參數選擇
1 #!/usr/bin/python 2 3 import pandas as pd 4 import numpy as np 5 import matplotlib.pyplot as plt 6 from sklearn.linear_model import Ridge,RidgeCV, ElasticNet, LassoCV, LassoLarsCV 7 from sklearn.model_selection import cross_val_score 8 9 df=pd.read_csv('a.csv') 10 X_train=df.iloc[:,0:-1] 11 12 y=df.price 13 14 def rmse_cv(model): 15 rmse= np.sqrt(-cross_val_score(model, X_train, y, scoring="neg_mean_squared_error", cv = 3)) 16 print(rmse) 17 return(rmse) 18 19 20 21 alphas = [0.05, 0.1, 0.3, 1, 3, 5, 10, 15, 30, 50, 75] 22 23 cv_ridge = [rmse_cv(Ridge(alpha = alpha)).mean() for alpha in alphas] 24 25 26 cv_ridge = pd.Series(cv_ridge, index = alphas) 27 cv_ridge.plot(title = "Validation - Just Do It") 28 plt.xlabel("alpha") 29 plt.ylabel("rmse") 30 plt.show()
從上述圖中看出來,當alpha=1時候,rmse值最小。
這就是交叉驗證的一個典型應用,通過交叉驗證選擇Ridge回歸的正則化參數alpha,取使殘差平方值rmse最小的alpha值。
2)模型選擇
交叉驗證也可以幫助我們進行模型選擇,使用方式類似與上述參數選擇,就是利用交叉驗證集作用在不同的模型上,選擇一個使殘差平方值或者精確度最高(注:在scikit-learn的cross_val_score函數中可以選擇使用那種方式)的模型最為最終模型。
3)特征選擇
通過交叉驗證來進行特征的選擇,對比不同的特征組合對於模型的預測效果,大概方法也類同上述所講。
四、scikit-learn中cross_val_score函數
sklearn.cross_validation.cross_val_score
(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
estimator:所調用的機器學習模型算法
X:訓練集
y:訓練集的目標值
scoring:評測模型的打分標准,scoring可調用的對應的函數名稱如下:
sklearn.metrics.accuracy_score
sklearn.metrics.average_precision_score
sklearn.metrics.f1_score f1就是F-measure
sklearn.metrics.precision_score
sklearn.metrics.recall_score
sklearn.metrics.roc_auc_score
sklearn.metrics.adjusted_rand_score
sklearn.metrics.mean_squared_error
y
is either binary or multiclass,
StratifiedKFold
is used. In all other cases,
KFold
is used
。