首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KBinsDiscretizer保留原点列名

KBinsDiscretizer保留原点列名
EN

Stack Overflow用户
提问于 2020-07-20 12:11:40
回答 1查看 1K关注 0票数 1

我正在研究一个机器学习问题,并使用Sklearn对一些连续变量进行离散化。

代码语言:javascript
复制
discretizer = KBinsDiscretizer(n_bins=8, encode='onehot')
discretizer.fit(dfDisc)

discretizer.transform(X_train)

在转换之前,我的X_train.columns返回:

代码语言:javascript
复制
["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]

在被改造后(并被放回熊猫df),X_train.columns给出了:

代码语言:javascript
复制
[0, 1, 2, 3, 4, 5, ......, 66, 67, 68]

由于我正在分析变量的原始名称(A,B,C,…,J),并且必须对用于我的分类的变量进行反馈,所以我正在寻找一种方法来知道哪个变量与输出的哪个数相关联。例如,我希望将输出X_train.columns转换为

代码语言:javascript
复制
["A_0", "A_1", "A_2", "A_3", "A_4", "B_0", "B_1", "B_2", "B_3", ... ]

我知道在使用sklearn (get_feature_names)时存在这样的命令,但是我无法找到使用KBinsDiscretizer的任何方法。

我必须解决这个问题的想法之一是为每个变量创建一个特定的离散化器,然后将关联的离散化器应用于每一列,并在合并所有内容之前手动重命名列,但是由于我必须保存我的离散化器,所以会很混乱。

而且,尽管我指定了n_bins = 8,但我的10个条目中有69个输出列,所以一个条目并不总是产生10个输出,而且我也不能用它来设置列名。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-21 12:40:47

有时,KBinsDiscretizer并不会对每个列/条目准确地返回n_bins。例如,当我运行以下代码时:

代码语言:javascript
复制
np.random.seed(0)
df = pd.DataFrame(np.random.randint(1, 200, size=(30, 10)), 
                  columns=["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"])
df['B'] = np.random.randint(1, 4, size=30)  # Set only 3 unique values

discretizer = KBinsDiscretizer(n_bins=8, encode='onehot')
discretizer.fit(df)

我收到警告:

移除特征1中宽度太小(即

1e-8)的<=垃圾桶。考虑减少垃圾箱的数量。

您可以使用n_bins_属性(在fit期间填充)查看每个列的结果回收箱。

代码语言:javascript
复制
>>> discretizer.n_bins_
array([8, 3, 8, 8, 8, 8, 8, 8, 8, 8])

还可以使用此属性按请求命名列:

代码语言:javascript
复制
dft = pd.SparseDataFrame(
    discretizer.transform(df), 
    columns=[f'{col}_{b}' for col, bins in zip(df.columns, discretizer.n_bins_) for b in range(bins)]
)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62995124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档