TruncatedSVD仅接受scipy.sparse.spmatrix(如csr_matrix),若输入pandas.DataFrame或numpy.ndarray会悄默调用.toarray()致OOM;须用isinstance(X, scipy.sparse.spmatrix)严格校验,TfidfVectorizer输出默认合规。
TruncatedSVD 为什么不能直接喂 pandas.DataFrame 或 numpy.ndarray
它不会报错,但会悄悄调用
,把百万列的稀疏表示转成全内存稠密数组——结果是进程卡死或 OOM。关键在于
只接受
,比如
或
。
检查方式必须用:
,而不是看 shape 或 dtype。
常见来源如
默认返回
,可直传
若手头是
,别用
;先确认是否真稀疏(非零占比 scipy.sparse.csr_matrix(df.values)
CSV/Parquet 数据:避免
→ 改用
(Matrix Market 格式)或分块用
如何设置 n_components 才不崩也不浪费
设太高会触发
,设太低则丢失信息;它不是 PCA 那种“累计方差”可线性推算的指标,
是近似值,仅作趋势参考。
安全上限参考:
,尤其当
≥ 10⁵ 时务必保守
实操路径:从
开始,逐步加到 300,观察
增长是否明显放缓
底层依赖 ARPACK/LOBPCG,对维度敏感;
确定性强但只适合小
(一般 ≤ 200);
快但需固定
防止训练/推理漂移
transform 报错 ValueError: X has N features, but TruncatedSVD is expecting M features 怎么办
这不是数据问题,是特征空间没对齐。TruncatedSVD 对输入维度零容忍——训练时看到 100000 列,预测时哪怕少一列、多一列都直接炸。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
根本原因:新文档未复用训练时的
,或用了不同
/
参数重新拟合
解决办法:保存并复用 fitted vectorizer,例如
,预测前先
注意:即使词表一致,若用
训练、
预测,某些旧版 scikit-learn 也会静默失败,统一用
初始化更稳
降维后还是稀疏,但下游模型报 A sparse matrix was passed, but dense data is required
这是设计使然:
默认返回
,省内存、快计算,但并非所有模型都支持稀疏输入。
支持稀疏的模型(可跳过转换):
、
、
不支持的模型(如
):必须显式转稠密,但
可能再次爆内存
更稳妥做法:
,同时限制
和 dtype 双重控内存
终极建议:用
封装
+ 模型,让 pipeline 自动处理中间格式流转
降维本身不难,难的是全程守住稀疏性边界——从输入检查、参数试探、特征对齐到下游适配,任何一环松动,都会在某个深夜让你面对一个安静卡住的 Python 进程和一行看不出错在哪的 warning。
.toarray()TruncatedSVDscipy.sparse.spmatrixcsr_matrixcsc_matrixisinstance(X, scipy.sparse.spmatrix)TfidfVectorizer.fit_transform(docs)scipy.sparse.csr_matrixpd.DataFrame.valuespandas.read_csv().valuesscipy.io.mmread()HashingVectorizern_componentsArpackNoConvergenceexplained_variance_ratio_min(1000, int(0.1 * min(X.shape)))X.shape[1]n_components=100svd.explained_variance_ratio_algorithm='arpack'n_componentsalgorithm='randomized'random_stateTfidfVectorizer.vocabulary_max_featuresstop_wordsjoblib.dump(vectorizer, 'tfidf.pkl')vectorizer.transform(new_docs)dtype=np.float64float32dtype=np.float32TruncatedSVD.transform()scipy.sparse.csr_matrixLogisticRegressionSGDClassifierLinearSVCRandomForestClassifierX_reduced.toarray()np.ascontiguousarray(X_reduced.toarray(), dtype=np.float32)n_componentssklearn.pipeline.PipelineTruncatedSVD