Pandas实现分类特征的省去编码

2024-10-01 11:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近看了一段欧文·张卡格尔排名第一的选手的视频: https://youtu.be/LgLcfZjNF44 他解释了一种将分类特征编码为数字的技术,称为遗漏编码。他对一个范畴特征所做的是将一个值与每个观察值相关联,这是对同一类别的所有其他观察值的响应的平均值。在

我一直在尝试使用pandas在python中实现这个策略。虽然我已经成功地构建了一个代码,但事实上我的数据集大小达数千万,它的性能非常缓慢。 如果有人能提出一个更快的解决方案,我将非常感激。在

这是我目前为止的代码:

def categ2numeric(data, train=True):
    def f(series):
        indexes = series.index.values
        pomseries = pd.Series()
        for i, index in enumerate(indexes):
            pom = np.delete(indexes, i)
            pomseries.loc[index] = series[pom].mean()
        series = pomseries
        return series

    if train:
        categ = data.groupby(by=['Cliente_ID'])['Demanda_uni_equil'].apply(f)

我需要把这个系列

^{pr2}$

为此:

            159812     39.00
            464556     25.25
            717223     34.75
            1043801    40.75
            1152917    44.25
            dtype: float64

或在数学上,索引为159812的元素等于所有其他元素的平均值,或:

39=(83+45+21+7)/4


Tags: 代码https元素编码dataindex视频def
3条回答

在@root的帮助下,我发现解决这个问题最快的方法是:

cs = train.groupby(by=['Cliente_ID'])['Demanda_uni_equil'].sum()
cc = train['Cliente_ID'].value_counts()
boolean = (cc == 1)
index = boolean[boolean == True].index.values
cc.loc[boolean] += 1
cs.loc[index] *= 2
train = train.join(cs.rename('sum'), on=['Cliente_ID'])
train = train.join(cc.rename('count'), on=['Cliente_ID'])
train['Cliente_IDloo'] = (train['sum'] - train['Demanda_uni_equil'])/(train['count'] - 1)
del train['sum'], train['count']

我发现,如果使用apply方法和可调用函数作为输入,则需要2分钟,而这种方法只需1秒,但有点麻烦。在

有一个库:category_encoders具有与sikit-learn相似的代码语法。在

因此,您可以使用类似于:

from category_encoders import LeaveOneOutEncoder

LeaveOneOutEncoder.fit(X, y)

用级数和元素之和的差替换级数中的每个元素,然后除以级数的长度减去1。假设s是您的系列:

s = (s.sum() - s)/(len(s) - 1)

结果输出:

^{pr2}$

相关问题 更多 >