传递df时,带有OneHotEncoder的Column Transformer问题



我目前正在尝试学习如何使用管道和列转换器,但在将它们应用于数据帧时遇到了困难。我正在研究一个Kaggle住房数据集,该数据集基于爱荷华州的住房或类似的东西(https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data)。我已经用dataframe列的含义填充了Null值,并为具有字符串的列填充了"None"。我现在正试图创建一个列转换器,将OneHotEncoder应用于其中只有字符串对象的列,使用:

obj_list=[x for x in df.columns if (df[x].dtype!= np.int) & (df[x].dtype!=np.float)] #Columns with non-numerical values
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer
ct=make_column_transformer((OneHotEncoder(),obj_list),remainder='passthrough') #Create a Column Transformer
pipe=make_pipeline(ct)
outcome=pipe.fit_transform(df.values)

但我收到一个值错误:

ValueError: Specifying the columns using strings is only supported for pandas DataFrames

如果我使用数据帧:

outcome=pipe.fit_transform(df)
#I can now do
df_1=pd.DataFrame(outcome,columns=ct.get_feature_names())

我得到

ValueError: Shape of passed values is (1460,1), indices imply (1460,288)

因为一个热的transformer似乎已经将所有值聚集到一列中。列变换器的功能保留了下来,但看起来很时髦:

list(ct.get_feature_names())
#['onehotencoder__x0_C (all)', 'onehotencoder__x0...']

有人能看看并可能解释为什么输出名称如此奇怪吗?谢谢

问题是一个热编码器实际上创建了一个np稀疏矩阵!

最新更新