You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FeatureAgglomeration时feature_names_in与get_feature_names_out调用异常

问题分析与解决步骤

1. 为什么调用feature_names_in_会报错

feature_names_in_是FeatureAgglomeration的属性(不是可调用方法),存储的是模型拟合时输入的特征名数组。你写agglo.feature_names_in_(Class1_rank)相当于把numpy数组当成函数调用,必然抛出TypeError: 'numpy.ndarray' object is not callable异常。正确操作是直接赋值,而非加括号调用。

2. 正确设置自定义特征名的两种方式

要让模型识别你的自定义特征名,可通过以下两种方式:

  • 拟合时传入带列名的DataFrame:
    如果你的输入是带自定义列名的pd.DataFrame,拟合后feature_names_in_会自动被赋值为这些列名,无需手动操作。示例代码:
    from sklearn.cluster import FeatureAgglomeration
    from scipy.stats import spearmanr
    import pandas as pd
    
    # 假设df是你的105×105带列名DataFrame
    df = pd.DataFrame(...)
    # 定义Spearman相关系数转距离的函数
    def spearman_dist(X):
        corr = spearmanr(X).correlation
        return 1 - corr  # 聚类需要距离矩阵,将相关系数转为距离
    
    agglo = FeatureAgglomeration(n_clusters=40, linkage='average', affinity=spearman_dist)
    agglo.fit(df)  # 直接传入DataFrame,自动获取列名到feature_names_in_
    
  • 手动赋值feature_names_in_:
    如果输入是numpy数组,直接给属性赋值自定义特征名数组即可:
    # X为numpy数组,Class1_rank是你的字符串类型特征名数组
    agglo.fit(X)
    agglo.feature_names_in_ = Class1_rank  # 直接赋值,不要加括号
    

3. 获取自定义输出特征名

当feature_names_in_正确设置后,调用get_feature_names_out()就能返回基于原特征名的簇命名,也可通过参数自定义前缀:

# 默认命名格式:cluster_0, cluster_1...
output_names = agglo.get_feature_names_out()

# 自定义前缀,比如改为feature_cluster_0, feature_cluster_1...
custom_output_names = agglo.get_feature_names_out(prefix='feature_cluster_')

如果feature_names_in_未正确设置(比如拟合时传入无列名的numpy数组且未手动赋值),get_feature_names_out()会默认返回x0, x1...格式的命名,这就是你之前遇到的问题。

内容的提问来源于stack exchange,提问作者Lieke Pullen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:48:10