首页 文章

给定稀疏矩阵时,Sklearn会抛出ValueError

提问于
浏览
0

当使用稀疏矩阵表示要素时,我的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

1 回答

  • 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逐个添加稀疏行来创建我想要的总稀疏矩阵 .

相关问题