编码-真值转换

import pandas as pd
pd.__version__
'2.1.4'
data = pd.read_csv('titanic.csv')
data
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
.......................................
88688702Montvila, Rev. Juozasmale27.00021153613.0000NaNS
88788811Graham, Miss. Margaret Edithfemale19.00011205330.0000B42S
88888903Johnston, Miss. Catherine Helen "Carrie"femaleNaN12W./C. 660723.4500NaNS
88989011Behr, Mr. Karl Howellmale26.00011136930.0000C148C
89089103Dooley, Mr. Patrickmale32.0003703767.7500NaNQ

891 rows × 12 columns

data.isna().sum()
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

标签编码

  • LabelEncoder 的 fit 方法用于学习标签的编码映射,将每个唯一值映射到一个连续的整数。
  • transform 方法使用学习到的编码映射将输入的标签转换为编码后的数值。
  • 这两个方法的结果通常是确定性的,不涉及随机操作或概率分布。
  • 用数字直接表示分类和顺序变量的过程中,无法准确还原不同类别信息之间的信息差异和相互关联性。
from sklearn.preprocessing import LabelEncoder

labelencoder = LabelEncoder()
labelencoder.fit(data['Sex'])
data['Sex-labelencoder'] = labelencoder.transform(data['Sex'])
data[['Sex', 'Sex-labelencoder']]
SexSex-labelencoder
0male1
1female0
2female0
3female0
4male1
.........
886male1
887female0
888female0
889male1
890male1

891 rows × 2 columns

# 获取映射关系
dict(zip(labelencoder.classes_, range(len(labelencoder.classes_))))
{'female': 0, 'male': 1}

独热编码

  • 将分类特征转换为二进制向量的编码方式
  • 返回一个稀疏矩阵
  • 空值均为False
embarked_ = pd.get_dummies(data['Embarked'])

display(embarked_, embarked_[data['Embarked'].isna()])
CQS
0FalseFalseTrue
1TrueFalseFalse
2FalseFalseTrue
3FalseFalseTrue
4FalseFalseTrue
............
886FalseFalseTrue
887FalseFalseTrue
888FalseFalseTrue
889TrueFalseFalse
890FalseTrueFalse

891 rows × 3 columns

CQS
61FalseFalseFalse
829FalseFalseFalse

与get_dummies()结果一致,但是空值生成新列

from sklearn.preprocessing import OneHotEncoder

onehot = OneHotEncoder()
onehot.fit(data[['Embarked']])
embarked_onehot = onehot.transform(data[['Embarked']])
embarked_onehot.toarray()
array([[0., 0., 1., 0.],
       [1., 0., 0., 0.],
       [0., 0., 1., 0.],
       ...,
       [0., 0., 1., 0.],
       [1., 0., 0., 0.],
       [0., 1., 0., 0.]])
# 第四列存在两个1,表示两个空值
embarked_onehot.toarray().sum(axis=0)
array([168.,  77., 644.,   2.])
# 映射关系
categories = data['Embarked'].unique()
dict(zip(categories, embarked_onehot.toarray()))
{'S': array([0., 0., 1., 0.]),
 'C': array([1., 0., 0., 0.]),
 'Q': array([0., 0., 1., 0.]),
 nan: array([0., 0., 1., 0.])}
  1. 独热编码的优点:

    • 处理分类特征:独热编码非常适合处理分类特征,它将每个类别转换为一个二进制向量,使得模型可以直接处理分类数据。
    • 保留特征之间的距离:独热编码保留了特征之间的距离信息,因为相似的类别在编码后会有相似的向量表示。
    • 模型的可解释性:由于独热编码将每个类别转换为一个独立的二进制位,模型的预测结果可以更容易地解释为各个类别的概率。

独热编码的缺点:

  • 维度爆炸:对于具有大量类别或高维度的特征,独热编码会导致维度爆炸,可能会导致模型的过拟合和计算效率下降。
  • 稀疏性:独热编码会产生大量的零值,导致编码后的向量非常稀疏,可能需要使用一些特定的模型或优化算法来处理稀疏数据。
  1. 标签编码的优点:
    • 低维度:标签编码通常将每个类别映射为一个整数,从而有效地降低了特征的维度,减少了计算负担。
    • 简单易懂:标签编码非常直观,易于理解和解释,因为整数编码直接对应于特征的类别。

标签编码的缺点:

  • 丢失顺序信息:标签编码是一种无序的编码方式,它会丢失特征之间的顺序信息,可能会影响一些模型的性能。
  • 无法处理未知类别:标签编码无法处理未知类别或新的类别,因为它需要为每个类别分配一个唯一的整数编码。
  1. 适用范围
  • 独热编码适用于处理分类特征,保留了特征之间的距离和顺序信息,但可能导致维度爆炸和稀疏性问题。
  • 标签编码适用于低维度和简单的分类特征,能够有效降低维度,但会丢失顺序信息且无法处理未知类别。
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值