DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
PanstarCloud:部署应用,接入 AI,云服务器与 AI 网关
OnlineSIM:在线接收短信,虚拟号码租用

FeatureAgglomeration 逆变换拒绝 DataFrame:先转回数值数组

FeatureAgglomeration的inverse_transform直接使用NumPy多维索引,列表和自身pandas输出也可能报错。1.9.1仍有该路径;转换前要保留聚合列的数量和顺序。

FeatureAgglomeration 已经完成拟合,transform() 也返回了表格,紧接着调用 inverse_transform() 却报 InvalidIndexError。如果开启了 set_output(transform="pandas"),或传入的是普通列表,应检查逆变换是否直接把输入当作 NumPy 数组索引。

scikit-learn 1.9.1 的这条实现会直接使用 X[..., inverse]。ndarray 支持这种省略号与数组索引组合;列表和 DataFrame 不按相同规则解释它,因而可能分别报 tuple 索引 TypeError 或 pandas 索引异常。正向转换支持一种容器,不保证逆向路径也完成了相同归一化。

对密集数值聚合结果显式转换

下面保留同一个已拟合聚合器,先得到它自己的 pandas 输出,再将数值部分交给逆变换:

import numpy as np
from sklearn.cluster import FeatureAgglomeration

X = np.random.RandomState(0).rand(10, 4)
model = FeatureAgglomeration(n_clusters=2).fit(X)
model.set_output(transform="pandas")
aggregated = model.transform(X)
array = np.asarray(aggregated)
if array.ndim != 2 or array.shape[1] != np.unique(model.labels_).size:
    raise ValueError("aggregated columns do not match fitted clusters")
restored = model.inverse_transform(array)

示例需要兼容的 pandas,并限定密集数值表。np.asarray 去掉 DataFrame 标签,但不会按标签替你重新排列列,因此转换前必须保持聚合结果的原列顺序。手动挑列、排序或从文件读回后,仅有相同列数还不够。

原始输入的四个特征不能直接交给这个逆变换入口;它需要的是每个聚合簇的值。正确列数由拟合后的聚合关系决定,不能看某次输出刚好有两列就对所有模型写死为 2。

逆变换并不恢复被合并的特征细节

默认聚合会将同簇特征求均值,逆变换把该簇的聚合值分配回成员位置。合并已经丢掉每个特征各自的偏差,因此返回四列不意味着原始 X 被逐值还原。验收应检查按 labels_ 展开的结构,而不是要求与原数据完全相等。

如果使用其他 pooling_func,仍需保留它的含义。不能为了让往返看起来更接近,悄悄更换聚合函数或重新拟合模型。

稀疏矩阵不是这段 asarray 方案的直接适用输入;将稀疏对象普通数组化可能得到对象数组,而稠密化又可能占用大量内存。含扩展类型或非数值列的表格也应先定义转换规则,不能只为消除索引错误丢掉缺失或类别语义。

用同一份聚合结果做容器对照

保留 DataFrame 与其等值 ndarray,比较逆变换后的形状、成员位置和数值。还应覆盖真实业务的单行与多行输入,明确是否允许一维向量;不要不看输入含义就统一 reshape。

这种处理仅在调用边界转换容器,未给库的公开接口补上全面验证。后续更换正式版本时,仍需确认列序、拟合状态和聚合规则;正式 1.9.1 仍直接对输入索引,更新依赖后应重新确认目标容器的支持情况。