2012-10-02 57 views
1

我想複製StratifiedShuffleSplit的例子,X不是一個數組,而是一個稀疏矩陣。在下面的例子中,這個矩陣是由一個DictVectorizer擬合到一個混合名義和數字特徵的數組。使用StratifiedShuffleSplit與稀疏矩陣

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不是數組而是矩陣時,如何使用這種方法拆分數據?也許這個問題不是專門學習的,但是不是很規範?在將它們「應用」到X之前,是否必須「變換」train_indextest_index?或者,也許我必須「變形」X而不是?

文檔StratifiedShuffleSplit,它與矩陣工作,我應該通過的參數指數,但它並不能幫助。

任何建議,你可以給我將是多餘的歡迎。

回答

5

的問題是由一個事實,即在你的版本scikit學習DictVectorizer回報COO矩陣造成的不是按行索引的(scipy錯誤信息不是非常明確)。要解決這個問題,通過更換線轉換矢量輸出中,以CSR格式:

X = DictVectorizer().fit_transform(X) 

通過

X = DictVectorizer().fit_transform(X).tocsr() 
+1

另請注意:在scikit-learn master上,DictVectorizer現在默認返回CSR。 – ogrisel

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, :] 
1

你必須按指定in the docs通過indices=TrueStratifiedShuffleSplit