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

一、字典的简单介绍

字典(dict):{  }

通过 key 找到是相关联的另一个数据 value ,由一个个 键值对 组成

# 定义字典
my_dict = {"周杰伦":99, "张三":90, "阿里":89}

# 定义空字典
my_dict_empty = {}
my_dict_empty = dict()

# 定义重复key的字典(不允许重复,重复相当于覆盖)
my_dict = {"周杰伦":100, "周杰伦":90, "阿里":89}
print(my_dict) # 输出:{"周杰伦":90, "阿里":89}

# 从字典中基于key获取value 无索引0 1 2...
my_dict = {"周杰伦":99, "张三":90, "阿里":89}
score = my_dict["张三"]
print(score)  # 输出:90

# 定义嵌套字典 key不能为字典
stu_score_dict = {
    '王力宏': {
        '语文': 77,
        '数学': 66,
        '英语': 33
    },
    '周杰伦': {
        '语文': 88,
        '数学': 86,
        '英语': 55
    },
    '林俊杰': {
        '语文': 95,
        '数学': 85,
        '英语': 76
    }
}
print(f'学生的考试信息为:{stu_score_dict}')

# 从嵌套字典中获取数据
score1 = stu_score_dict['王力宏']['数学']
print(f'王力宏的数学成绩为:{score1}')

 字典常用操作:

# 新增和修改 key不存在时为新增,key存在时为修改
字典[key] = value

# 删除 传入一个key,能取到对应的value,同时删除key和value
字典.pop[key]

# 清空  
字典.clear()

# 获取全部的key 用来遍历  字典.keys()
my_dict = {"周杰伦":99, "周杰伦":90, "阿里":89}
keys = my_dict.keys()
print(keys)  # 输出:dict_keys(['周杰伦', '王力宏', '阿里'])

# 遍历字典
for key in keys:
  value = my_dict[key]
  print(f'{key}的value值为:{value}')
# 或者	
for key in my_dict:
  value = my_dict[key]
  print(f'{key}的value值为:{value}')
"""
输出:
	周杰伦的value值为:99
	王力宏的value值为:90
	阿里的value值为:89
"""

# 统计字典内元素数量
count = len(my_dict)
编号操作说明
1字典[Key]获取指定Key对应的Value值
2字典[Key] = Value添加或更新键值对
3字典.pop(Key)取出Key对应的Value并在字典内删除此Key的键值对
4字典.clear()清空字典
5字典.keys()获取字典的全部Key,可用于for循环遍历字典
6len(字典)计算字典内的元素数量

读取数据

import pandas as pd
dt = pd.read_csv('data.csv')

二、标签编码

  • 对离散特征的处理中

- 前边学习了对没有顺序和大小关系的离散特征进行独热编码,借助pd.get_dummies()方法

- 今天学习对有顺序和大小关系的离散特征进行标签编码,借助dataframe的map()函数

  • 标签编码为离散特征的每个不同取值分配一个唯一的整数。

- 例如:动物特征下有 3 个取值:猫、狗、马,我们可以将其编码为 0、1、2。

1、对Home Ownership特征进行标签编码:

        这里对Home Ownership进行标签编码,实际上也可以对它进行独热编码,最终模型效果哪种好保留哪个

# 查看特征Home Ownership的前五行
dt['Home Ownership'].head()

输出:

0         Own Home
1         Own Home
2    Home Mortgage
3         Own Home
4             Rent
Name: Home Ownership, dtype: object

# 查看特征下各类别出现的次数
dt['Home Ownership'].value_counts()

输出:

Home Ownership
Home Mortgage    3637
Rent             3204
Own Home          647
Have Mortgage      12
Name: count, dtype: int64
  1. Home Mortgage    有房贷
  2. Rent             租房
  3. Own Home         拥有自有住房,无贷款
  4. Have Mortgage    无房贷,有其他贷款

- 按照贷款风险程度(抗风险能力)依次是:自有住房<租房<有其他贷款<有房贷  

1.定义映射字典

# 定义映射字典mapping
mapping = {
  'Home Mortgage': 3,
  'Rent': 1,
  'Own Home': 0,
  'Have Mortgage': 2
}

2.进行映射

dt['Home Ownership'] = dt['Home Ownership'].map(mapping)
dt['Home Ownership'].head()

输出映射后前5行:

0    0
1    0
2    3
3    0
4    1
Name: Home Ownership, dtype: int64

原来为:

0         Own Home
1         Own Home
2    Home Mortgage
3         Own Home
4             Rent
Name: Home Ownership, dtype: object

类型是字符串时,也需要映射成整数类型,这里不要理解成独热编码或者标签编码

二分类问题不需要进行独热编码:

例如 性别 特征,分类有男和女,不需要编码成 性别_男 和 性别_女 两个特征,如果编码成两个特征那么 性别_男=1 就说明 性别_女 必定等于0,这样两个特征具有很强的相关性。

性别_男=1的含义是:性别是男;性别_男=0的含义是:性别不是男。

三分类问题及以上才需要才涉及独热编码

2、对Term特征进行标签编码:

# 查看Term特征下的类别有哪些
dt['Term'].value_counts()

输出:

Term
Short Term    5556
Long Term     1944
Name: count, dtype: int64

1.映射字典和映射

# 定义映射字典
mapping = {
  'Short Term': 0,
  'Long Term':1
}
# map方法进行映射
dt['Term'] = dt['Term'].map(mapping)
dt['Term'].head()

输出:

0    0
1    1
2    0
3    0
4    0
Name: Term, dtype: int64

3、嵌套字典进行映射

实际上,可以调用一次函数实现上述两次标签编码,因为字典可以嵌套

