機能が疎行列で表現されているときに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
完全なコードを投稿してください。あなたはSVMの実装をどこに呼び出すべきかを知る必要があります。 – BadZen
いいえ@BadZen追加のコードを追加しました。 –
私は認めなければなりません。これは醜いコードです。なぜ分裂して、すべてのことを行うのですか? sklearnの関数を使うのではなく、手作業で行うのですか?配列のアプローチのリスト全体が私を緊張させるだろう。両方の方法でclf.fit()の前に少なくともシェイプを出力してください。 – sascha