• 用于机器学习的 Pandas(ML)


    🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

    📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

    🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

    📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

     🖍foreword

    ✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

    如果你对这个系列感兴趣的话,可以关注订阅哟👋

    文章目录

     设置

    加载数据

    探索性数据分析 (EDA)

    过滤

    排序

    分组

    索引

    预处理

    特征工程

    保存数据

    缩放​​​​​​​

     设置

    首先,我们将导入 NumPy 和 Pandas 库并设置可重复性的种子。我们还将将要使用的数据集下载到磁盘上。

    1. import numpy as np
    2. import pandas as pd
    1. # Set seed for reproducibility
    2. np.random.seed(seed=1234)

    加载数据

    我们将使用Titanic 数据集,该数据集包含有关 1912 年登上 RMS Titanic 的人员的数据,以及他们是否在探险中幸存下来。这是一个非常常见且丰富的数据集,非常适合使用 Pandas 进行探索性数据分析。

    让我们将 CSV 文件中的数据加载到 Pandas 数据框中。header=0表示第一行(第 0 个索引)是标题行,其中包含数据集中每一列的名称。

    1. # Read from CSV to Pandas DataFrame
    2. url = "https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/titanic.csv"
    3. df = pd.read_csv(url, header=0)
    1. # First few items
    2. df.head(3)
    pclassnamesexagesibspparchticketfarecabinembarkedsurvived
    01Allen, Miss. Elisabeth Waltonfemale29.00000024160211.3375B5S1
    11Allison, Master. Hudson Trevormale0.916712113781151.5500C22 C26S1
    21Allison, Miss. Helen Lorainefemale2.000012113781151.5500C22 C26S0

    这些是不同的功能:

    • class: 旅行等级
    • name: 乘客全名
    • sex: 性别
    • age: 数字年龄
    • sibsp: # 兄弟姐妹/配偶
    • parch: 父母/孩子的人数
    • ticket: 票号
    • fare: 票价
    • cabin: 房间位置
    • embarked: 乘客登船的港口
    • survived:生存指标(0 - 死亡,1 - 幸存)

    探索性数据分析 (EDA)

    现在我们加载了数据,我们准备开始探索它以查找有趣的信息。

    import matplotlib.pyplot as plt

    我们可以.describe()用来提取一些关于我们的数值特征的标准细节。

    1. # Describe features
    2. df.describe()
    pclassagesibspparchfaresurvived
    count1309.0000001046.0000001309.0000001309.0000001308.0000001309.000000
    mean2.29488229.8811350.4988540.38502733.2954790.381971
    std0.83783614.4135001.0416580.86556051.7586680.486055
    min1.0000000.1667000.0000000.0000000.0000000.000000
    25%2.00000021.0000000.0000000.0000007.8958000.000000
    50%3.00000028.0000000.0000000.00000014.4542000.000000
    75%3.00000039.0000001.0000000.00000031.2750001.000000
    max3.00000080.0000008.0000009.000000512.3292001.000000
    1. # Correlation matrix
    2. plt.matshow(df.corr())
    3. continuous_features = df.describe().columns
    4. plt.xticks(range(len(continuous_features)), continuous_features, rotation="45")
    5. plt.yticks(range(len(continuous_features)), continuous_features, rotation="45")
    6. plt.colorbar()
    7. plt.show()

    我们还可以.hist()用来查看每个特征值的直方图。

    1. # Histograms
    2. df["age"].hist()

    1. # Unique values
    2. df["embarked"].unique()
    array(['S', 'C', nan, 'Q'], dtype=object)
    

    过滤

    我们可以按特征过滤数据,甚至可以按特定特征中的特定值(或值范围)过滤数据。

    1. # Selecting data by feature
    2. df["name"].head()

    0                      Allen, Miss. Elisabeth Walton
    1                     Allison, Master. Hudson Trevor
    2                       Allison, Miss. Helen Loraine
    3               Allison, Mr. Hudson Joshua Creighton
    4    Allison, Mrs. Hudson J C (Bessie Waldo Daniels)
    Name: name, dtype: object
    
    1. # Filtering
    2. df[df["sex"]=="female"].head() # only the female data appear
    pclassnamesexagesibspparchticketfarecabinembarkedsurvived
    01Allen, Miss. Elisabeth Waltonfemale29.00024160211.3375B5S1
    21Allison, Miss. Helen Lorainefemale2.012113781151.5500C22 C26S0
    41Allison, Mrs. Hudson J C (Bessie Waldo Daniels)female25.012113781151.5500C22 C26S0
    61Andrews, Miss. Kornelia Theodosiafemale63.0101350277.9583D7S1
    81Appleton, Mrs. Edward Dale (Charlotte Lamson)female53.0201176951.4792C101S1

    排序

    我们还可以按升序或降序对特征进行排序。

    1. # Sorting
    2. df.sort_values("age", ascending=False).head()

    pclassnamesexagesibspparchticketfarecabinembarkedsurvived
    141Barkworth, Mr. Algernon Henry Wilsonmale80.0002704230.0000A23S1
    611Cavendish, Mrs. Tyrell William (Julia Florence...female76.0101987778.8500C46S1
    12353Svensson, Mr. Johanmale74.0003470607.7750NaNS0
    1351Goldschmidt, Mr. George Bmale71.000PC 1775434.6542A5C0
    91Artagaveytia, Mr. Ramonmale71.000PC 1760949.5042NaNC0

    分组

    我们还可以获取某些组的功能统计信息。在这里,我们希望看到基于乘客是否幸存的连续特征的平均值。

    1. # Grouping
    2. survived_group = df.groupby("survived")
    3. survived_group.mean()

    survivedpclassagesibspparchfare
    02.50061830.5453690.5216320.32880123.353831
    11.96200028.9182280.4620000.47600049.361184

    索引

    我们可以iloc用来获取数据框中特定位置的行或列。

    1. # Selecting row 0
    2. df.iloc[0, :]

    pclass                                  1
    name        Allen, Miss. Elisabeth Walton
    sex                                female
    age                                    29
    sibsp                                   0
    parch                                   0
    ticket                              24160
    fare                              211.338
    cabin                                  B5
    embarked                                S
    survived                                1
    Name: 0, dtype: object
    
    1. # Selecting a specific value
    2. df.iloc[0, 1]
    'Allen, Miss. Elisabeth Walton'
    

    预处理

    探索之后,我们可以清理和预处理我们的数据集。

    1. # Rows with at least one NaN value
    2. df[pd.isnull(df).any(axis=1)].head()
    pclassnamesexagesibspparchticketfarecabinembarkedsurvived
    91Artagaveytia, Mr. Ramonmale71.000PC 1760949.5042NaNC0
    131Barber, Miss. Ellen "Nellie"female26.0001987778.8500NaNS1
    151Baumann, Mr. John DmaleNaN00PC 1731825.9250NaNS0
    231Bidois, Miss. Rosaliefemale42.000PC 17757227.5250NaNC1
    251Birnbaum, Mr. Jakobmale25.0001390526.0000NaNC0
    1. # Drop rows with Nan values
    2. df = df.dropna() # removes rows with any NaN values
    3. df = df.reset_index() # reset's row indexes in case any rows were dropped
    4. df.head()

    indexpclassnamesexagesibspparchticketfarecabinembarkedsurvived
    001Allen, Miss. Elisabeth Waltonfemale29.00000024160211.3375B5S1
    111Allison, Master. Hudson Trevormale0.916712113781151.5500C22 C26S1
    221Allison, Miss. Helen Lorainefemale2.000012113781151.5500C22 C26S0
    331Allison, Mr. Hudson Joshua Creightonmale30.000012113781151.5500C22 C26S0
    441Allison, Mrs. Hudson J C (Bessie Waldo Daniels)female25.000012113781151.5500C22 C26S0
    1. # Dropping multiple columns
    2. df = df.drop(["name", "cabin", "ticket"], axis=1) # we won't use text features for our initial basic models
    3. df.head()
    indexpclasssexagesibspparchfareembarkedsurvived
    001female29.000000211.3375S1
    111male0.916712151.5500S1
    221female2.000012151.5500S0
    331male30.000012151.5500S0
    441female25.000012151.5500S0
    1. # Map feature values
    2. df["sex"] = df["sex"].map( {"female": 0, "male": 1} ).astype(int)
    3. df["embarked"] = df["embarked"].dropna().map( {"S":0, "C":1, "Q":2} ).astype(int)
    4. df.head()
    indexpclasssexagesibspparchfareembarkedsurvived
    001029.000000211.337501
    11110.916712151.550001
    22102.000012151.550000
    331130.000012151.550000
    441025.000012151.550000

    特征工程

    我们现在将使用特征工程来创建一个名为family_size. 我们将首先定义一个名为的函数,该函数get_family_size将使用父母和兄弟姐妹的数量来确定家庭规模

    1. # Lambda expressions to create new features
    2. def get_family_size(sibsp, parch):
    3. family_size = sibsp + parch
    4. return family_size

    一旦我们定义了函数,我们就可以在每一行上使用lambdaapply函数(使用每行中兄弟姐妹和父母的数量来确定每行的家庭规模)。

    1. df["family_size"] = df[["sibsp", "parch"]].apply(lambda x: get_family_size(x["sibsp"], x["parch"]), axis=1)
    2. df.head()

    indexpclasssexagesibspparchfareembarkedsurvivedfamily_size
    001029.000000211.3375010
    11110.916712151.5500013
    22102.000012151.5500003
    331130.000012151.5500003
    441025.000012151.5500003

    1. # Reorganize headers
    2. df = df[["pclass", "sex", "age", "sibsp", "parch", "family_size", "fare", '"mbarked", "survived"]]
    3. df.head()

    pclasssexagesibspparchfamily_sizefareembarkedsurvived
    01029.0000000211.337501
    1110.9167123151.550001
    2102.0000123151.550000
    31130.0000123151.550000
    41025.0000123151.550000

    保存数据

    最后,让我们将预处理后的数据保存到一个新的 CSV 文件中以备后用

    1. # Saving dataframe to CSV
    2. df.to_csv("processed_titanic.csv", index=False)
    1. # See the saved file
    2. !ls -l

    total 96
    -rw-r--r-- 1 root root  6975 Dec  3 17:36 processed_titanic.csv
    drwxr-xr-x 1 root root  4096 Nov 21 16:30 sample_data
    -rw-r--r-- 1 root root 85153 Dec  3 17:36 titanic.csv
    

    缩放

    当处理非常大的数据集时,我们的 Pandas DataFrames 可能会变得非常大,并且对它们进行操作可能会非常慢或不可能。这就是可以分配工作负载或在更高效的硬件上运行的软件包可以派上用场的地方。

    • Dask:并行计算以在一台/多台机器上扩展 Numpy、Pandas 和 scikit-learn 等软件包。
    • cuDF:GPU 上的高效数据帧加载和计算。

    而且,当然,我们可以将这些组合在一起(Dask-cuDF)在 GPU 上对数据帧的分区进行操作。

  • 相关阅读:
    docker命令详解
    搜款网VVIC商品详情API接口
    【小月电子】FPGA开发板(Spirit_V4)系统学习教程-LESSON2 LED灯闪烁
    chinese-stable-diffusion中文场景文生图prompt测评集合
    python 之enumerate()函数
    Vue组件间的通信【子传父,父传子,同级传递,爷孙传递】
    DPDK之eventdev_pipeline源码解析
    Go类型type
    Golang常量iota
    git使用
  • 原文地址:https://blog.csdn.net/sikh_0529/article/details/126885712