0

我正面临机器学习问题;学习数据由数字、分类和日期组成。我开始仅基于数字和日期进行训练(我使用纪元、工作日、小时等转换为数字......)。除了分数很差之外,性能非常好(一百万次训练的秒数)。

问题在于大多数值高达数千的分类。

值包括设备品牌、评论等,并且是人工输入的,所以我认为有很多相似之处。为了可行性(训练时间),我可以通过数据(hense 分数)牺牲一些真实世界的表示。

编程挑战:我从这个不错的性能分析中想到了这个

import difflib

def gcm1(strings):
    clusters = {}
    co = 0
    for string in (x for x in strings):
        if(co % 10000 == 0 ):
            print(co)
        co = co +1    
        if string in clusters:
            clusters[string].append(string)
        else:
            match = difflib.get_close_matches(string, clusters.keys(), 1, 0.90)
            if match:
                clusters[match[0]].append(string)
            else:
                clusters[string] = [ string ]
    return clusters

def reduce(lines_):
    clusters = gcm1(lines_)
    clusters = dict( (v,k) for k in clusters for v in clusters[k] )
    return [clusters.get(item,item) for item in lines_]

示例如下:

reduce(['XHSG11', 'XHSG8', 'DOIIV', 'D.OIIV ', ...] 
=> ['XHSG11', 'XHSG11', 'DOIIV', 'DOIIV ', ...] 

我非常依赖 Python,所以我无法运行其他 C 实现的代码。显然,每次迭代中的函数 difflib.get_close_matches 是最贪婪的。

有更好的选择吗?还是我算法的更好方法?

正如我在百万条目上所说的那样,假设 10 列,我什至无法估计算法何时停止(超过 3 小时并且仍在我的 16 gigs RAM 和 i7 4790k CPU 上运行)

数据就像(摘录):

    Comments:  [nan '1er rdv' '16H45-VE' 'VTE 2016 APRES 9H'
     'ARM : SERENITE DV. RECUP.CONTRAT. VERIF TYPE APPAREIL. RECTIF TVA SI NECESSAIRE']
    422227 different values

    MODELE_CODE:  ['VIESK02534' 'CMA6781031' 'ELMEGLM23HNATVMC' 'CMACALYDRADELTA2428FF'
     'FBEZZCIAO3224SVMC']
    10206 values

    MARQUE_LIB:  ['VIESSMANN' 'CHAFFOTEAUX ET MAURY' 'ELM LEBLANC' 'FR BG' 'CHAPPEE']
    167 values 
... more columns
4

0 回答 0