如何将Pandas Series中OneHotEncoder输出的np.array转为数值类型?
问题原因
你当前将OneHotEncoder输出的形状为(样本数, 姓氏类别数)的numpy数组逐行转为列表后,塞进了pandas的单个列中,pandas会将存储列表/数组的列默认识别为object类型,这类非扁平的数值结构无法直接传入常规机器学习模型。
解决方案
常用方案:将独热编码展开为独立特征列
这是绝大多数建模场景的标准处理方式,每个独热编码维度对应一个独立的特征列,全部为数值类型,可直接传入模型训练:
import pandas as pd import numpy as np from sklearn.preprocessing import OneHotEncoder from sklearn.compose import make_column_transformer # 原有编码逻辑,sklearn 1.2+版本用sparse_output=False,旧版本换回sparse=False transformer = make_column_transformer((OneHotEncoder(sparse_output=False), ['Surname']), remainder = "drop") encoded_surname = transformer.fit_transform(titanic) # 生成独热编码对应的列名 encoded_cols = transformer.get_feature_names_out() # 编码结果转为DataFrame encoded_df = pd.DataFrame(encoded_surname, columns=encoded_cols, index=titanic.index) # 拼接回原数据集,可按需删除不需要的原始列 titanic = pd.concat([titanic.drop(['Surname', 'Encoded_Surname'], axis=1, errors='ignore'), encoded_df], axis=1)
特殊场景:保留单列存储的处理方式
如果确实需要将整个编码向量存在单个列中,训练时可直接将该列转为符合模型要求的数值矩阵:
# 提取训练特征 X = np.concatenate([ titanic[['Pclass', 'Sex', 'SibSp', 'Parch', 'Fare']].values, np.stack(titanic['Encoded_Surname'].values) ], axis=1) y = titanic['Survived'].values
得到的X为全数值类型的二维矩阵,可直接传入分类模型训练。
内容的提问来源于stack exchange,提问作者cagatay.e.sahin
相关产品推荐
相关产品推荐

