【问题标题】:Sklearn throws ValueError when given a sparse matrix给定稀疏矩阵时,Sklearn 会抛出 ValueError
【发布时间】:2017-03-28 13:12:47
【问题描述】:

当特征用稀疏矩阵表示时,我的 SVM 分类器会抛出值错误,但如果特征用密集矩阵表示则不会出错。

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

但是,使用密集数组并不理想,因为我有数千个数据点,而且我的计算机很快就会耗尽内存。因此,需要稀疏数组。如果我只是从下面的代码中删除 .toarray() ,则 enc.transform(features) 的输出将输出一个稀疏矩阵。但是,如果我运行我的 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

【问题讨论】:

  • 请发布您的完整代码。我们需要查看您在哪里调用 SVM 实现。
  • 好的 @BadZen 我添加了附加代码。
  • 我不得不承认。这是丑陋的代码。为什么要做所有的分裂和合作。手动而不是使用sklearn的功能?数组方法的整个列表会让我感到紧张。对于这两种方法,至少打印出 clf.fit() 之前的形状。
  • 拆分和合并是什么意思?
  • 什么是完整的堆栈跟踪/错误发生在哪一行?

标签: machine-learning scikit-learn svm sparse-matrix one-hot-encoding


【解决方案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 将稀疏行一一添加,以创建我想要的总稀疏矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 2019-07-04
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多