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传递给参数indices,但这没有帮助。

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

4

3 回答 3

5

问题是由于在您的 scikit-learn 版本中DictVectorizer返回的 COO 矩阵不能按行索引(不幸的是,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 回答