09 - 交叉验证&召回率&正则化

介绍

在我们构建机器学习模型的时候,一般会将一堆数据进行拆分,例如:将数据中80%的作为训练集,取另外20%作为最后的测试集
其中意思就是使用80%的数据来建立模型,使用剩下20%来进行验证这个模型,但是这里需要注意的是着20%的数据集是用来最后进行验证的
对于前面80%的数据在进行建立模型的时候,也是需要进行随机切分成三份的,首先使用第一和第二份数据进行建模,使用第三份数据进行验证;再使用第一份和第三份数据进行建模,使用第二份数据进行验证;最后使用第二份和第三份数据进行建模,使用第一份数据进行验证,这里说到的是验证集

sklearn.cross_validation

在使用代码的时候,我们可以使用sklearn中间的cross_validation.train_test_split的方法进行数据集的拆分
在这里插入图片描述
train_test_split()是sklearn包的model_selection模块中提供的随机划分训练集和测试集的函数
原型为:train_test_split(test_size,train_size,random_state=None,shuffle=True,stratify=None)
参数:
test_size:测试集大小。如果为浮点数,则在0.0到1.0之间,代表测试集的比例;如果为整数型,则为测试集样本的绝对数量;如果没有,则为训练集的补充。默认情况下,值为0.25
train_size:训练集大小,如果为浮点数,则在0.0到1.0之间,代表测试集的比例;如果为整数型,则为测试集样本的绝对数量;如果没有,则为测试集的补充
random_state:指定随机方式。一个整数或者RandomState实例,或者None。如果为整数,则它可以指定了随机数生成器的种子;如果是RandomState实例,则指定了随机生成器;如果为None,则使用默认的随机生成器,随机选择一个种子
shuffle:布尔值,是否在拆分前重组数据。如果shuffle=False,则stratify必须为None
stratify:array-like or None,如果不是None,则数据集以分层方式拆分,并使用此作为标签
返回值:拆分得到的train和test数据集

模型评估标准

通常情况下,我们会使用精度来进行评估一个模型是否好,但是也是存在单纯使用精度进行评估的时候并不能说明这个模型好,例如:我们需要评估一个人是否患有癌症,首先我们获取医院里面1000个人作为样本数据,中间990人都是没有患癌症的,仅仅存在10个人是患有癌症的,此时对这这些人进行建模,抽取了990人进行评估,都是正常的,单纯看精度的话可能就是99%,但是在这99%中间并没有一个是患有癌症的,这样的精度并没有任何的意义

recall

更多的被使用
召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN)=TP/P=sensitive
例如存在有10个患有癌症的,通过建模能够找到中间的2个,这样召回率就是20%
在这里插入图片描述
在这里插入图片描述

过拟合

通常在进行机器学习的时候会碰到这样的情况,在训练集中间拟合的比较好,但是到了测试集上面拟合的并不好,这样的情况就是过拟合

正则化

前面讲到了交叉验证,使用到交叉验证的时候,会得到多组不同的参数值集合,当这些参数值在训练集中间都能够达到一个较高的拟合情况下,如何进行选择呢?可以先将所有的参数进行视图话,观察分布的情况,如果分布的情况跨度比较大,这样的参数一般情况下是不应用的;一般过拟合的情况就是由于使用的这样的参数的,应该尽量选择分布比较均匀的参数集
在这里插入图片描述
如上图,可以看到A模型中间的参数分布比较大,B模型中间的参数分布比较小,这样的情况下,我们希望对A模型的惩罚力度较大,对B模型的惩罚力度较小
L2正则化:loss + 1/2 * w^2
对于上面的L2正则化,我们在其前面还可以加上一个惩罚力度c,这个值可以自行选择,一般为[0.01,0.1,1,10,100]中间选择

猜你喜欢

转载自blog.csdn.net/Escid/article/details/90896585
09