• 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 值:限制总并行执行的最大任务数。

      

  • 相关阅读:
    Java中RuntimeException和Exception
    RuntimeException和Exception的区别
    Spring事务异常回滚
    iOS 卖票中多线程分析;
    凝视转换(部分)
    HDU 5386 Cover(模拟)
    iOS开发之软键盘使用小技巧
    【每日算法】高速幂
    CKEditor高级编辑器
    iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)
  • 原文地址:https://www.cnblogs.com/gczr/p/6807339.html
Copyright © 2020-2023  润新知