缺失类别的一位有效编码

5
我有一个数据集,其中包含一个类别列。为了使用线性回归,我对该列进行了1-hot编码。
我的数据集有10列,包括类别列。在删除该列并添加1-hot编码矩阵后,我得到了14列(10-1+5)。
因此,我使用形状为(n,14)的矩阵来训练(fit)我的LinearRegression模型。
在训练完模型后,我想在训练集的子集上进行测试,所以我只取前5个并将它们通过相同的流程处理。但是这5个只包含3个类别。因此,在经过流程处理后,我只剩下形状为(n,13)的矩阵,因为缺少2个类别。
如何强制1-hot编码器使用这5个类别?
我正在使用sklearn中的LabelBinarizer。

1
你应该只在新数据上使用LabelBinarizer.transform(),而不是fit()。展示代码,我们将修改它以适应需求。 - Vivek Kumar
这就是@VivekKumar - 一旦变压器(在这种情况下是LabelBinarizer)已经安装,就不应该重新安装。谢谢! - lipsumar
3个回答

7
错误在于“将测试数据通过相同的管道”。基本上我一直在做以下操作:
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
我遇到了这个问题,通过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之类的操作,以生成还将用于测试集的值。

-1

首先,我们需要对基础数据应用fit_transform,然后对样本数据应用transform,这样样本数据也将获得与基础数据相同的列数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接