用于机器学习的 Pandas(ML)

本文档详细介绍了如何使用Pandas库进行数据加载、探索性数据分析(EDA)、过滤、排序、分组、索引、预处理和特征工程等步骤。通过Titanic数据集展示了如何处理缺失值、创建新特征以及保存处理后的数据。内容涵盖了数据清洗、统计分析和数据可视化等方面。
摘要由CSDN通过智能技术生成

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

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

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

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

 🖍foreword

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

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

文章目录

 设置

加载数据

探索性数据分析 (EDA)

过滤

排序

分组

索引

预处理

特征工程

保存数据

缩放​​​​​​​

 设置

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

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

加载数据

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

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


# Read from CSV to Pandas DataFrame
url = "https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/titanic.csv"
df = pd.read_csv(url, header=0)
# First few items
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()用来提取一些关于我们的数值特征的标准细节。


# Describe features
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
# Correlation matrix
plt.matshow(df.corr())
continuous_features = df.describe().columns
plt.xticks(range(len(continuous_features)), continuous_features, rotation="45")
plt.yticks(range(len(continuous_features)), continuous_features, rotation="45")
plt.colorbar()
plt.show()

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

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

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

过滤

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

# Selecting data by feature
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

# Filtering
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

排序

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

# Sorting
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

分组

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

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

survivedpclassagesibspparchfare
02.50061830.5453690.5216320.32880123.353831
11.96200028.9182280.4620000.47600049.361184

索引

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


# Selecting row 0
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
# Selecting a specific value
df.iloc[0, 1]
'Allen, Miss. Elisabeth Walton'

预处理

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


# Rows with at least one NaN value
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

# Drop rows with Nan values
df = df.dropna() # removes rows with any NaN values
df = df.reset_index() # reset's row indexes in case any rows were dropped
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
# Dropping multiple columns
df = df.drop(["name", "cabin", "ticket"], axis=1) # we won't use text features for our initial basic models
df.head()
indexpclasssexagesibspparchfareembarkedsurvived
001female29.000000211.3375S1
111male0.916712151.5500S1
221female2.000012151.5500S0
331male30.000012151.5500S0
441female25.000012151.5500S0

# Map feature values
df["sex"] = df["sex"].map( {"female": 0, "male": 1} ).astype(int)
df["embarked"] = df["embarked"].dropna().map( {"S":0, "C":1, "Q":2} ).astype(int)
df.head()
indexpclasssexagesibspparchfareembarkedsurvived
001029.000000211.337501
11110.916712151.550001
22102.000012151.550000
331130.000012151.550000
441025.000012151.550000

特征工程

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

# Lambda expressions to create new features
def get_family_size(sibsp, parch):
    family_size = sibsp + parch
    return family_size

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


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

indexpclasssexagesibspparchfareembarkedsurvivedfamily_size
001029.000000211.3375010
11110.916712151.5500013
22102.000012151.5500003
331130.000012151.5500003
441025.000012151.5500003


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

pclasssexagesibspparchfamily_sizefareembarkedsurvived
01029.0000000211.337501
1110.9167123151.550001
2102.0000123151.550000
31130.0000123151.550000
41025.0000123151.550000

保存数据

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

# Saving dataframe to CSV
df.to_csv("processed_titanic.csv", index=False)

# See the saved file
!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 上对数据帧的分区进行操作。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonhhxg_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值