为什么以及如何解决在 python pandas 中多重编码时丢失的数据
why and how to solve the data lost when multi encode in python pandas
你好,我有一个类似下面的数据,我想对数据进行多重标记。
喜欢这样的东西: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))
你好,我有一个类似下面的数据,我想对数据进行多重标记。
喜欢这样的东西: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))