我试图复制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 ,但它不会没帮忙。
任何你能给我的建议都会受到欢迎。
答案 0 :(得分:5)
问题是由于你的scikit-learn DictVectorizer
版本返回的COO矩阵不是行可索引的(不幸的是,scipy错误消息不是非常明确)。要解决此问题,请通过替换以下行来将矢量化输出转换为CSR格式:
X = DictVectorizer().fit_transform(X)
通过
X = DictVectorizer().fit_transform(X).tocsr()
答案 1 :(得分:2)
您必须按指定in the docs将indices=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, :]