Python训练营Day8实战进阶指南

一、字典的简单介绍

可以去b站找个视频 或者 csdn找个帖子看下字典的简单介绍—-锻炼下自学能力

但是目前我们只会用到映射这个用法,他需要传入的是字典,因为字典的键值对,键是唯一的,值可以重复。这很符合数据的特征是固定的,但是值可以变化这个特性。

所以后续想完成新的映射,直接修改字典的键值对即可。

输入:

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

dict

输出:

{'name': 'Alice', 'age': 25, 'city': 'New York'}

代码解释:

{'name': 'Alice', 'age': 25, 'city': 'New York'} 是一个字典字面量,使用花括号 {} 创建。字典由键值对组成,键和值之间用冒号 : 分隔,不同键值对之间用逗号 , 分隔。这里的键分别是 'name' 、 'age' 和 'city' ,对应的值分别是 'Alice' 、 25 和 'New York' 。

输入:

dict['name']  # 访问字典中的值

输出:

'Alice'

二、标签编码

之前介绍了离散数据 如果是不存在顺序,则采用独热编码,函数为pd.get_dummies()

现在介绍对于存在顺序和大小关系的离散特征,做好标签编码,借助dataframe的map函数即可实现

输入:

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

输入:

data.head()

输出:

这里我们给Home Oweners来完成标签编码,实际上这个特征也可以独热编码,取决于你的理解。实际中,都试一下 ,谁训练出来的模型好选谁。

输入:

data["Home Ownership"].value_counts()

输出:

