【问题标题】:A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array传递了一个稀疏矩阵,但需要密集数据。使用 X.toarray() 转换为密集的 numpy 数组
【发布时间】:2026-01-04 11:20:05
【问题描述】:

代码如下,我正在尝试将训练数据用于 GBRT 回归树,相同的数据适用于其他分类器,但 GBRT 会出现上述错误。请帮忙:

dataset = load_files('train')
vectorizer = TfidfVectorizer(encoding='latin1')
X_train = vectorizer.fit_transform((open(f).read() for f in dataset.filenames)) 
assert sp.issparse(X_train)     
print("n_samples: %d, n_features: %d" % X_train.shape)
y_train = dataset.target
def benchmark(clf_class, params, name):
    clf = clf_class(**params).fit(X_train, y_train)

【问题讨论】:

  • 如果您使用GradientBoostingRegressor,它不接受稀疏矩阵作为输入。
  • 我使用 arX = np.array(X_train) 转换。但现在错误显示“元组索引超出范围”
  • 按照错误中的说明进行操作。 Use X.toarray() to convert to a dense numpy array。所以X_train.toarray()
  • 'numpy.ndarray'(X_train 的类型)对象没有属性'toarray'

标签: python scikit-learn


【解决方案1】:

OneHotEncoder 的最新版本不再支持 sklearn 库。代码修改为用户ColumnTransformer

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([('town', OneHotEncoder(), [0])], remainder = 'passthrough')

X = ct.fit_transform(X)

【讨论】:

    【解决方案2】:

    我在尝试使用load_svmlight_files 加载的数据训练GradientBoostingClassifier 时遇到了同样的问题。通过将稀疏矩阵转换为 numpy 数组来解决。

    X_train.todense()
    

    【讨论】:

      【解决方案3】:

      因为 sklearn 请求 X(训练数据)中的 GBRTarray-like 而不是 sparse matrixsklearn-gbrt

      希望对你有帮助!

      【讨论】:

      • 我使用 arX = np.array(X_train) 转换。但现在错误显示“元组索引超出范围”-
      • X_train 是 scipy.sparse.coo_matrix 不是原生 python 中的 list
      • 我正在从 转换为 仍然给出元组错误。
      • 很好 np.array(X_train) 不转换。它将稀疏矩阵包装成一个 1x1 的 dtype 对象数组。你看过错误信息了吗?
      • 没有报错!什么是我可以在 GBRT 分类器中使用 sparce.csr_matrix 的最佳方式..?如何将其转换为密集数组数据?