缺少类别的单热编码

时间:2018-02-20 18:02:34

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

我有一个带有类别列的数据集。为了使用线性回归,我对该列进行了1-hot编码。

我的设置有10列,包括类别列。删除该列并附加1-hot编码矩阵后,我最终得到14列(10 - 1 + 5)。

所以我用形状矩阵(n,14)训练(拟合)我的LinearRegression模型。

训练之后,我想在训练集的一个子集上测试它,所以我首先只取5并将它们放在同一个管道中。但这5个首先只包含3个类别。所以在经过管道之后,我只剩下一个形状矩阵(n,13),因为它缺少两个类别。

如何强制1-hot编码器使用5个类别?

我正在使用sklearn的LabelBinarizer。

3 个答案:

答案 0 :(得分:2)

错误是“将测试数据放在同一个管道中”。基本上我在做:

data_prepared = full_pipeline.fit_transform(train_set)

lin_reg = LinearRegression()
lin_reg.fit(data_prepared, labels)

some_data = train_set.iloc[:5]
some_data_prepared = full_pipeline.fit_transform(some_data)

lin_reg.predict(some_data_prepared)
# => error because mismatching shapes

有问题的一行是:

some_data_prepared = full_pipeline.fit_transform(some_data)

通过fit_transform,我将使LabelBinarizer适合只包含3个标签的集合。相反,我应该这样做:

some_data_prepared = full_pipeline.transform(some_data)

这样我就可以使用整套(train_set)拟合的管道,并以相同的方式对其进行转换。

感谢@Vivek Kumar

答案 1 :(得分:0)

我遇到过这个问题,我无法通过scikit-learn找到解决方案。

我正在使用pandas .get_dummies()执行与OneHotEncoder类似的操作。

下面是我处理这个问题的一个函数,随意使用它并改进它(如果你发现任何错误,请告诉我,我实际上只是从一个更具体的函数中创建它我在我的代码库中)

import numpy as np
import pandas as pd

def one_hot_encoding_fixed_columns(pandas_series, fixed_columns):

    # Creates complete fixed columns list (with nan and 'other')
    fixed_columns = list(fixed_columns)
    fixed_columns.extend([np.nan, 'other'])

    # Get dummies dataset
    ohe_df = pd.get_dummies(pandas_series, dummy_na=True)

    # Create blank 'other' column
    ohe_df['other'] = 0

    # Check if columns created by get_dummies() are in 'fixed_columns' list.
    for column in ohe_df.columns:

        if column not in fixed_columns:
            # If not in 'fixed_columns', transforms exceeding column into 'other'.
            ohe_df['other'] = ohe_df['other'] + ohe_df[column]
            ohe_df.drop(columns=[column])

    # Check if elements in 'fixed_columns' are in the df generated by get_dummies()
    for column in fixed_columns:

        if column not in ohe_df.columns:
            # If the element is not present, create a new column with all values set to 0.
            ohe_df['column'] = 0

    # Reorders columns according to fixed columns
    ohe_df = ohe_df[fixed_columns]

    return ohe_df

基本上,您创建一个列表,其中包含将始终使用的列。如果test示例没有给定类别的任何元素,则会创建具有values = 0的相应列。如果test的新值不在train示例中,则会将其归类为other

我已经对代码进行了评论,我希望这是可以理解的,如果您有任何问题请告诉我,我会澄清它。

此函数的输入为pandas_series = df['column_name'],您可以在训练集上执行类似fixed_columns = df[selected_column].str[0].value_counts().index.values的操作,以生成值,也将在测试集上使用。

答案 2 :(得分:-1)

基本上,首先我们需要对基础数据应用fit_transform,然后对样本数据应用变换,因此样本数据也将获得不包含基础数据的确切列数。