import pandas as pd
pd.__version__
'2.1.4'
data = pd.read_csv('titanic.csv')
data
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
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']]
Sex | Sex-labelencoder | |
---|---|---|
0 | male | 1 |
1 | female | 0 |
2 | female | 0 |
3 | female | 0 |
4 | male | 1 |
... | ... | ... |
886 | male | 1 |
887 | female | 0 |
888 | female | 0 |
889 | male | 1 |
890 | male | 1 |
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()])
C | Q | S | |
---|---|---|---|
0 | False | False | True |
1 | True | False | False |
2 | False | False | True |
3 | False | False | True |
4 | False | False | True |
... | ... | ... | ... |
886 | False | False | True |
887 | False | False | True |
888 | False | False | True |
889 | True | False | False |
890 | False | True | False |
891 rows × 3 columns
C | Q | S | |
---|---|---|---|
61 | False | False | False |
829 | False | False | False |
与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.])}
-
独热编码的优点:
- 处理分类特征:独热编码非常适合处理分类特征,它将每个类别转换为一个二进制向量,使得模型可以直接处理分类数据。
- 保留特征之间的距离:独热编码保留了特征之间的距离信息,因为相似的类别在编码后会有相似的向量表示。
- 模型的可解释性:由于独热编码将每个类别转换为一个独立的二进制位,模型的预测结果可以更容易地解释为各个类别的概率。
独热编码的缺点:
- 维度爆炸:对于具有大量类别或高维度的特征,独热编码会导致维度爆炸,可能会导致模型的过拟合和计算效率下降。
- 稀疏性:独热编码会产生大量的零值,导致编码后的向量非常稀疏,可能需要使用一些特定的模型或优化算法来处理稀疏数据。
- 标签编码的优点:
- 低维度:标签编码通常将每个类别映射为一个整数,从而有效地降低了特征的维度,减少了计算负担。
- 简单易懂:标签编码非常直观,易于理解和解释,因为整数编码直接对应于特征的类别。
标签编码的缺点:
- 丢失顺序信息:标签编码是一种无序的编码方式,它会丢失特征之间的顺序信息,可能会影响一些模型的性能。
- 无法处理未知类别:标签编码无法处理未知类别或新的类别,因为它需要为每个类别分配一个唯一的整数编码。
- 适用范围
- 独热编码适用于处理分类特征,保留了特征之间的距离和顺序信息,但可能导致维度爆炸和稀疏性问题。
- 标签编码适用于低维度和简单的分类特征,能够有效降低维度,但会丢失顺序信息且无法处理未知类别。