2016-09-01 8 views
0

데이터 피클에 교육 데이터 세트를 저장해야합니다. 여기에 코드가 있습니다. 이 코드를 실행하면 오류가 발생했습니다. 이 오류를 수정하려면 어떻게합니까? featureCounts 및 labelCounts 변수를 두 피클에 저장해야합니다.Python의 데이터 피클 오류

from __future__ import division 
import collections 
import math 
import pickle 

class TrainClassifier: 
    def __init__(self, arffFile): 
     self.trainingFile = arffFile 
     self.features = {} 
     self.featureNameList = [] 
     self.featureCounts = collections.defaultdict(lambda: 1) 
     self.featureVectors = [] 
     self.labelCounts = collections.defaultdict(lambda: 0) 

    def DataTraning(self): 
     for fv in self.featureVectors: 
      self.labelCounts[fv[len(fv)-1]] += 1 #udpate count of the label 
      for counter in range(0, len(fv)-1): 
       self.featureCounts[(fv[len(fv)-1], self.featureNameList[counter], fv[counter])] += 1 

     for label in self.labelCounts: 
      for feature in self.featureNameList[:len(self.featureNameList)-1]: 
       self.labelCounts[label] += len(self.features[feature]) 

    def GetValues(self): 
     file = open(self.trainingFile, 'r') 

     for line in file: 
      if line[0] != '@': #start of actual data 
       self.featureVectors.append(line.strip().lower().split(',')) 
      else: #feature definitions 
       if line.strip().lower().find('@data') == -1 and (not line.lower().startswith('@relation')): 
        self.featureNameList.append(line.strip().split()[1]) 
        self.features[self.featureNameList[len(self.featureNameList) - 1]] = line[line.find('{')+1: line.find('}')].strip().split(',') 

     file.close() 

    def SaveOnPickle(self): 
     f = open('dict.pickle', 'wb') 
     pickle.dump(self.labelCounts, f) 
     f.close() 

if __name__ == "__main__": 
    Predic = TrainClassifier("Military.arff") 
    Predic.GetValues() 
    Predic.DataTraning() 
    Predic.SaveOnPickle() 

는 여기에 lambda와 오류

Traceback (most recent call last): 
    File "C:\wamp64\www\M360\M360py\src\TrainClassifier.py", line 69, in <module> 
    Predic.SaveOnPickle() 
    File "C:\wamp64\www\M360\M360py\src\TrainClassifier.py", line 43, in SaveOnPickle 
    pickle.dump(self.labelCounts, f) 
    File "C:\Users\Udara\AppData\Roaming\NetBeans\8.1\jython-2.7.0\Lib\pickle.py", line 1370, in dump 
    Pickler(file, protocol).dump(obj) 
    File "C:\Users\Udara\AppData\Roaming\NetBeans\8.1\jython-2.7.0\Lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "C:\Users\Udara\AppData\Roaming\NetBeans\8.1\jython-2.7.0\Lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Users\Udara\AppData\Roaming\NetBeans\8.1\jython-2.7.0\Lib\pickle.py", line 401, in save_reduce 
    save(args) 
    File "C:\Users\Udara\AppData\Roaming\NetBeans\8.1\jython-2.7.0\Lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Users\Udara\AppData\Roaming\NetBeans\8.1\jython-2.7.0\Lib\pickle.py", line 562, in save_tuple 
    save(element) 
    File "C:\Users\Udara\AppData\Roaming\NetBeans\8.1\jython-2.7.0\Lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Users\Udara\AppData\Roaming\NetBeans\8.1\jython-2.7.0\Lib\pickle.py", line 746, in save_global 
    raise PicklingError(
pickle.PicklingError: Can't pickle <function <lambda> at 0x5>: it's not found as __main__.<lambda> 
+0

정확한 복제본은 아닙니다. 이 특별한 경우에는 함수를 직렬화 할 필요가 없었으므로보다 간단한 솔루션을 사용할 수있었습니다. 흥미로운 링크 질문/답변! –

답변

1

그것이 defaultdict (즉, 아무 문제가) 있기 때문에 당신이 self.labelCounts를 직렬화 할 수 있습니다 : 여기 캐치 : 피클이 기능을 직렬화 수 없습니다.

당신이 쓴 :

self.labelCounts = collections.defaultdict(lambda: 0) 

하지만 당신은 운이 : 당신은 할 (당신은 아무 문제 목록과 같은하지만 0으로 변경 가능한 객체에 대한 람다 필요) 여기 람다 필요하지 않습니다 :

self.labelCounts = collections.defaultdict(0) 

(물론 다른 문제는 해결할 수 있습니다. featureCounts). 다음과 같이하십시오 :

self.featureCounts = collections.defaultdict(1) 
+0

featureCounts도 저장해야합니다. 나는 또한 그것으로부터 람다를 제거 할 수 있습니까? 변수에 람다를 사용하는 이유는 무엇입니까? –

+0

해결책을 시도 할 때 이와 같은 오류가 발생합니다. '역 추적 (가장 최근 통화 최종) : 파일 "C : \ wamp64 \ www가 \ M360 \ M360py \ SRC \ TrainClassifier.py", 라인 (66), Predic = TrainClassifier에서 ("C :/사용자/Udara/ 파일 "C : \ wamp64 \ www \ M360 \ M360py \ src \ TrainClassifier.py", 줄 14, __init__에있는 파일 self.featureCounts = 데스크탑/CDAP/박물관 360 (시스템) /Nadeeraka/Dataset/Military.arff " TypeError : 첫 번째 인수는 호출 가능해야 함' –

+0

'self.featureCounts = collections.defaultdict (1) self.labelCounts = collections.defaultdict (0)' 다음 코드는 내가 대체 한 코드입니다. 내 코드. 그러나이 코드에 위의 오류도 발생했습니다 –