【问题标题】:Using StratifiedShuffleSplit with sparse matrix使用带有稀疏矩阵的 StratifiedShuffleSplit
【发布时间】:2012-09-23 15:57:39
【问题描述】:

我正在尝试复制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_indextest_index?或者也许我必须“改造”X

根据 StratifiedShuffleSplit 的文档,为了让它与矩阵一起使用,我应该将 True 传递给参数 indices,但它没有没救了。

欢迎您给我任何建议。

【问题讨论】:

    标签: python numpy scikit-learn classification


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      X = DictVectorizer().fit_transform(X)
      

      通过

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

      【讨论】:

      • 另请注意:在 scikit-learn master 上,DictVectorizer 现在默认返回 CSR。
      【解决方案3】:

      我可以告诉你如何在 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, :]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        • 2018-01-19
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多