我正在研究一个机器学习问题,并使用Sklearn对一些连续变量进行离散化。
discretizer = KBinsDiscretizer(n_bins=8, encode='onehot')
discretizer.fit(dfDisc)
discretizer.transform(X_train)在转换之前,我的X_train.columns返回:
["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]在被改造后(并被放回熊猫df),X_train.columns给出了:
[0, 1, 2, 3, 4, 5, ......, 66, 67, 68]由于我正在分析变量的原始名称(A,B,C,…,J),并且必须对用于我的分类的变量进行反馈,所以我正在寻找一种方法来知道哪个变量与输出的哪个数相关联。例如,我希望将输出X_train.columns转换为
["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个输出,而且我也不能用它来设置列名。
发布于 2020-07-21 12:40:47
有时,KBinsDiscretizer并不会对每个列/条目准确地返回n_bins。例如,当我运行以下代码时:
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期间填充)查看每个列的结果回收箱。
>>> discretizer.n_bins_
array([8, 3, 8, 8, 8, 8, 8, 8, 8, 8])还可以使用此属性按请求命名列:
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)]
)https://stackoverflow.com/questions/62995124
复制相似问题