【问题标题】:Hot-encoding: missing columns热编码:缺少列
【发布时间】:2018-01-06 03:10:02
【问题描述】:

我有 1000000 条记录的训练集和 100 条记录的测试集。为了创建推荐系统,我创建了两个这样组织的数据框:

[in]print(training_df.head(n=5))

[out]                     product_id
transaction_id                      
0000001                   [P06, P09]
0000002         [P01, P05, P06, P09]
0000003                   [P01, P06]
0000004                   [P01, P09]
0000005                   [P06, P09]

然后我使用 sklearn 创建了一个矩阵,其中 product_id 为列,transaction_id 为行(索引)。

代码如下:

# Create a matrix for the transactions
from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
training_df1 = training_df.join(pd.DataFrame(mlb.fit_transform(training_df.pop('product_id')),
                          columns=mlb.classes_,
                          index=training_df.index))

product_id 是 P01-P10。问题是训练数据中没有 P04 和 P08,所以我的 training_df1 只有 8 列而不是 10。如何添加这两列并为所有事务填充 0?

【问题讨论】:

    标签: python scikit-learn one-hot-encoding


    【解决方案1】:

    您可以在初始化 MultiLabelBinarizer 时将预定义的产品 ID P01-P10 作为类传递,因此输出将始终包含这些类别作为列:

    from sklearn.preprocessing import MultiLabelBinarizer
    ​
    product_ids = ['P{:02d}'.format(i+1) for i in range(10)]
    print(product_ids)
    # ['P01', 'P02', 'P03', 'P04', 'P05', 'P06', 'P07', 'P08', 'P09', 'P10']
    ​
    mlb = MultiLabelBinarizer(classes=product_ids)
    training_df.join(pd.DataFrame(mlb.fit_transform(training_df['product_id']),
                                  columns=mlb.classes_,
                                  index=training_df.index))
    


    只取回矩阵:

    training_df.drop('product_id', 1).join(
        pd.DataFrame(mlb.fit_transform(training_df['product_id']), columns=mlb.classes_, index=training_df.index)
    )
    

    【讨论】:

    • 我得到“代码”(密钥错误:“产品 ID”)。另外,我不想返回“product_id”列,只返回矩阵。
    • 很可能你已经使用pop 方法从training_df 中弹出了product_id 列,我不建议使用它,因为它会修改training_df 并给你这样的问题。所以尝试重建它。此外,您需要transaction_id 列,还是只需要P01-P10?
    • 好的,我认为你是对的,我将重建 df 并重试 - 但是保留 transaction_id 列会有所帮助,但是包含 product_id 列会有点多余,因为数据已经存在在那里。
    • 你可以在.set_index('transaction_id')之后将transaction_id设置为索引。
    猜你喜欢
    • 2018-07-31
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多