python打卡day5

 

离散特征的独热编码

先按照示例代码过一遍,一次性处理data数据中所有的连续变量和离散变量

1. 读取data数据

2. 对离散变量进行one-hot编码

3. 对独热编码后的变量转化为int类型

4. 对所有缺失值进行填充

先说说离散变量,离散变量取值有限,可以是有序或无序的,通常是分类数据或字符串,在 pandas 库里数据类型默认显示为 object 类型。独热编码(One-Hot Encoding)是一种将离散变量转换为二进制向量的方法,好处就是:机器学习算法通常需要数值输入,离散变量经过编码处理能方便后续计算和模型训练;避免类别之间的数值关系误导模型,如果直接将离散变量的类别用数字编码(如0、1、2),模型可能会错误地认为这些数字之间存在大小或顺序关系,而独热编码则不会产生这种误导,每个类别都是独立且平等的,模型可以更好地学习到不同类别之间的差异

一句话总结:独热编码适合没有顺序关系的离散变量类别

(提一下:有序类别用标签编码)

# 错误的编码方式
   颜色 = {'红': 1, '蓝': 2, '绿': 3}
# 这会暗示 绿 > 蓝 > 红,但实际上它们只是类别

# 正确的独热编码
   红 = [1, 0, 0]
   蓝 = [0, 1, 0]
   绿 = [0, 0, 1]
# 这样每个颜色都是独立的,没有数值关系

1.读取data数据

   import pandas as pd
   data = pd.read_csv(r'python60-days-challenge-master\data.csv')
# 昨天的内容都有,不重复了

2.对离散变量进行one-hot编码

2.1找到离散变量

discrete_list = [] # 新建个空列表,存放是离散变量的数据列名
for discrete_col in data.columns: # 遍历每一列
    if data[discrete_col].dtype == 'object': # 列的数据类型为object,即为离散变量
        discrete_list.append(discrete_col)
discrete_list
# 结果是['Home Ownership', 'Years in current job', 'Purpose', 'Term']这四个列为离散变量

(提一下:昨天说将数据的列转换成列表再来遍历每一列方便修改数据,其实不用 tolist()转换成列表也行)

上面说独热编码的前提条件,这四个离散变量的类别都是没有顺序关系的吗?用 value_counts() 看看每个变量的类别,并且顺带统计一下每个类别的个数,下图以前两个变量为例:

2.2离散变量独热编码

data = pd.get_dummies(data, columns=discrete_list) # 独热编码

说明:pd.get_dummies() 函数的 data 参数必须是 pandas 的数据结构(DataFrame、Series),columns 参数指定要进行独热编码的列名,可以是一个包含列名的列表

3. 对独热编码后的变量转化为int类型

有独热编码后的部分截图可知,编码后的数据是布尔值,还需要转换成数值型,如何将独热编码后的新列全部找出来转换?很简单,和最开始的数据进行列的比对,写法很多

# 法一 循环依次填入列表
data_original = pd.read_csv(r'python60-days-challenge-master\data.csv')
add_col_list = [] # 创建一个空列,存放独热编码后多出来的列
for col in data.columns: # 独热编码后的数据进行每一列遍历
    if  col not in data_original.columns:
        add_col_list.append(col)
add_col_list 

# 法二 利用集合差集
add_col_list = list(set(data.columns) - set(data_original.columns))

# 法三 使用列表推导式
add_col_list = [col for col in data.columns if col not in data_original.columns] 

# 法四 使用pandas的difference()找出列(series类型),上面方法找出来列都进入列表里了
add_col_list = data.columns.difference(data_original.columns)

找出来可以进行类型转换了

for col in add_col_list:
    data[col] = data[col].astype(int) # 类型转换,bool型转换为 int 型
data.head()  

4.对所有缺失值进行填充

这个是昨天的内容,不重复了

for col in data.columns:
    if data[col].isnull().sum() > 0: # 有缺失值
        mean = data[col].mean() # 求平均值
        data[col] = data[col].fillna(mean) # 平均值填补
data.isnull().sum() # 看看整个数据还有没有缺失值 

收获心得:

代码肯定还是有优化的地方,比如判断离散变量和独热编码后类型转换都在遍历列,这个操作挺冗余的,更简洁直接的方法也有。其次,具体函数啊,函数有哪些参数啊之类的能熟悉最好,实在记不住,写代码的时候多问问大模型,搞清楚流程才是最重要的

@浙大疏锦行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值