Home Mortgage    3637
Rent             3204
Own Home          647
Have Mortgage      12
Name: Home Ownership, dtype: int64

  • 住房抵押贷款:3637   这个是有房贷,有房子
  • 租房:3204     没房子
  • 拥有自有住房:647    这个没贷款,有房子
  • 有贷款:12   这个是有其他贷款,有房子,没房贷
  • 名称:房屋所有权,数据类型:int64
  • 上面这些翻译也不一定对,这是我个人对数据的理解。

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

    所以按照这个逻辑来进行编码

    输入:

    # 定义映射字典
    mapping = {
            "Rent": 0,
            "Own Home": 1,
            "Have Mortgage  ": 2,
            "Home Mortgage": 3
        
    }
    data["Home Ownership"].head()

    输出:

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

    输入:

    data["Home Ownership"] = data["Home Ownership"].map(mapping)
    data["Home Ownership"].head()

    输出:

    0    1.0
    1    1.0
    2    3.0
    3    1.0
    4    0.0
    Name: Home Ownership, dtype: float64

    代码解释:

    .map(mapping) : map() 是 pandas 中 Series 对象的方法,它会根据传入的映射关系 mapping (一个字典),将 Series 中的每个值替换为 mapping 字典中对应的值。如果 Series 中的某个值在 mapping 字典中不存在,那么该值会被替换为 NaN 。

    输入:

    data["Term"].value_counts()

    输出:

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

    对于字符串类型 我们也要映射成整数类型,这里不要理解为标签编码或者独热编码

    二分类的问题不需要独热编码,比如性别这个特征,男女不需要变成2个特征,性别男 性别女 。因为他们二者自由度为1,如果是2个特征的话,性别男=1,那么性别女必定等于0.这样特征高度相关,没有价值。

    此时这个特征的含义不是性别,而是:是否为男性,1是男性,0是非男。

    三分类以上才涉及独热编码

    输入:

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

    输出:

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

    实际上借助一个映射函数也可以实现上面2次编码

    字典的键值对可以嵌套字典

    输入:

    import pandas as pd
    
    # 重新读取数据
    data = pd.read_csv("data.csv")
    # 嵌套映射字典
    mapping = {
        "Term": {
            "Short Term": 1,
            "Long Term": 0
        },
        "Home Ownership": {
            "Rent": 0,
            "Own Home": 1,
            "Have Mortgage  ": 2,
            "Home Mortgage": 3
        }
    }

    输入:

    mapping["Term"] # 访问嵌套字典中的值,此时他又是一个字典

    输出:

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

    输入:

    # 对 Home Ownership 列进行映射
    data["Home Ownership"] = data["Home Ownership"].map(mapping["Home Ownership"])
    
    # 对 Term 列进行映射
    data["Term"] = data["Term"].map(mapping["Term"])
    
    data.head()

    输出:

    三、连续变量的处理

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

    输入:

    # 对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
    data['Annual Income'] = manual_normalize(data['Annual Income'])
    data['Annual Income'].head()

    输出:

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

    逐行解释:

    def manual_normalize(data):

    def manual_normalize(data): :定义了一个名为 manual_normalize 的函数,它接收一个参数 data ,这个参数代表要进行归一化处理的数据。

        min_val = data.min()
        max_val = data.max()
  • min_val = data.min() :调用 data 对象的 min() 方法,找出输入数据中的最小值,并将其赋值给变量 min_val 。
  • max_val = data.max() :调用 data 对象的 max() 方法,找出输入数据中的最大值,并将其赋值给变量 max_val 。
  •     normalized_data = (data - min_val) / (max_val - min_val)

    这行代码实现了归一化的核心逻辑。归一化公式为 $x_{normalized} = \frac{x – x_{min}}{x_{max} – x_{min}}$,这里将输入数据 data 减去最小值 min_val ,再除以最大值与最小值的差值 max_val – min_val ,得到归一化后的数据,并将结果赋值给 normalized_data 。

        return normalized_data

    这行代码将归一化后的数据作为函数的返回值,结束函数的执行。

    data['Annual Income'] = manual_normalize(data['Annual Income'])

    这行代码调用 manual_normalize 函数对 data 数据框中的 Annual Income 列进行归一化处理,并将归一化后的结果重新赋值给 data 数据框的 Annual Income 列,完成该列数据的更新。

    data['Annual Income'].head()

    调用 head() 方法查看 data 数据框中 Annual Income 列归一化后的前 5 行数据,方便检查归一化操作是否成功。

    输入:

    # 借助sklearn库进行归一化处理
    
    from sklearn.preprocessing import StandardScaler, MinMaxScaler
    data = pd.read_csv("data.csv")# 重新读取数据
    
    
    # 归一化处理
    min_max_scaler = MinMaxScaler() # 实例化 MinMaxScaler类,之前课上也说了如果采取这种导入函数的方式,不需要申明库名
    data['Annual Income'] = min_max_scaler.fit_transform(data[['Annual Income']])
    
    data['Annual Income'].head()

    输出:

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

    逐行解释:

    from sklearn.preprocessing import StandardScaler, MinMaxScaler

    从 sklearn 库的 preprocessing 模块导入 StandardScaler 和 MinMaxScaler 类。

  • StandardScaler :用于数据的标准化处理,将数据转换为均值为 0,标准差为 1 的分布。
  • MinMaxScaler :用于数据的归一化处理,将数据缩放到 [0, 1] 区间。
  • data = pd.read_csv("data.csv")

    这里使用 pandas 库的 read_csv 函数读取 data.csv 文件,并将读取的数据存储在 data 这个 DataFrame 对象中。注意,代码里使用了 pd ,这意味着之前应该已经导入了 pandas 库( import pandas as pd )。

    min_max_scaler = MinMaxScaler()

    实例化了 MinMaxScaler 类,创建了一个 min_max_scaler 对象,后续会用这个对象来对数据进行归一化处理。

    data['Annual Income'] = min_max_scaler.fit_transform(data[['Annual Income']])

    fit_transform 是 MinMaxScaler 对象的方法,它完成了两个操作:

  • fit :计算数据的最小值和最大值,确定归一化的范围。
  • transform :根据计算得到的范围对数据进行归一化处理。
  • data[['Annual Income']] 传递的是一个二维数组,因为 fit_transform 方法要求输入是二维数组。处理后的数据会覆盖 data 里 Annual Income 列原来的数据。

    data['Annual Income'].head()

    调用 head 方法查看 data 中 Annual Income 列归一化后的前 5 行数据,方便检查归一化操作是否成功。

    知识点:

    在代码 data[['Annual Income']] 里使用两个中括号,是因为 min_max_scaler.fit_transform() 方法要求输入是二维数组(在 pandas 里对应 DataFrame 类型),下面详细解释:

    1. pandas 中单个中括号与双个中括号的区别
    单个中括号 :当你使用单个中括号 data['Annual Income'] 时,返回的是一个 pandas.Series 对象,这是一维的数据结构。 Series 可以理解为带有索引的一维数组。
    双个中括号 :使用双个中括号 data[['Annual Income']] 时,返回的是一个 pandas.DataFrame 对象,这是二维的数据结构。 DataFrame 可以看作是由多个 Series 组成的表格,每一列都是一个 Series 。
    2. fit_transform() 方法的输入要求
    MinMaxScaler 类的 fit_transform() 方法要求输入是二维数组。 DataFrame 符合这个要求,因为它是二维的数据结构;而 Series 是一维的,不满足 fit_transform() 方法的输入要求。如果传入 Series ,会引发错误。

    综上所述,代码里使用两个中括号 data[['Annual Income']] 是为了确保传递给 fit_transform() 方法的是二维的 DataFrame 对象,从而避免报错。

    输入:

    # 标准化处理
    data = pd.read_csv("data.csv")# 重新读取数据
    scaler = StandardScaler() # 实例化 StandardScaler,
    data['Annual Income'] = scaler.fit_transform(data[['Annual Income']])
    data['Annual Income'].head()

    输出:

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

    至此,常见的预处理方式都说完了

    作业:对心脏病数据集的特征用上述知识完成,一次性用所有的处理方式完成预处理,尝试手动完成,多敲几遍代码。

    输入:

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

    输出:

    输入:

    data["cp"].value_counts()

    输出:

    cp
    0    143
    2     87
    1     50
    3     23
    Name: count, dtype: int64

    输入:

    # 定义映射字典
    cp = {
            0: 0,
            1: 1,
            2: 2,
            3: 3
        
    }
    data["cp"].head()

    输出:

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

    输入:

    data["cp"] = data["cp"].map(cp)
    data["cp"].head()

    输出:

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

    输入:

    # 借助sklearn库进行归一化处理
    
    from sklearn.preprocessing import StandardScaler, MinMaxScaler
    data = pd.read_csv("heart.csv")# 重新读取数据
    
    
    # 归一化处理
    min_max_scaler = MinMaxScaler() # 实例化 MinMaxScaler类,之前课上也说了如果采取这种导入函数的方式,不需要申明库名
    data['oldpeak'] = min_max_scaler.fit_transform(data[['oldpeak']])
    
    data['oldpeak'].head()

    输出:

    0    0.370968
    1    0.564516
    2    0.225806
    3    0.129032
    4    0.096774
    Name: oldpeak, dtype: float64

    输入:

    0    0.370968
    1    0.564516
    2    0.225806
    3    0.129032
    4    0.096774
    Name: oldpeak, dtype: float64

    输入:

    # 标准化处理
    data = pd.read_csv("heart.csv")# 重新读取数据
    scaler = StandardScaler() # 实例化 StandardScaler,
    data['oldpeak'] = scaler.fit_transform(data[['oldpeak']])
    data['oldpeak'].head()

    输出:

    0    1.087338
    1    2.122573
    2    0.310912
    3   -0.206705
    4   -0.379244
    Name: oldpeak, dtype: float64

    @浙大疏锦行

    作者:低维歌者

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python训练营Day8实战进阶指南

    发表回复