使用StratifiedShuffleSplit和稀疏矩阵

fer*_*vam 1 python numpy classification scikit-learn

我试图复制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]
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,抛出以下错误:

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
Run Code Online (Sandbox Code Playgroud)

这是因为X不是数组而是稀疏矩阵.所以问题是,当X不是数组而是矩阵时,如何使用此方法拆分数据?也许这个问题不是特定的scikit-learn,而是numpy?在将它们"应用"到X之前,我是否必须"转换" train_indextest_index?或许我必须"改造" X而不是?

根据StratifiedShuffleSplit的文档,为了使用矩阵,我应该将True传递给参数索引,但它没有帮助.

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

ogr*_*sel 5

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

X = DictVectorizer().fit_transform(X)
Run Code Online (Sandbox Code Playgroud)

通过

X = DictVectorizer().fit_transform(X).tocsr()
Run Code Online (Sandbox Code Playgroud)