Day 5 离散特征的处理——独热编码

@浙大疏锦行

今日任务:

  1. 读取数据
  2. 找到所有离散特征
  3. 选择一个离散特征进行独热编码
  4. 采取循环对所有离散特征进行独热编码
  5. 处理所有缺失值(回顾day4)

读取数据

#读取数据,查看基本信息
import pandas as pd
data = pd.read_csv(r"D:\机器学习\Python训练营代码【2025.7.30版本】\data.csv")
data.info()

离散特征的识别

特征分为连续特征与离散特征,以下为区别:

  • 连续特征(Continuous):取值为无限的不可数的,可在某个区间取任意值。在pandas中的数据类型常为int64float64等数值类型。
  • 离散特征(Discrete):取值是有限的、可数的,包括分类数据(无序)、有序数据。在pandas中的数据类型通常是objectcategory
  • 但是通过数据类型不是绝对的判断标准,需要根据具体情况进行分析

在信贷数据集中识别离散特征,采用的方法与day 4中处理缺失值类似——遍历列名,判断列的数据类型。

#离散特征的识别
discrete_features = [] #创建空列表存放离散特征
for column in data.columns: #遍历列名
    if data[column].dtype == 'object': #判断
        discrete_features.append(column) #添加
print(discrete_features)

找到离散特征后,可使用value_counts()方法对某列的离散变量分布情况有一定了解,具体来说该方法会,返回该列中每个唯一值及其对应的出现次数,按频数降序(默认)排列。参数如下:

  • ascending:False为降序(默认),True为升序
  • dropna:True为排除NaN(默认),False为包含NaN
  • normalize:显示相对频率(百分比)
data[discrete_features[0]].value_counts(ascending=True)

独热编码One-Hot(单列)

对于无序的离散特征且类别数量较少时,一般采用独热编码进行处理,它会将分类变量转换为二进制向量。而对于有序变量,一般采用标签编码。

进行独热编码时,使用pandas中的get_dummies()函数,具体步骤如下:

  1. 离散变量识别,编码方法选择
  2. 编码:get_dummies()。主要参数有:data(指定数据,必选);columns(指定编码列,列表形式;若data为Series形式则不选);drop_first(是否删除第一个类别,默认False)
  3. 新特征名寻找:为类型转换步骤作铺垫。由于独热编码后会根据分类变量将原列进行拆分,即增加新的特征名。可通过对比编码前后的列名,找到新特征名
  4. 类型转换:astype()。由于编码后的值为bool型,不方便后续处理,故而使用astype()方法进行转换为数值型int
#单列离散特征独热编码
df = pd.get_dummies(data,columns=[discrete_features[1]]) #某列编码
df.columns #查看列
df.dtypes #查看类型
#寻找新特征名
new_features = []
for i in df.columns:
    if i not in data.columns:
        new_features.append(i)
print(new_features)
# df.columns.difference(data.columns) 
#类型转换
for j in new_features:
    df[j] = df[j].astype(int) #返回新列
df.dtypes

转换前新列均为bool型:

转换后,为int64:

注:找新特征名时,可选择嵌套语句实现,也可使用data.columns.difference(other:要排除的列名列表或数组,sort=True)可实现,返回当前列名中不在 other 参数中的列名,即计算差集。

所有离散特征进行编码(多列循环)

此处处理方法与Day 4缺失值处理方法基本类似。

由于get_dummies方法中columns参数接受的是list形式,因此采用for循环将离散特征提取至list中,然后直接独热编码、类型转换即可。

#离散特征的识别
discrete_features = []
for column in data.columns:
    if data[column].dtype == 'object':
        discrete_features.append(column)
print(discrete_features)
#多列循环处理
df = pd.get_dummies(data,columns=discrete_features,drop_first=True) #去除第一个类别列,减少维度
df.columns
new_features = df.columns.difference(data.columns) #新列寻找
for j in new_features:
    df[j] = df[j].astype(int) #类型转换,返回新列
df.dtypes #检查

缺失值处理

此处回顾Day 4处理缺失值的步骤:

  • 找存在缺失值的列
  • 计算均值(均值填充为例)
  • fillna()填充
  • 检查
#缺失值处理
df.isnull().sum() #查看整体情况
#使用均值处理
for column in df.columns.tolist():
    if df[column].isnull().sum() > 0:
        mean_filled = df[column].mean() #计算
        df[column] = df[column].fillna(mean_filled) #填充
df.isnull().sum() #检查

最终经过独热编码和缺失值处理的结果如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值