当特征用稀疏矩阵表示时,我的SVM分类器抛出一个值错误,但如果特征用密集矩阵表示则没有错误。
我的代码在我的功能集上执行一个热编码,并将编码的输出添加到一个新的功能列表中。当使用.toarray()将One Hot Encoding的输出转换为密集数组时,我的SVM分类器运行良好。
然而,使用密集数组是不理想的,因为我有成千上万的数据点,我的计算机很快就会耗尽内存。因此,需要稀疏数组。如果我简单地从下面的代码中删除.toarray(),则en .transform(features)的输出将输出一个稀疏矩阵。然而,如果我运行我的SVM分类器,我现在得到以下错误:
ValueError:用序列设置数组元素
当我的支持向量机试图拟合数据时,似乎有些东西失败了。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
我找到了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逐个添加稀疏行,以创建我想要的总稀疏矩阵。