0

当使用稀疏矩阵表示要素时,我的SVM分类器将引发值错误,但如果要素使用密集矩阵表示,则不会发生错误。当给定稀疏矩阵时,Sklearn抛出ValueError

我的代码在我的功能集上执行一个热门编码,并将编码后的输出添加到新的功能列表中。当使用.toarray()将One Hot Encoding的输出转换为密集数组时,我的SVM分类器运行良好。

但是,使用密集阵列并不理想,因为我有数千个数据点,而且我的计算机很快就会耗尽内存。因此,需要稀疏数组。如果我从下面的代码中简单地删除.toarray(),enc.transform(features)的输出将输出一个稀疏矩阵。但是,如果运行我的SVM分类器,现在出现以下错误:

ValueError:使用序列设置数组元素。

当我的SVM尝试适合数据时,似乎有什么失败。 Sklearn支持向量机接受稀疏向量,所以我不明白发生了什么问题。

# 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逐个添加稀疏行来创建我要使用的总稀疏矩阵。