ValueError:只有Panda DataFrames才支持使用字符串指定列



我使用的是一个titanic.csv数据集,我试图使用Column Transfer和Pipeline,而在使用pipe.predict(x_test(时,我遇到了一个错误。这是我的密码。

titanic={'sex':['M','M','M','F','F','M','F','F','M','M'],
'Pclass':[2,2,2,1,1,2,3,1,3,3],
'age':[58,45,20,27,38,43,40,35,60,72],
'embarked':['s','c','c','s','s','s','s','s','c','c'],
'survived':[1,0,1,0,1,1,1,1,0,0]
}
df=pd.DataFrame(data=titanic)
x=df.drop(['survived'],axis=1)
y=df.survived
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y)
col_tra_1=ColumnTransformer([
('trf1',SimpleImputer(),['Pclass','age'])
],remainder='passthrough')
col_tra_2=ColumnTransformer([
('ohe1',OneHotEncoder(sparse=False, handle_unknown='ignore'),['sex','embarked'])
],remainder='passthrough')
col_tra_3=ColumnTransformer([
('scale',MinMaxScaler(),['Pclass','age'])
],remainder='passthrough')

model=DecisionTreeClassifier()
from sklearn.pipeline import Pipeline, make_pipeline
pipe = Pipeline([
('col_tra_1',col_tra_1),
('col_tra_2',col_tra_2),
('col_tra_3',col_tra_3),
('model',model)
])
pipe.fit(x_train,y_train)

在那之后,我得到了一个错误:ValueError:只有pandas DataFrames才支持使用字符串指定列。

如果我使用索引而不是列名,我会得到一个不同的错误:ValueError:不能对非数字数据使用均值策略:无法将字符串转换为浮点值:"F">

问题是将一些变压器堆叠在一起。转换器返回一个没有列的numpy array,因此会发生错误。您可以通过移除其中两个变压器来验证它。对我来说,最简单的方法是使用索引而不是列名。代码:

col_tra_1=ColumnTransformer([
('trf1',SimpleImputer(strategy='constant'),[0,1])
],remainder='passthrough')
col_tra_2=ColumnTransformer([
('ohe1',OneHotEncoder(sparse=False, handle_unknown='ignore'),[0,3])
],remainder='passthrough')
col_tra_3=ColumnTransformer([
('scale',MinMaxScaler(),[0,1])
],remainder='passthrough')

输出:

Pipeline(steps=[('col_tra_1',
ColumnTransformer(remainder='passthrough',
transformers=[('trf1',
SimpleImputer(strategy='constant'),
[0, 1])])),
('col_tra_2',
ColumnTransformer(remainder='passthrough',
transformers=[('ohe1',
OneHotEncoder(handle_unknown='ignore',
sparse=False),
[0, 3])])),
('col_tra_3',
ColumnTransformer(remainder='passthrough',
transformers=[('scale', MinMaxScaler(),
[0, 1])])),
('model', DecisionTreeClassifier())])

最新更新