2

StratifiedShuffleSplitXが配列ではなく、スパース行列である例を複製しようとしています。以下の例では、この行列は、DictVectorizer名目上の特徴と数値的な特徴が混在する配列への近似によって作成されました。

from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import LabelEncoder
from sklearn.cross_validation import StratifiedShuffleSplit

X = [{"a":1, "b":"xx"}, {"a":2, "b":"yx"}, {"a":2, "b":"yx"}, {"a":1, "b":"xx"}]
y = ["A", "B", "B", "A"]

X = DictVectorizer().fit_transform(X)
y = LabelEncoder().fit_transform(y)

sss = StratifiedShuffleSplit(y, 3, test_size=0.5, random_state=0)

for train_index, test_index in sss:
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

スクリプトを実行すると、次のエラーがスローされます。

Traceback (most recent call last):
  File ".../test.py", line 22, in <module>
    X_train, X_test = X[train_index], X[test_index]
TypeError: only integer arrays with one element can be converted to an index

これは、Xが配列ではなく、スパース行列であるためです。したがって、問題は、Xが配列ではなく行列である場合に、このメソッドを使用してデータを分割するにはどうすればよいかということです。おそらく問題はscikit-learnではなく、numpyですか?Xに「適用」する前にtrain_indextest_indexを「変換」する必要がありますか?または、代わりにXを「変換」する必要がありますか?

StratifiedShuffleSplitのドキュメントによると、行列で機能するには、パラメータインデックスにTrueを渡す必要がありますが、役に立ちません。

あなたが私に与えることができるどんな提案も大歓迎です。

4

3 に答える 3

5

この問題は、ご使用のバージョンのscikit-learnで、行ごとにインデックス付けできないCOOマトリックスが返されるという事実が原因ですDictVectorizer(残念ながら、scipyエラーメッセージはあまり明確ではありません)。この問題を修正するには、次の行を置き換えて、ベクトル化された出力をCSR形式に変換します。

X = DictVectorizer().fit_transform(X)

X = DictVectorizer().fit_transform(X).tocsr()
于 2012-10-03T08:42:38.967 に答える
2

ドキュメントで指定されているようにに渡すindices=True必要があります。StratifiedShuffleSplit

于 2012-10-03T09:14:51.850 に答える
0

Pythonでスパース行列を分割してシャッフルする方法を説明できます。mybeは次のことに役立ちます。

def splitSparseMatrix(matrix):
    trainingSet =  matrix[:trainingSetSize,:]
    testSet = matrix[-testSetSize:,:]
    return trainingSet, testSet

def shuffleSparseMatrix(smatrix):
    indexList = np.arange(np.shape(matrix)[0])
    np.random.shuffle(indexList)
    return matrix[indexList, :]
于 2012-10-02T19:08:14.480 に答える