ValueError:传递值的形状是 (8631, 28),索引意味着 (8631, 17)

问题描述 投票:0回答:1
  • step1:创建管道
  • step2:将管道转换为数据帧
  • step3:我正在尝试将管道转换为数据帧,但引发了异常。如何解决这个问题
  • 第 4 步:如何解决 ValueError:传递值的形状为 (8631, 28),索引意味着 (8631, 17) 在管道转换为数据帧之上,
from sklearn.preprocessing import FunctionTransformer, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer

import pandas as pd
from sklearn.model_selection import train_test_split

print("step1: import lib")
print("step2: loading raw data")
df = pd.read_csv("online_shoppers_intention.csv")

print("step3: data preparition")
X = df.drop(['Revenue'], axis = 1)
y = df['Revenue']

print("step4: data splitting")
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .3, random_state = 0)
names = X_train.columns.tolist()

numeric_transformer = SimpleImputer(strategy = 'constant')
categorical_transformer = OneHotEncoder(handle_unknown = 'ignore')

numerical_cols = X.select_dtypes(exclude = "object").columns.values.tolist()
categorical_cols = X.select_dtypes(exclude = ['int', 'float64', 'bool']).columns.values.tolist()
    
preprocessor = ColumnTransformer(
    transformers=[
    ('num', numeric_transformer, numerical_cols)
    ,('cat', categorical_transformer, categorical_cols)
    ],
    remainder = 'passthrough')

pipe_preprocessor = Pipeline(steps = [("preprocessor", preprocessor), ("pandarizer", FunctionTransformer(lambda x: pd.DataFrame(x, columns = names)))]).fit(X_train)
    
X_train_pipe = pipe_preprocessor.transform(X_train)
X_test_pipe = pipe_preprocessor.transform(X_test)
python machine-learning pipe
1个回答
0
投票

我认为问题出在您的代码的一部分

pd.DataFrame(x, columns = names)
,因为在上一步中您使用
categorical_transformer = OneHotEncoder(handle_unknown = 'ignore')
预处理分类列,它增加了列数,这就是形状不匹配的原因,作为解决方案,您可以尝试使用 LabelEncoder 更改 OneHotEncoder或根据新的列数更改
names
列表

© www.soinside.com 2019 - 2024. All rights reserved.