Skip to main content
 首页 » 编程设计

python之将 StratifiedShuffleSplit 与稀疏矩阵一起使用

2025年05月04日15rubylouvre

我正在尝试复制 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,但它没有'帮助。

我们非常欢迎您给我任何建议。

请您参考如下方法:

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

X = DictVectorizer().fit_transform(X) 

通过

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