随机投影已拟合,取特征名却报 auto 不是整数:检查 n_components
scikit-learn1.9.1的随机投影在auto模式下已得到n_components_,输出特征计数却仍保存字符串auto,导致特征名和pandas输出报错。可按同一规则显式计算整数维数。
随机投影已经拟合,n_components_ 也是整数,调用 get_feature_names_out() 却报 TypeError: 'str' object cannot be interpreted as an integer。如果构造时保留默认的 n_components="auto",应检查输出特征计数是否误用了构造参数。
scikit-learn 1.9.1 的 GaussianRandomProjection 和 SparseRandomProjection 共用这条拟合逻辑:生成矩阵使用算出的 n_components_,输出名称计数却保存了字符串 "auto"。请求 pandas 输出时,也可能在包装结果、生成列名的阶段失败;这不表示投影矩阵本身一定没有生成。
用相同规则显式计算整数维数
应用需要保留自动维数的理论选择规则时,可以在创建估计器前,根据当前拟合样本数和同一个 eps 计算整数:
import numpy as np
from sklearn.random_projection import (
GaussianRandomProjection,
johnson_lindenstrauss_min_dim,
)
X = np.random.RandomState(0).rand(10, 1000)
eps = 0.5
components = int(johnson_lindenstrauss_min_dim(n_samples=X.shape[0], eps=eps))
if not 0 < components <= X.shape[1]:
raise ValueError("projection dimension must fit this input")
projection = GaussianRandomProjection(
n_components=components, eps=eps, random_state=0
)
projection.set_output(transform="pandas")
transformed = projection.fit_transform(X)
names = projection.get_feature_names_out()
示例需安装兼容的 pandas;它以当前 X 的样本数计算维数,不是推荐所有业务固定用同一个整数。eps、训练样本数量或数据形状变了,要重新评估维数,而不是沿用一次计算结果。
交叉验证中每折样本数量可能不同。提前按整份数据计算固定维数,不再等同于每折自行使用 auto;若需要那种行为,应在每个拟合入口按同样规则计算,保留训练与验证隔离。
名称数量要与真正输出一致
显式整数使拟合维数与输出计数使用同一值。验收同时比较 n_components_、投影矩阵行数、转换结果列数和特征名数量。不要直接改 _n_features_out 这个私有属性,也不要为了让命名成功把维数随意设为 2,那会改变投影与失真控制条件。
若下游允许普通数组输出,可以暂时避免请求特征名包装,但这会改变下游容器契约。随机投影后的列是新的投影维度,不能直接套用原输入列名。
SparseRandomProjection 也需要检查同样的维数计数,但稀疏结果另有 pandas 输出限制。即使修好名称,仍须按下游需求决定是否允许稠密化,并评估内存;不能为了转 DataFrame 直接把大型稀疏矩阵全部转稠密。
采用后续正式修正时,保留 auto 与显式等价整数的对照,固定原随机状态和输入,核对名称及结果形状。只看到 fit 完成或异常消失,不能替代对最终特征表的验收。


