Day 8 标签编码与连续变量处理

@浙大疏锦行

今日任务:

  1. 字典的简单操作
  2. 标签编码
  3. 连续特征的处理:归一化与标准化
  4. 对心脏数据集实践数据预处理全过程

字典

字典可用来存储任意类型对象,内部元素由一个个键值对组成。其中键是唯一的且为不可变类型,值是可重复的。

关于字典的详细用法参考:Python字典的用法(定义、增加、删除、修改、查询、遍历)

# 使用花括号创建字典
dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}

dict #{'name': 'Alice', 'age': 25, 'city': 'New York'}
# 访问字典中的值
dict['name'] #'Alice'

标签编码

在day 5 中学习了对无序离散特征进行独热编码的操作。而对于存在顺序和大小关系的离散特征,一般使用的是标签编码。对于标签编码的实现,可采取:

  • dataframe中的map()映射函数:先创建映射字典,然后映射。适合简单的标签编码
  • sklearn中的LabelEncoder():实例化后,训练即可。适合机器学习项目,自动化程度高
import pandas as pd
data = pd.read_csv(r"D:\机器学习\Python训练营代码【2025.7.30版本】\data.csv")
data.head()

采用map()函数进行标签编码时的具体步骤如下:

  • 提取离散变量,根据实际意义和value_counts()判断是否为有序特征,选择编码方法
  • 定义映射字典,确定编码前后的对应关系。若针对多个列编码,可使用嵌套的方法实现
  • 调用data[].map(mapping_dict)进行编码
  • 检查,对比编码前后
data['Home Ownership'].value_counts()
#定义映射字典
mapping_dict = {
    'Home Ownership':{
        'Own Home':0,
        'Rent':1,
        'Have Mortgage':2,
        'Home Mortgage':3
    }
    'Term':{
        'Short Term':1,
        'Long Term':0
    }
}
#使用map映射函数
data['Home Ownership'] = data['Home Ownership'].map(mapping_dict['Home Ownership'])
data['Home Ownership'].value_counts() #检查

对于“Home Ownership”这一列,选择用标签编码(有序)或者独热编码(无序)都可以。选择的编码方式,看自己的理解。在这里,如果结合实际及个人理解,按照信贷违约风险等级(从小到大)可排序为:Own Home(有自有住房) < Rent(租房) < Have Mortgage(有贷款) < Home Mortgage(有房贷),此时就是一个有序的特征了。从这个例子也可以看出,编码方式的选择并没有那么死板,需根据实际和自己的理解选择合适的方法。

编码前后对比:

注:对于字符串类型,为便于数据处理,也需要映射成整数类型,但这与常规的编码有所不同,是一种特殊的映射方式。此外,对于二分类问题,本质上只有一个自由度,采用标签编码足已。三分类以上问题需要独热编码

归一化与标准化

对于连续变量的处理,可以采用归一化和标准化:

  • 归一化(Normalization):通常是将数据缩放到[0,1]内,常用方法为最小-最大缩放(Min-Max)
  • 标准化(Standardization):原始数据减均值之后,再除以标准差。将数据变换为均值为0,标准差为1的分布

对于归一化和标准化可根据公式定义手写函数实现,也可调用sklearn库中的StandardScaler和 MinMaxScaler函数进行处理。在实际情况中,对连续特征是否处理以及选择什么样的处理方式,可以根据对比实验查看训练结果,来选择合适的方法。

#连续特征处理--归一化
#手写函数
def Min_Max(data):
    minium = data.min()
    maxium = data.max()
    normalized = (data - minium)/(maxium-minium)
    return normalized
norm = Min_Max(data['Annual Income'])
print(norm.head())

在归一化的过程中,发现fit_transform()函数中的参数为双中括号(选中单列或多列),处理的是二维的DataFrame,返回的是二维的numpy数组。因此还需要注意,训练完成后要么赋值回原dataframe(Pandas自动将numpy数组转化为Series),要么手动转化为series,否则是无法调用head()等方法(数据类型不匹配)。

#连续特征处理--归一化
#调用sklearn库
from sklearn.preprocessing import StandardScaler,MinMaxScaler

min_max_scaler = MinMaxScaler()#实例化
data['Annual Income'] = min_max_scaler.fit_transform(data[['Annual Income']]) #训练
data['Annual Income'].head() #检查

#处理同一列,重读数据
data = pd.read_csv(r"D:\机器学习\Python训练营代码【2025.7.30版本】\data.csv")
#标准化
standard_scaler = StandardScaler() #实例化
data['Annual Income'] = standard_scaler.fit_transform(data[['Annual Income']]) #学习+转换
data['Annual Income'].head()  #检查

数据预处理全过程实践

使用心脏数据集实践预处理全流程,结合之前所学,步骤如下:

读取&查看数据

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#读取数据
data = pd.read_csv(r'heart.csv')
data.head() #读取前5行

缺失值&异常值

此处暂时讨论缺失值的情况,原则上还需要分析异常值,基于现在所学知识,暂不讨论异常值。

data.info()

离散特征编码

可以看到数据全为数值型,故根据列的实际意义,手动区分连续特征与离散特征。对于多分类的特征,采用独热编码进行处理,理由如下:

  • 避免错误的数值关系,cp=2 大于cp=1
  • 大多数机器学习算法(线性回归、逻辑回归、SVM、神经网络等)需要数值输入,且不能理解类别之间的顺序关系。
  • 让模型能够正确理解这些特征是分类变量,而不是有数学意义的连续数值。

此处,回顾get_dummies()的用法:

  • data:指定数据,必选
  • columns:指定编码列,列表形式;若data为Series形式则不选
  • drop_first:是否删除第一个类别,默认False
  • prefix:为创建的新列添加前缀,默认为None;若不使用,编码后的列名将直接使用原始值:cp_1,cp_2\1,2,避免含义模糊
  •  pd.get_dummies() 返回的DataFrame包含所有原始列 + 新创建的独热编码列

#对于多分类特征进行独热编码
continous_features = ['age','trestbps','chol','thalach','oldpeak']
discrete_features = ['sex','cp','fbs','restecg','exang','slope','thal']
multi_features = ['cp','restecg','slope','thal']
data = pd.get_dummies(data=data,columns=multi_features,prefix=multi_features) #返回的是新的dataframe+编码列
data.head()

连续特征标准化

进行标准化的原因如下:

  • 公平对待所有特征:避免胆固醇等大范围特征主导模型(特征尺度的影响)
  • 提高算法性能:特别是距离-based和梯度-based算法
  • 加速收敛:减少训练时间,提高稳定性
  • 改善正则化效果:使L1/L2正则化更有效
#对连续特征进行标准化
from sklearn.preprocessing import StandardScaler
standard_scaler = StandardScaler() #实例化
data[continous_features] = standard_scaler.fit_transform(data[continous_features])
data[continous_features].head()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值