我有一个带有类别列的数据集。为了使用线性回归,我对该列进行了1-hot编码。
我的设置有10列,包括类别列。删除该列并附加1-hot编码矩阵后,我最终得到14列(10 - 1 + 5)。
所以我用形状矩阵(n,14)训练(拟合)我的LinearRegression模型。
训练之后,我想在训练集的一个子集上测试它,所以我首先只取5并将它们放在同一个管道中。但这5个首先只包含3个类别。所以在经过管道之后,我只剩下一个形状矩阵(n,13),因为它缺少两个类别。
如何强制1-hot编码器使用5个类别?
我正在使用sklearn的LabelBinarizer。
答案 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
)拟合的管道,并以相同的方式对其进行转换。
答案 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,然后对样本数据应用变换,因此样本数据也将获得不包含基础数据的确切列数。