python進行機器學習(四)之模型驗證與參數選擇


一、模型驗證

  進行模型驗證的一個重要目的是要選出一個最合適的模型,對於監督學習而言,我們希望模型對於未知數據的泛化能力強,所以就需要模型驗證這一過程來體現不同的模型對於未知數據的表現效果。

  這里我們將訓練集再分成訓練集與驗證集兩部分,大概比例就是3:1吧。一般來講不同的訓練集、驗證集分割的方法會導致其准確率不同,而交叉驗證的基本思想是:將數據集進行一系列分割,生成一組不同的訓練驗證集,然后分別訓練模型並計算測試准確率,這樣就會得到多個模型與多個准確率,然后取其平均值即可,這樣就有效防止因為數據的特定分割導致的准確率偽過高,過擬合問題,對於模型的評價更加客觀、有說服力!

 

二、K折交叉驗證

  1. 將數據集平均分割成K個等份
  2. 使用1份數據作為測試數據,其余作為訓練數據
  3. 計算測試准確率
  4. 使用不同的測試集,重復2、3步驟
  5. 對測試准確率做平均,作為對未知數據預測准確率的估計

 

三、交叉驗證的應用

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可調用的對應的函數名稱如下:

    Classification 
    ‘accuracy’ sklearn.metrics.accuracy_score
    ‘average_precision’ sklearn.metrics.average_precision_score
    ‘f1’ sklearn.metrics.f1_score f1就是F-measure
    ‘precision’ sklearn.metrics.precision_score
    ‘recall’ sklearn.metrics.recall_score
    ‘roc_auc’ sklearn.metrics.roc_auc_score
  Clustering 
    ‘adjusted_rand_score’ sklearn.metrics.adjusted_rand_score
  Regression
     ‘mean_squared_error’ sklearn.metrics.mean_squared_error
    ‘r2’ sklearn.metrics.r2_score
    neg_mean_absolute_error
    neg_mean_squared_error
    neg_median_absolute_error:參考 http://blog.csdn.net/lipe12/article/details/51200510
 
  cv:交叉驗證分割樣本集的策略,默認是3折交叉驗證。For integer/None inputs, if the estimator is a classifier and y is either binary or      multiclass, StratifiedKFold is used. In all other cases, KFold is used
 
   n_jobs:The number of CPUs to use to do the computation. -1 means ‘all CPUs’。
 
  pre_dispatch:控制總執行任務數量,以防止任務數量超過CPU數量,將內存消耗殆盡。
          None:不做任務量限制,任務產生就執行。
          int 值:限制總並行執行的最大任務數。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM