使用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
相关产品推荐
相关产品推荐

