为什么以及如何解决在 python pandas 中多重编码时丢失的数据

why and how to solve the data lost when multi encode in python pandas

Download the Data Here

你好,我有一个类似下面的数据,我想对数据进行多重标记。

喜欢这样的东西:target

但这里的问题是多标签时数据丢失,如下所示:

issue

使用编码:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer(sparse_output=True)

df_enc = df.drop('movieId', 1).join(df.movieId.str.join('|').str.get_dummies())

谁能帮帮我,欢迎下载数据集,谢谢。

因此,当使用 pandas 读入时,该列将存储为字符串。所以首先我们需要将其转换为实际列表。

从那里使用 .explode() 将该列表扩展成一个系列(其中索引将匹配它来自的索引,并且列值将是该列表中的值)。

然后将系列中的数据交叉制表到每一行和每一列中作为值。

然后将备份与索引值上的数据框连接起来。

请记住,当您使用高基数进行单热编码时,您 table 会爆炸成 巨大 宽 table.我只是在前 20 行上这样做,最后得到 233 列。对于 225,000 多行,需要一段时间(可能是一分钟左右)来处理,最终你会得到将近 1300 列。这对于机器学习来说可能太复杂了,无法用它做任何有用的事情(尽管可能适用于深度学习)。你仍然可以尝试一下,看看你得到了什么。我建议测试的是找到一种方法来稍微简化它以使其不那么复杂。也许找到一种方法将电影 ID 组合成一定数量的流派或类似的东西?但是然后测试看看简化它是否会改善你的 model/performance.

import pandas as pd
from ast import literal_eval

df = pd.read_csv('ratings_action.csv')

df.movieId = df.movieId.apply(literal_eval)
s = df['movieId'].explode()
df = df[['userId']].join(pd.crosstab(s.index, s))