Day-8 标签编码与连续变量处理 -2025.8.18
·
标签编码与连续变量处理
知识点见示例代码
- 字典的简单介绍
- 标签编码
- 连续特征的处理:归一化和标准化
至此,常见的预处理方式都说完了
- 作业:对心脏病数据集的特征用上述知识完成,一次性用所有的处理方式完成预处理,尝试手动完成,多敲几遍代码。
笔记:
1. 字典的简单介绍
- 在 Python 中,字典(dictionary)是一种非常实用的数据结构,用于存储键值对(key-value pairs)。它具有高效的查找性能,是 Python 中最常用的数据类型之一。
- 字典的基本特点
1. 字典使用大括号 {} 定义
2. 每个元素由键(key)和值(value)组成,格式为 key: value
3. 键和值之间用冒号分隔,元素之间用逗号分隔
4. 字典中的键必须是不可变类型(如字符串、数字、元组),且不能重复
5. 字典中的值可以是任何数据类型,包括列表、字典等
6. 字典是无序的(在 Python 3.7+ 中实际保留插入顺序)
2. 字典常用方法
- keys():返回所有键的视图
- values():返回所有值的视图
- items():返回所有键值对的视图
- pop(key):删除并返回指定键的值
- popitem():删除并返回最后插入的键值对
- update():用另一个字典更新当前字典
(以上由AI解答,仅做记录)
3. 标签编码
day-5 学习了离散数据 如果是不存在顺序,则采用独热编码,函数为pd.get_dummies()
现在学习了对于存在顺序和大小关系的离散特征,做好标签编码,借助dataframe的map函数即可实现。
标签编码的适用场景
- 适用于有序分类特征(Ordinal Features),即类别之间存在明确的顺序关系(如:学历 “小学”<“中学”<“大学”)
- 不适用于无序分类特征(Nominal Features),如颜色(红、蓝、绿)、职业(医生、教师、工程师)等,因为会人为引入不存在的顺序关系
- 二分类的问题不需要独热编码,三分类以上才涉及独热编码
比如性别这个特征,男女不需要变成2个特征,性别男 性别女 。因为他们二者自由度为1,如果是2个特征的话,性别男=1,那么性别女必定等于0.这样特征高度相关,没有价值。
此时这个特征的含义不是性别,而是:是否为男性,1是男性,0是非男。
实现方式
- scikit-learn 的 LabelEncoder 类实现标签编码,也可以通过自定义字典手动实现。
标签编码的优缺点
- 优点:
– 实现简单,转换后数据维度不变
– 适用于有序分类特征,能保留类别间的顺序关系 - 缺点:
– 会给无序分类特征引入虚假的数值关系(如将 “红 = 0”、“蓝 = 1” 误认为红 < 蓝)
– 可能导致模型误解类别间的距离关系(如认为 1 和 2 的距离比 1 和 3 更近)
4. 连续特征的处理:归一化和标准化
归一化

标准化

选择建议
- 归一化:特征边界明确且需保留比例关系时优先使用。
- 标准化:数据存在异常值或算法对分布有要求时更有效。
- 树模型(如随机森林):通常无需缩放,因分裂基于特征排序。
实现方式
- 自己写函数
- sklearn 库
–StandardScaler:标准化工具(将数据转换为均值为 0、标准差为 1 的分布)
– MinMaxScaler:归一化工具(将数据缩放到 [0, 1] 区间)
作业:
信贷数据集的数据预处理
主要步骤如下:
- 数据导入和认识数据
- 分离离散变量和连续变量
- 缺失值处理
- 对离散变量做独热编码或者标签编码
- 对连续变量做归一化或者标准化处理
1. 数据导入和认识数据
# 数据导入和认识数据
import pandas as pd
data = pd.read_csv('data.csv')
data.head()

data.info()

2. 分离离散变量和连续变量
col = data.columns
d_f = [] #储存离散变量
c_f = [] #储存连续变量
for i in col:
if data[i].dtype == 'object':
d_f.append(i)
else:
c_f.append(i)
离散变量有
d_f

连续变量有
c_f

3. 缺失值处理
c_pre = data.isnull().sum() #填补缺失值前的缺失值数量
#连续变量用中位数填补
for i in c_f:
if data[i].isnull().sum() > 0:
m = data[i].median()4
data[i] = data[i].fillna(m)
#离散变量用众数添补
for i in d_f:
if data[i].isnull().sum() > 0:
m= data[i].mode()[0]
data[i] = data[i].fillna(m)
c = data.isnull().sum() #填补缺失值后的缺失值数量
对比下填补结果
c_pre

c

通过对比看到所有的缺失值都填补上了
4. 对离散变量做独热编码或标签编码
d_f

用value_counts()函数看一下这些离散变量的各个类型的分布和数量
a = data['Home Ownership'].value_counts()
b = data['Years in current job'].value_counts()
c = data['Purpose'].value_counts()
d = data['Term'].value_counts()
print(a,b,c,d)

可以看出来对于 Home Ownership,Term 可以做标签编码
Purpose ,Years in current job可以做独热编码
其中对标签(信贷预测是否违约)的影响,Home Ownership中的 Own Home < Rent < Have Mortgage < Home Mortgage (个人理解)
#做标签编码
#定义字典
mapping = {
'Home Ownership':{
'Own Home':0,
'Rent':1,
'Have Mortgage':2,
'Home Mortgage':3
},
'Term':{
'Short Term':0,
'Long Term':1
}
}
data['Home Ownership'] = data['Home Ownership'].map(mapping['Home Ownership'])
data['Term'] = data['Term'].map(mapping['Term'])
data.head()

# 做独热编码
list1 = ['Purpose','Years in current job']
data = pd.get_dummies(data,columns=list1)
data.head()

# 做类型转化
# 做类型转化
#统计新增列
list2 = []
for i in data.columns:
if i not in col:
list2.append(i)
list2

data[list2] = data[list2].astype(int) #bool --> int
data.info()

5. 对连续变量做归一化或标准化处理
#导入
from sklearn.preprocessing import StandardScaler, MinMaxScaler
#归一化
min_max_scaler = MinMaxScaler()
data[c_f] = min_max_scaler.fit_transform(data[c_f])
data[c_f]

#标准化
standardscaler = StandardScaler()
data[c_f] = standardscaler.fit_transform(data[c_f])
data[c_f]

到这里,数据预处理内容已完成,还可以继续通过画图等方式分析数据的结构或是否存在其他问题
更多推荐


所有评论(0)