您的位置:首页 > 其它

西瓜书《机器学习》学习笔记--模型评估及选择(二) 留出法

2018-01-23 21:24 417 查看

前言

 在现实任务中,我们往往有多种学习算法可供选择,甚至对于同一学习算法,不同参数都会有截然不同的结果;那么我们应该如何选择模型呢?既然需要选择模型,那么肯定需要通过一定的指标方法取评估一个模型的好坏,这就是这一篇文章的内容。评估方法有不少,很重要的内容就是划分训练集及测试集,通常我们在开始选取模型之前,已经拿到带标签的样本数据,为了评估一个模型的好坏,需要将样本数据分为两部分:训练集和测试集,训练集用来fit模型,然后拿测试集验证,根据最后得出的性能度量数据区分模型好坏。

留出法

评估方法中比较简单的一种是留出法,“留出法”直接将样本数据划分成两个互斥的集合,其中一个作为训练集S,另一个作为测试集T;划分比例是一个难点,如果S中样本较少,无法较好的代表样本全集D,得到的模型可能不准确;如果T中样本数比较少,评估结果可能就不具有代表性;一般划分2/3~4/5的样本用于训练。划分方法是进行采样,按照“分层采样”的规则,训练集和测试集中正例和反例的分布必须和样本总数中分布一致,以最大限度保证数据无偏差。即假设100个样本,其中正例40个,反例60个,取30个作为测试集,那么测试集S中必须有12个是正例,18个是反例。在留出法这种情况下,有一个问题划分具有随机性对于评估结果有所影响,多次得到的结果可能有比较大的差异,为了避免这个问题,往往随机划分多次,取最后平均值作为评估结果。

代码实现

import random

# 分层
def layered(data_set):
n = len(data_set[0])

classifications = {}

# 遍历数据集,获取分布情况
for data in data_set:
classification_list = []
label = data[n-1]
if classifications.__contains__(label):
classification_list = classifications[data[n-1]]
else:
classifications[label] = classification_list
classification_list.append(data)

return classifications

# 留出法
def hold_out(data_set, scale):

classifications = layered(data_set)
s = []
t = []

for label in classifications.keys():
classification_list = classifications.get(label)
m = len(classification_list)
for count in range(int(scale*m)):
random_pos = random.randint(0, m-1)
data = classification_list[random_pos]
s.append(data)
classification_list.remove(data)
t = t +classification_list
return (s, t)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: