Python中用于列车、验证和测试中最优拆分的算法

2024-10-02 02:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图优化样本在训练集、验证集和测试集中的分布,例如80%、10%、10%。具体问题出现在这些通用依赖集的构造中,即says:“如果树库包含运行文本(而不是随机混叠的句子),请确保在文档边界上拆分数据。”我已经研究了关于样本分布的quite{a3}{a4}{a5},但它们似乎都基于随机性

下面是我80个样本的实际数据:

split=[10,10,80]
file2len = {'f0': 2472, 'f1': 1480, 'f2': 592, 'f3': 1439, 'f4': 2310, 'f5': 2081, 'f6': 2201, 'f7': 2647, 'f8': 1998, 'f9': 861, 'f10': 2373, 'f11': 1473, 'f12': 475, 'f13': 2227, 'f14': 3117, 'f15': 2461, 'f16': 880, 'f17': 2781, 'f18': 1041, 'f19': 1620, 'f20': 1294, 'f21': 2274, 'f22': 2640, 'f23': 1920, 'f24': 1756, 'f25': 1476, 'f26': 1675, 'f27': 1484, 'f28': 1432, 'f29': 872, 'f30': 951, 'f31': 1175, 'f32': 655, 'f33': 642, 'f34': 1905, 'f35': 1078, 'f36': 950, 'f37': 1684, 'f38': 1140, 'f39': 1045, 'f40': 771, 'f41': 1035, 'f42': 694, 'f43': 1730, 'f44': 1105, 'f45': 932, 'f46': 1437, 'f47': 2678, 'f48': 1883, 'f49': 1807, 'f50': 951, 'f51': 1924, 'f52': 1417, 'f53': 1739, 'f54': 1902, 'f55': 1950, 'f56': 1959, 'f57': 1630, 'f58': 1588, 'f59': 784, 'f60': 1475, 'f61': 1765, 'f62': 3996, 'f63': 1345, 'f64': 1330, 'f65': 579, 'f66': 1989, 'f67': 806, 'f68': 1301, 'f69': 1888, 'f70': 1380, 'f71': 786, 'f72': 1650, 'f73': 2723, 'f74': 1648, 'f75': 1378, 'f76': 1274, 'f77': 1458, 'f78': 529, 'f79': 2939}
totalt=sum(file2len.values())

下面是我使用的分布函数:

import random
def makedevtraintest(file2len, totalt, split):
    splitfiles=[]
    actualdistri=[]
    infilelist=list(file2len.keys())
    for spli in split:
        already=0
        thisselection=[]
        goal=spli/100*totalt
        while already<goal and infilelist:
            f = random.choice(infilelist)
            already+=file2len[f]
            infilelist.remove(f)
            thisselection+=[f]
        actualdistri+=[already]
        splitfiles+=[thisselection]
    assert infilelist==[]
    return splitfiles, actualdistri

然后我称之为暴力10000次以获得最佳分发:

minidis = 100
for i in range(10000):
    splitfiles, actualdistri = makedevtraintest(file2len, totalt, split)
    dis = abs(actualdistri[-1]/totalt*100-split[-1])        
    if dis<minidis:
        optisplitfiles, optiactualdistri = splitfiles, actualdistri
        minidis=dis
        print('yay',i,dis,[t/totalt for t in actualdistri])
print([t/totalt for t in optiactualdistri])

这会产生相当不错的结果: [0.10004576586813117, 0.10002209386737367, 0.7999321402644951] (虽然我的算法只会在最后一个样本集未满时产生结果,<;80%)

我想知道是否有一种非指数算法可以找到最优分布,一种最接近80,10,10的算法。这看起来像是算法中的一个常见问题,但我无法找到正确的搜索词来找到它


Tags: 数据in算法forsplit样本disalready

热门问题