0

機能が疎行列で表現されているときにSVM分類器が値エラーをスローしますが、機能が密集して表現されるとエラーは発生しません。Sklearnが疎行列を与えられたときにValueErrorをスローする

私は自分のフィーチャセットでOne Hot Encodingを実行し、エンコードされた出力を新しいフィーチャのリストに追加するコードを持っています。 1つのホットエンコーディングの出力が.toarray()を使用して密な配列に変換されると、私の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 
+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を使用してスパース行を1つずつ追加して、私が行っていた総スパース行列を作成することです。

関連する問題