简述机器学习中模型的评估方法


Class Content
layout post
title 简述机器学习中模型的评估方法
categories Blog
description 模型评估方法主要用于对模型的泛化误差进行评估进而选择最优模型,主要的方法有留出法、S折交叉验证法、自助法
keywords 留出法 交叉验证法 自助法,以及对应的代码

1. 前言

机器学习的模型选择指如何从假设空间中选择泛化能力最大的模型,增加训练数据集、加正则项都能有效地抑制过拟合现象,而在实际应用中数据是不充足的,为了选择最优的模型还可以通过交叉验证方法。

交叉验证的思想:重复使用给定的数据,把给定的数据切分为训练集和测试集,在此基础上反复地进行训练、测试以及模型选择。

当然,如果样本数量充足,可以随机地把数据切分成三部分:训练集用来训练模型,验证集用于模型选择合调参,测试集对最终模型的评估。

2. 主要方法

1. 留出法(简单交叉验证)
方法:随机将样本分为测试集和训练集,然后用训练集训练模型,得到训练模型之后,在测试集上评价各个模型的测试误差,再选择测试误差最小的模型。

Note:
a. 训练集和测试集的划分尽量保持数据分布的一致性,避免因为数据划分过程引入额外的偏差,例如在多分类时至少保证样本的类别比例相似,从采样的角度来看待数据划分,采样方式被称为“分层采样”。
b. 使用留出法一般采用若干次随机划分、重复实验评估取平均值,单次使用留出法结果往往不够稳定。

def simple_cross(item, label, k):
    """
    对每类标签随机抽取相同的个数构造成测试集,样本中剩余的数据为训练集,要求数据为数据框结构,且标签的column为"Label"
    :param item: sample data
    :param label:data type of list. 标签名称列表,eg label=[1,2,3,4,5,6]
    :param k: sample number of each label. 每类标签的数量
    :return: train and test data
    """
    label_indexs, all_indexs = {}, []
    for _i in label:
        label_indexs[_i] = []
    for index in item.index:
        label_indexs[item.ix[index, "Label"]].append(index)
    for value in label_indexs.values():
        all_indexs.extend(random.sample(value, k=k))
    test_data = item.ix[all_indexs, ]
    train_data = item.drop(all_indexs)
    return train_data, test_data

2. S折交叉验证
方法:随机将样本拆分成S个互不相交大小相同的子集,然后用S-1个子集作为训练集训练模型,用剩余的子集测试模型,对S中选择重复进行,最终选出S次测评中的平均测试误差最小的模型。

Note:
a. 这种方法用得最多,而交叉验证评估结果的稳定性很大程度取决于S.
b. 与留出法类似,划分为S折存在多种方式,所以为了减小样本划分不同而引入的误差,通常随机使用不同的划分重复P次,即为P次S折交叉验证

def S_cross(item, S):
    """
    将样本数据分为K-折,再将训练集和测试集组合成k组返回.train_test为list类型以元组形式表示
    例如[(test1,train1),(test2,train2),(test3,train),(test4.train4)],注意获取S组训练集和测试集
    :param item: sample data
    :return: S-折 train and test data
    """
    item = shuffle(item)
    k = math.floor(len(item) / S)
    train_test = []
    item_indexs = [item.index[i:i + k, ] for i in range(0, len(item.index)-k, k)]
    for test_index in item_indexs:
        train_test.append((item.loc[test_index], item.drop(test_index)))
    return train_test

3. 留一法
方法:它是S折交叉验证的特殊情况,S=N,其中N为数据容量,划分样本方式唯一。
注:
a. 数据缺乏时使用,当数据集很大时,计算开销很大
b. 由于测试集只有一个样本,所以模型因样本规模不同而导致的估计偏差比前两种小

4. 自助法
方法:以自助采样为基础,对m个样本数据随机挑选1个,放回后再随机挑选1个,重复m次,这样得到了与样本规模一样大小的训练集,测试集中有一部分样本多次出现,有一部分样本不出现,可以做一个简单估计,样本在m次采样中始终没有被采样的\lim\limits_{n \rightarrow +\infty} (1-\frac{1}{m})^m \rightarrow \frac{1}{e} \approx 0.368,即大约36.8%的样本未出现在训练集中,未出现在训练集中的样本组合成测试集。

Note:
a. 自助法在数据较小,难以划分测试集和训练集时有用,从初始数据集中产生多个不同的训练集,这对集成学习等方法有很多好处。
b.缺点:自助法产生的数据集改变了初始数据集的分布,引入估计误差。

def bootstraping(item):
    """
    自助法采样.对数据进行M=len(item.index)有放回采样.最后得到M个训练集,未被采样到的作为测试集
    :param item:sample data
    :return:训练集和测试集
    """
    train_indexs = np.random.choice(item.index, size=len(item.index), replace=True)
    train_data = item.loc[train_indexs, ]
    test_data = item.drop(list(set(item.index) - set(train_indexs)))
    return train_data, test_data
     

总结

划分训练集和测试是机器学习的基础,在这些划分方法中最常用的就是S折交叉验证,为了以后使用方便,我附带了实现函数.

如有疑问,联系dengwenjun818@gmail.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容