上一篇文章中,我们使用OrdinalEncoder把分类特征Sex和Embarked转换成了数值,但在Embarked这个特征中,我们用[0,1,2]表示港口其实是不合理的,因为这三个数值在算法看来,是连续且可以计算的,有可能在建模过程中对其进行大小比较,或者数学运算,这样会给算法传达一些不准确的信息,从而影响建模。所以对于这类没有关联的名义变量,我们需要使用OneHot编码,将其转换成哑变量

以下示例中,我们依然使用泰坦尼克号数据的Sex和Embarked特征,做独热编码转换。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

data = pd.read_csv('./datas/titanic.csv')
data.dropna(subset=['Embarked'], inplace=True)
data.reset_index(drop=True, inplace=True)

# 获取编码信息
enc = OneHotEncoder().fit(data[['Sex', 'Embarked']])
print(enc.categories_)
print(enc.get_feature_names_out(['Sex', 'Embarked']))

# 编码
enc_arr = OneHotEncoder().fit_transform(data[['Sex', 'Embarked']]).toarray()
print(enc_arr.shape)

# 编码后数据处理(合并可能会出现多出两条数据的bug,需要先data.reset_index)
columns = enc.get_feature_names_out(['Sex', 'Embarked'])
enc_df = pd.DataFrame(enc_arr, columns=columns)
new_data = pd.concat([data, enc_df], axis=1)

# 删除数据列
new_data.drop(['Sex', 'Embarked'], axis=1, inplace=True)
print(new_data.columns)

本文为 陈华 原创,欢迎转载,但请注明出处:http://edu.ichenhua.cn/read/265