我正面临机器学习问题;学习数据包括数字,分类和日期。我仅根据数字和日期开始训练(我使用纪元,星期几,小时等将其转换为数字)。除了得分很低之外,性能也非常好(接受一百万次培训的秒数)。
问题出在分类器上,大多数分类值高达数千。
值包括设备品牌,注释等,并且是人为输入的,因此我认为它们之间有很多相似之处。为了获得可行性(训练时间),我可以通过数据(高分)牺牲一些真实世界的表现。
编程挑战:我从这个nice performance analysis
想到了这一点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 gig 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