import pandas as pd
dt = pd.read_csv('data.csv')

# 定义映射字典
mapping = {
  'Home Ownership' :{
  'Home Mortgage': 3,
  'Rent': 1,
  'Own Home': 0,
  'Have Mortgage': 2
  },
  'Term' :{
    'Short Term': 0,
    'Long Term':1
  }
}
mapping['Term']  # 访问嵌套字典的值,此时又是一个字典

输出:

{'Short Term': 0, 'Long Term': 1}

分别对Home Ownership 和 Term 进行映射:

# 对Home Ownership进行映射
dt['Home Ownership'] = dt['Home Ownership'].map(mapping['Home Ownership'])

# 对Term进行映射
dt['Term'] = dt['Term'].map(mapping['Term'])
dt.head()

三、连续变量的处理

归一化标准化可以通过 手写函数 实现,也可以通过 sklearn库 中的函数实现

1、手动构建函数

# 对列Annual Income做归一化,手动构建函数实现
def manual_normalize(data):
  """
  此函数用于对数据的数据进行归一化
  :param data:输入的一维数据(如 Pandas 的 Series)
  :return:归一化后的数据
  """
  min_val = data.min()
  max_val = data.max()
  normalized_data = (data - min_val) / (max_val - min_val)
  return normalized_data

# 对列Annual Income做归一化
dt['Annual Income'] = manual_normalize(dt['Annual Income'])
# 查看归一化后的 年收入
dt['Annual Income']

输出:

0       0.031798
1       0.086221
2       0.058771
3       0.064145
4       0.061260
          ...   
7495    0.023796
7496    0.137148
7497    0.171693
7498         NaN
7499         NaN
Name: Annual Income, Length: 7500, dtype: float64

2、借助sklearn库进行归一化:

# 借助sklearn库进行归一化
from sklearn.preprocessing import StandardScaler, MinMaxScaler
dt = pd.read_csv('data.csv')

# 归一化处理 
min_max_scaler = MinMaxScaler()  # 实例化 MinMaxScaler类,采用这种导入函数的方式,不需要申明库名
# 将结果覆盖原列
dt['Annual Income'] = min_max_scaler.fit_transform(dt[['Annual Income']])
dt['Annual Income'].head()

输出:

0    0.031798
1    0.086221
2    0.058771
3    0.064145
4    0.061260
Name: Annual Income, dtype: float64

注:

1、 使用 “from 模块名 import  类、变量、方法” 导入,使用时无需再写库明,例如sklearn.preprocessing.MinMaxScaler

2、dt['Annual Income'] = min_max_scaler.fit_transform(dt[['Annual Income']])

作用:对 dt 中的 'Annual Income' (年收入)列进行归一化处理,并将结果覆盖原列。
fit_transform 是 MinMaxScaler 的核心方法,包含两步操作:

(1)fit :计算该列数据的最小值( min )和最大值( max ),保存为 min_max_scaler 实例的内部属性。

(2)transform :根据公式 (X - X.min()) / (X.max() - X.min()) ,将数据缩放到 [0,1] 区间。

3、 dt[['Annual Income']] 是取列的二维形式(DataFrame),因为 fit_transform 要求输入为二维数组。

3、借助sklearn库进行标准化:

# 标准化
dt = pd.read_csv('data.csv')

scaler = StandardScaler()  # 实例化
dt['Annual Income'] = scaler.fit_transform(dt[['Annual Income']])
dt['Annual Income'].head()

输出:

0   -1.046183
1   -0.403310
2   -0.727556
3   -0.664078
4   -0.698155
Name: Annual Income, dtype: float64

注:

Home Ownership下的类别明明是str类型,为什么显示为object(对象)类型?  

        dtype: object 表示该列(Series)的数据类型为 对象类型 (object type),通常用于存储 混合类型数据 或 字符串数据 。

        dtype: object 是 pandas 对“无法归类为数值/布尔等基础类型”的列的通用标识,最常见于存储文本或混合类型的数据。

四、对心脏病数据集中连续特征进行处理

import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 读取数据
dt = pd.read_csv('heart.csv')
# 原名不容易理解,换个名
dt.columns = ['age', 
              'sex', 
              'chest_pain_type', 
              'resting_blood_pressure', 
              'cholesterol', 
              'fasting_blood_sugar', 
              'rest_ecg', 
              'max_heart_rate_achieved',
              'exercise_induced_angina', 
              'st_depression', 
              'st_slope', 
              'num_major_vessels', 
              'thalassemia', 'target']
dt.head()
agesexchest_pain_typeresting_blood_pressurecholesterolfasting_blood_sugarrest_ecgmax_heart_rate_achievedexercise_induced_anginast_depressionst_slopenum_major_vesselsthalassemiatarget
063131452331015002.30011
137121302500118703.50021
241011302040017201.42021
356111202360117800.82021
4570012035401

对resting_blood_pressure标准化,cholesterol归一化

# 实例化
st_scaler = StandardScaler()
# 标准化
dt['resting_blood_pressure'] = st_scaler.fit_transform(dt[['resting_blood_pressure']])
print(dt['resting_blood_pressure'].head())

# 实例化
min_max_scaler = MinMaxScaler()
# 归一化
dt['cholesterol'] = min_max_scaler.fit_transform(dt[['cholesterol']])
print(dt['cholesterol'].head())

输出:

0    0.763956
1   -0.092738
2   -0.092738
3   -0.663867
4   -0.663867
Name: resting_blood_pressure, dtype: float64
0    0.244292
1    0.283105
2    0.178082
3    0.251142
4    0.520548
Name: cholesterol, dtype: float64

@浙大疏锦行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值