0

기능이 희박한 행렬로 표현 될 때 내 SVM 분류기가 값 오류를 던지지만 피처가 밀도가 높은 표현으로 표시되는 경우 오류가 발생하지 않습니다.Sklearn은 희소 행렬이 주어질 때 ValueError를 throw합니다.

필자는 내 기능 세트에서 하나의 핫 인코딩을 수행하고 인코딩 된 출력을 새로운 기능 목록에 추가하는 코드를 가지고 있습니다. .toarray()를 사용하여 One Hot Encoding의 출력을 고밀도 배열로 변환하면 내 SVM 분류기가 올바르게 실행됩니다.

그러나 밀도가 높은 배열을 사용하면 수천 개의 데이터 포인트가 있고 컴퓨터의 메모리가 매우 빨리 소모되므로 이상적인 것은 아닙니다. 따라서 희소 배열이 필요합니다. 아래의 코드에서 .toarray()를 단순히 제거하면 enc.transform (기능)의 출력이 희소 행렬을 출력합니다. 그러나 SVM 분류자를 실행하면 다음 오류가 표시됩니다.

ValueError : 배열로 배열 요소를 설정합니다.

내 SVM이 데이터에 적합하려고 할 때 뭔가 이상한 것처럼 보입니다. Sklearn SVM은 희소 벡터를 허용하므로 잘못된 점을 이해하지 못합니다.

# Perform One Hot Encoding 
transformedFeatureList = [] 
for features in featureList: 
    features = np.asarray(features) 
    features = features.reshape(1, -1)  
    transformedFeatures = enc.transform(features).toarray() <---Without toarray() the Value Error happens 
    transformedFeatureList.append(transformedFeatures) 
featureList = transformedFeatureList 

# Seperate data into training and testing set 
trainingSet = [[], []] 
testSet = [[], []] 
if len(featureList) == len(classList): 
    for index in range(len(featureList)): 
     if random.randint(1, 10) <= 7: 
      trainingSet[0].append(featureList[index]) 
      trainingSet[1].append(classList[index]) 
     else: 
      testSet[0].append(featureList[index]) 
      testSet[1].append(classList[index]) 

# Train model and attempt classification 
from sklearn import svm 
X = trainingSet[0] 
y = trainingSet[1] 
clf = svm.SVC() 
clf.fit(X, y) 

results = {} 
for iclass in set(classList): 
    results[iclass] = [0, 0]   # index 0 = correct, index 1 = incorrect 
if len(testSet[0]) == len(testSet[1]): 
    for index in range(len(testSet[0])): 
     features = testSet[0][index] 
     iclass = testSet[1][index] 
     predictedClass = clf.predict([features])[0] 

     if predictedClass == iclass: 
      results[iclass][0] += 1 
     else: 
      results[iclass][1] += 1 
+0

전체 코드를 게시하십시오. 우리는 SVM 구현을 어디에 호출해야 하는지를 알아야합니다. – BadZen

+0

좋아요. @BadZen 추가 코드를 추가했습니다. –

+0

나는 인정해야한다. 이것은 추한 코드입니다. 왜 모든 것을 나누고 공동으로합니까? 직접 sklearn의 기능을 사용하는 대신? 배열 접근법의 전체 목록은 나를 긴장시킬 것입니다. 두 방법 모두 clf.fit() 전에 적어도 모양을 출력하십시오. – sascha

답변

0

ValueError의 출처를 찾았습니다. 본질적으로, 나의 "드문 드문 행렬"은 비 합법적이었다.

dense = [[0,0], [1,1], [2,2]] 

합법적 행렬 표현이지만, 같은 희소 행렬을 나타내는 :

sparse = [*sparse1, *sparse2, * sparse3] 

where *sparse represents the output of a function that returns a sparse matrix 

합법적 행렬 표현 아니므로 명백하게 밀도 행렬 표현. 그것은 단순히 행렬의 목록입니다.

내가 찾은 해결책은 scipy.sparse.vstack을 사용하여 스파 스 행을 하나씩 추가하여 전체 희소 행렬을 생성하는 것입니다.