使用StratifiedShuffleSplit和稀疏矩阵

时间:2012-10-02 18:48:21

标签: python numpy scikit-learn classification

我试图复制StratifiedShuffleSplit的示例,其中X不是数组而是稀疏矩阵。在下面的示例中,此矩阵是通过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_index test_index ?或者我可能需要“转换” X

根据 StratifiedShuffleSplit 的文档,为了使用矩阵,我应该将 True 传递给参数 indices ,但它不会没帮忙。

任何你能给我的建议都会受到欢迎。

3 个答案:

答案 0 :(得分:5)

问题是由于你的scikit-learn DictVectorizer版本返回的COO矩阵不是行可索引的(不幸的是,scipy错误消息不是非常明确)。要解决此问题,请通过替换以下行来将矢量化输出转换为CSR格式:

X = DictVectorizer().fit_transform(X)

通过

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

答案 1 :(得分:2)

您必须按指定in the docsindices=True传递给StratifiedShuffleSplit

答案 2 :(得分: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, :]