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

如何在泰坦尼克数据集上正确定义并使用OneHotEncoder?

解决泰坦尼克数据集OneHotEncoder编码问题

嘿,刚接触Scikit-learn很容易踩这个坑,我来帮你把Sex特征转成你想要的OneHot格式!

问题出在哪?

你尝试的代码里,直接把OneHotEncoder.fit_transform()的结果赋值回原列是错误的:

  • OneHotEncoder处理单个分类特征后,会生成多个新列(比如Sex有2个类别,就生成2列),而不是替换原有的1列;
  • 默认情况下它返回的是稀疏矩阵,直接赋值会导致数据结构混乱,看起来还是LabelEncoder的结果,其实是赋值失败了。

正确解决方案(两种方式)

方式一:手动处理Sex特征,合并到原数据

这种方式适合新手理解整个过程:

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import pandas as pd

# 1. 先对Embarked用LabelEncoder(和你之前的操作一致)
labelencoder = LabelEncoder()
data['Embarked'] = labelencoder.fit_transform(data['Embarked'])

# 2. 对Sex做OneHot编码
# 注意:要传入二维数组(用[['Sex']]而非['Sex']),并设置sparse_output=False返回密集矩阵
onehotencoder = OneHotEncoder(sparse_output=False)
sex_onehot = onehotencoder.fit_transform(data[['Sex']])

# 3. 将OneHot结果转成DataFrame,指定列名(LabelEncoder对Sex的编码顺序是female→0,male→1)
sex_df = pd.DataFrame(sex_onehot, columns=['Female', 'Male'])

# 4. 合并原数据和新的Sex列,删除原Sex列
data = pd.concat([data, sex_df], axis=1)
data.drop('Sex', axis=1, inplace=True)

# 5. 调整列顺序到你想要的格式(可选)
data = data[['PassengerId', 'Survived', 'Pclass', 'Male', 'Female', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]

方式二:用ColumnTransformer(Scikit-learn推荐方式)

如果以后要处理多个不同类型的特征,用ColumnTransformer可以一次性配置所有编码规则,更高效规范:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import pandas as pd

# 1. 定义转换器:指定不同特征的编码方式
preprocessor = ColumnTransformer(
    transformers=[
        # 对Sex列用OneHotEncoder,返回密集矩阵
        ('sex_onehot', OneHotEncoder(sparse_output=False), ['Sex']),
        # 对Embarked列用LabelEncoder
        ('embarked_label', LabelEncoder(), ['Embarked'])
    ],
    remainder='passthrough'  # 其他列保持原样不处理
)

# 2. 执行转换,结果是numpy数组,转成DataFrame
processed_data = preprocessor.fit_transform(data)

# 3. 整理列名:获取OneHot列名、LabelEncoder列名和剩余列名
sex_columns = preprocessor.named_transformers_['sex_onehot'].get_feature_names_out(['Sex'])
remainder_columns = data.columns.difference(['Sex', 'Embarked'])
all_columns = list(sex_columns) + ['Embarked'] + list(remainder_columns)

# 4. 转成DataFrame并重命名列,调整顺序
data = pd.DataFrame(processed_data, columns=all_columns)
data.rename(columns={'Sex_female': 'Female', 'Sex_male': 'Male'}, inplace=True)
data = data[['PassengerId', 'Survived', 'Pclass', 'Male', 'Female', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]

验证结果

运行完上面的代码后,你就能得到预期的数据格式:

PassengerId  Survived  Pclass  Male  Female   Age  SibSp  Parch     Fare  Embarked
0            1         0       3   1.0     0.0  22.0      1      0   7.2500         2
1            2         1       1   0.0     1.0  38.0      1      0  71.2833         0
2            3         1       3   0.0     1.0  26.0      0      0   7.9250         2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:01:32