【问题标题】:Sklearn KBinsDiscretizer keep origin column namesSklearn KBinsDiscretizer 保留原始列名
【发布时间】:2020-11-09 16:32:20
【问题描述】:

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

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"]

经过转换(并作为 pandas 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 OneHotEncoder (get_feature_names) 时存在这样的命令,但我找不到任何使用 KBinsDiscretizer 的方法。

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

此外,即使我指定 n_bins = 8,我的 10 个条目中有 69 个输出列,因此 1 个条目并不总是产生 10 个输出,我也不能使用它来设置列名。

【问题讨论】:

    标签: python python-3.x pandas scikit-learn sklearn-pandas


    【解决方案1】:

    有时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 中宽度太小(即

    您可以使用 n_bins_ 属性(在拟合期间填充)查看每列生成的 bin。

    >>> 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)]
    )
    

    【讨论】:

    • 我找到了避免使用离散化器的方法,但非常感谢您的回答,我想我可以解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2014-12-30
    • 2011-03-30
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多