You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sklearn构建Pipeline时字符串转数值失败:'male'无法转float求助

解决方案:Titanic数据集Pipeline训练报错问题

问题根源

你遇到的'could not convert string to float: 'male''错误,核心原因是ColumnTransformer处理后列顺序发生变化,你后续硬编码的列索引没覆盖到Sex列,导致这个字符串类型的特征没被编码,直接传到了模型训练环节。

原代码中:

  • tf1处理后,列顺序变成了[处理后的Age, 处理后的Embarked, Pclass, Sex, SibSp, Parch, Fare],Sex列在索引3的位置
  • tf2里你指定的是[1,6],只处理了Embarked和Fare,完全漏掉了Sex列,导致"male"/"female"这些字符串没被编码

正确实现代码

直接按**特征类型(数值/类别)**拆分处理,避免硬编码索引的问题:

import numpy as np
import pandas as pd
import seaborn as sns

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.tree import DecisionTreeClassifier
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.compose import ColumnTransformer 
from sklearn.compose import make_column_selector as selector

# 读取并清洗数据
a = pd.read_csv("C:\\Users\\SURAJ SINGH\\OneDrive\\Desktop\\train.csv")
a = a.drop(columns=["PassengerId", "Name", "Ticket", "Cabin"], axis=1)

# 拆分训练测试集
X = a.drop("Survived", axis=1)
y = a["Survived"]
xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size=0.2, random_state=3)

# 数值特征处理管道:填充缺失值+缩放
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', MinMaxScaler())
])

# 类别特征处理管道:填充缺失值+独热编码
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(sparse_output=False, handle_unknown='ignore'))
])

# 合并预处理管道:自动识别数值/类别列分别处理
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, selector(dtype_exclude="object")),
        ('cat', categorical_transformer, selector(dtype_include="object"))
    ])

# 构建完整机器学习流水线
pipeline_obj2 = make_pipeline(
    preprocessor,
    SelectKBest(score_func=chi2, k=5),
    DecisionTreeClassifier()
)

# 显示流水线结构(可选)
from sklearn import set_config
set_config(display="diagram")

# 训练模型
pipeline_obj2.fit(xtrain, ytrain)

# 测试集评估
print(f"测试集准确率: {pipeline_obj2.score(xtest, ytest):.2f}")

关键修改说明

  • 自动识别列类型:用make_column_selector自动区分数值列(非object类型)和类别列(object类型),彻底避免索引硬编码的错误
  • 按特征类型拆分处理:数值特征做缺失值填充+缩放,类别特征做缺失值填充+独热编码,逻辑清晰且符合特征处理规范
  • 整合预处理步骤:把原代码分散的tf1/tf2/tf3合并成一个preprocessor,减少中间步骤的列顺序混乱

额外建议

  • 永远优先用列名或类型选择特征,不要依赖列索引,除非你能完全掌控每一步的列顺序变化
  • 用Pipeline整合所有步骤,能自动避免数据泄露(比如测试集不会用到训练集之外的统计量)
  • 可以尝试把DecisionTreeClassifier换成RandomForestClassifier,缓解决策树容易过拟合的问题

内容的提问来源于stack exchange,提问作者Suraj Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:56:59