Press "Enter" to skip to content

利用ChatGPT进行自动数据清洗和预处理

利用ChatGPT进行自动数据清洗和预处理 四海 第1张 

ChatGPT已经成为一个瑞士军刀,可用于多种应用,并且将ChatGPT整合到数据科学工作流中有丰富的空间。

如果您曾经在真实数据集上训练过机器学习模型,您就会知道数据清理和预处理步骤对于构建强大的机器学习模型是很重要的。在本指南中,我们将看到如何使用ChatGPT在一个示例数据集上执行这些任务。

我们将使用UCI机器学习库中的银行营销数据集,并提示ChatGPT执行以下操作:

  • 获取和加载数据集
  • 检查缺失值
  • 编码分类变量

您可以通过登录您的OpenAI帐户并启动新的ChatGPT会话来跟随操作。如果您愿意,您也可以在Google Colab中进行编码。

 

获取和加载数据集

 

数据集有几个不同的版本。我们将使用bank-full.csv。

 

提示:今天我们将在一个真实数据集上进行数据清理和预处理。编写代码执行以下操作:1. 从UCI机器学习库中获取银行营销数据集。使用类似requests或urllib的库。2. 下载zip文件,解压缩内容,并将bank-full.csv文件读入一个pandas dataframe(称为data)。

 

获取和读入数据集的代码如下:

import pandas as pd
import urllib
import zipfile

# 数据集的URL
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip"

# 获取并解压数据集
urllib.request.urlretrieve(url, "bank.zip")

with zipfile.ZipFile("bank.zip", "r") as zip_ref:
    zip_ref.extractall()

# 将数据集加载到pandas DataFrame中
data = pd.read_csv("bank-full.csv", delimiter=";",skipinitialspace=True)

 

获取数据集的基本信息

 

让我们更好地了解数据集。

# 显示数据集的前几行
print(data.head())

 

输出结果如下:利用ChatGPT进行自动数据清洗和预处理 四海 第2张 

 

提示:使用pandas获取数据框的维度、列的描述统计信息和各列的数据类型。

 

这一步实际上不需要提示ChatGPT,因为pandas的方法非常简单。

# 获取数据集的维度(行数、列数)
print(data.shape)

 

输出结果:(45211, 17)

 

我们有超过45000条记录和16个特征(17个是包括输出标签在内的)。

# 获取数值列的统计摘要
print(data.describe())

 

利用ChatGPT进行自动数据清洗和预处理 四海 第3张 

了解各列的数据类型也很有帮助。当我们编码分类变量时,我们将更详细地研究它们。

# 检查每列的数据类型
print(data.dtypes)

 

输出结果:

age           int64
job          object
marital      object
education    object
default      object
balance       int64
housing      object
loan         object
contact      object
day           int64
month        object
duration      int64
campaign      int64
pdays         int64
previous      int64
poutcome     object
y            object
dtype: object

 

到目前为止,我们已经对银行营销数据集有了一定的了解。输出标签表示客户是否会订阅定期存款。数据集包含了一些特征,如年龄、月份、教育程度、婚姻状态、之前活动的结果等。

 

检查缺失值

 

问题:我想知道每列中缺失值的数量。请给我使用pandas的代码。

 

# 检查每列中的缺失值
missing_values = data.isnull().sum()
print(missing_values)

 

以下是输出结果:

输出 >>>

age          0
job          0
marital      0
education    0
default      0
balance      0
housing      0
loan         0
contact      0
day          0
month        0
duration     0
campaign     0
pdays        0
previous     0
poutcome     0
y            0
dtype: int64

 

这个包含超过45000条记录的银行营销数据集没有缺失值。然而,在实际应用中,大多数真实世界的数据集都会有缺失值。您应该使用适当的插补技术来处理缺失值。

作为一个可选练习,您可以在此处添加一个步骤,提示ChatGPT从一部分列的子集中删除少量值,以便您可以练习如何处理缺失值。

 

编码分类变量

 

下一步是对数据集中的分类变量进行编码。我们将从获取所有分类列的列表开始。

 

问题:给出获取此数据集中所有分类列列表的代码。

 

# 计算分类变量的数量
categorical_columns = data.select_dtypes(include=['object']).columns
print(categorical_columns)
num_categorical_variables = len(categorical_columns)

# 显示数量
print("分类变量的数量:", num_categorical_variables)

 

分类列的列表中还包括输出标签 y。但是我们先关注其他分类变量。

输出 >>>
Index(['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact',
       'month', 'poutcome', 'y'],
      dtype='object')
分类变量的数量: 10

 

更详细查看分类变量的值

 

接下来,让我们看看每个分类变量的取值。

 

问题:我想了解每个分类变量的各个值。给出pandas代码。

 

# 获取每个分类列的不同值及其计数
categorical_columns = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome']
for column in categorical_columns:
    value_counts = data[column].value_counts()
    print(f"列名: {column}")
    print(value_counts,"\n")

 

输出结果不易解析:

输出 >>>

列名: job
blue-collar      9732
management       9458
technician       7597
admin.           5171
services         4154
retired          2264
self-employed    1579
entrepreneur     1487
unemployed       1303
housemaid        1240
student           938
unknown           288
Name: job, dtype: int64 

...
...
...
列名: poutcome
unknown    36959
failure     4901
other       1840
success     1511
Name: poutcome, dtype: int64 

可视化分类变量的取值

让我们让ChatGPT创建一个可视化图表,以便更容易理解分类变量的取值。

提示:我想要一个显示每个分类变量取值的图表。排除输出标签 y,并包括所有其他分类变量。

下面是代码:

import matplotlib.pyplot as plt

# 获取每个分类列的不同取值及其计数
categorical_columns = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome']

# 设置子图网格
fig, axes = plt.subplots(3, 3, figsize=(10,8))

# 遍历每个分类列并绘制计数图
for i, column in enumerate(categorical_columns):
    row = i // 3
    col = i % 3
    value_counts = data[column].value_counts()
    ax = axes[row, col]
    value_counts.plot(kind='bar', ax=ax)
    ax.set_xlabel(column)
    ax.set_ylabel('Count')
    ax.set_title(f'{column.title()} Value Counts')

# 调整子图之间的间距
plt.tight_layout()

# 显示图表
plt.show()

利用ChatGPT进行自动数据清洗和预处理 四海 第4张

独热编码

对于一些分类列的子集,我们可以使用独热编码。

提示:给出执行一系列列的独热编码的 pandas 代码。

我们使用 pandas 的 get_dummies 函数对以下列进行独热编码:

# 选择分类列(不包括 education 和 poutcome)
categorical_columns = ['job', 'marital', 'default', 'housing', 'loan', 'contact']

# 执行独热编码
encoded_data = pd.get_dummies(data, columns=categorical_columns)

提示:我想打印出新添加列的前几行。编写相应的代码。

# 选择新添加的列
new_columns = encoded_data.columns.difference(data.columns)

# 打印新添加列的头几行
print(encoded_data[new_columns].head())

利用ChatGPT进行自动数据清洗和预处理 四海 第5张

定义自定义映射

对于像“education”和“poutcome”(先前结果)这样的变量的列,与其使用独热编码,使用自定义映射可以更好地比较值。

此外,当我们使用独热编码对一个具有 k 个不同值的分类变量进行编码时,会生成 k 个新列。对于像“month”这样的分类列,这将是冗余的,并没有增加太多信息。

因此,对于这两种情况,我们将定义一个自定义映射,然后转换列中的值。我们可以让ChatGPT获取一个通用的代码片段,然后我们可以修改它,以定义特定列的映射。

提示:我想要为一些分类变量进行自定义映射编码。首先给我一个通用的代码片段,用于将分类列中的唯一值映射到不同的输出值集合。然后我们应该使用此映射来转换列中的值。

# 定义自定义映射字典
custom_mapping = {
    'category1': 'value1',
    'category2': 'value2',
    'category3': 'value3',
    # 根据需要添加更多类别和相应的值
}

# 指定分类列
categorical_column = 'column_name'  # 用实际的列名替换 'column_name'

# 使用自定义映射字典进行映射
data[categorical_column] = data[categorical_column].map(custom_mapping)

 

对于“month”列,让我们将月份字符串转换如下:

# 定义月份的映射字典
month_mapping = {
    'jan': 1,
    'feb': 2,
    'mar': 3,
    'apr': 4,
    'may': 5,
    'jun': 6,
    'jul': 7,
    'aug': 8,
    'sep': 9,
    'oct': 10,
    'nov': 11,
    'dec': 12
}

# 将月份列的值映射
encoded_data['month'] = encoded_data['month'].map(month_mapping)

 

让我们将“poutcome”和“education”列映射为数字值:

# 定义poutcome和education的自定义映射
poutcome_mapping = {
    'unknown': 0,
    'failure': 1,
    'other': 2,
    'success': 3
}

education_mapping = {
    'unknown': 0,
    'primary': 1,
    'secondary': 2,
    'tertiary': 3
}

# 使用pandas map进行序数编码
encoded_data['poutcome'] = encoded_data['poutcome'].map(poutcome_mapping)
encoded_data['education'] = encoded_data['education'].map(education_mapping)


# 选择新增的列
new_columns = ['month','poutcome', 'education']

# 打印新增列的头部
print(encoded_data[new_columns].head(10))

 

对输出标签进行编码

 

还让我们将输出的call和为yes和no的输出值映射分别为1和0:

encoded_data['y'] = encoded_data['y'].replace({'no': 0, 'yes': 1})
print(encoded_data['y'])

 

输出 >>>

0        0
1        0
2        0
3        0
4        0
        ..
45206    1
45207    1
45208    1
45209    0
45210    0
Name: y, Length: 45211, dtype: int64

 

回想一下,我们对“housing”、“default”和“loan”列使用了独热编码。因为这些列也接受“yes”和“no”的值,您可以将“yes”和“no”分别映射为1和0。

 

可视化类别标签的分布

 

查看类别标签的分布也是有帮助的,这样我们在构建模型时可以考虑到类别不平衡的情况。

 

提示:我想了解类别标签的分布。请给我生成适当的图表的代码。

 

这是使用Seaborn生成计数图的代码:

import seaborn as sns
import matplotlib.pyplot as plt

# 绘制输出标签的分布
sns.countplot(data=data, x='y')
plt.xlabel('输出标签')
plt.ylabel('计数')
plt.title('输出标签分布')
plt.show()

 

利用ChatGPT进行自动数据清洗和预处理 四海 第6张 

我们可以看到存在类别不平衡的情况。因此,如果您正在构建模型,应确保使用适当的重新采样方法来处理类别不平衡。

 

通用的数据清洗和预处理流程

 

尽管数据清洗和预处理需要开发人员付出努力,但让我们试着得到一个针对简单数据集而言相当适用的通用步骤序列。

 

提示:您能给我一个通用的数据清洗和预处理流程吗?根据我们目前所做的,获取关于数据集的基本信息,检查并处理缺失值,识别分类列,并对分类列进行编码。只使用pandas。

 

以下是代码:

import pandas as pd

# 将数据加载到DataFrame中
data = pd.read_csv('data.csv')

# 步骤1:基本信息
print(data.info())

# 步骤2:处理缺失值
missing_values = data.isnull().sum()
print(missing_values)

# 步骤3:处理缺失值
# 标识具有缺失值的列
columns_with_missing_values = missing_values[missing_values > 0].index

# 使用fillna()或其他合适的方法填充缺失值
data[columns_with_missing_values] = data[columns_with_missing_values].fillna(data[columns_with_missing_values].mean())

# 步骤4:获取分类列
categorical_columns = data.select_dtypes(include=['object']).columns

# 步骤5:编码分类列
# 使用pandas的get_dummies()函数执行有序编码或独热编码
encoded_data = pd.get_dummies(data, columns=categorical_columns)

# 打印编码后的数据
print(encoded_data.head())

 

总结

 

通过与ChatGPT的协同作用,可以使数据清洗和预处理变得更加简单和快速。现在您已经准备好预处理的数据集,可以在这个银行营销数据集上构建一个简单的预测模型。

如果感兴趣,您还可以探索如何利用ChatGPT进行数据探索。

 

数据集来源

 

银行营销数据集采用知识共享署名4.0国际(CC BY 4.0)许可。Moro,S., Rita,P., and Cortez,P.. (2012). Bank Marketing. UCI Machine Learning Repository. https://doi.org/10.24432/C5K306.

    Bala Priya C 是一位来自印度的开发人员和技术作家。她喜欢在数学、编程、数据科学和内容创作的交叉领域工作。她感兴趣和擅长的领域包括DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编码和咖啡!目前,她正在通过撰写教程、指南、观点文章等,与开发者社区学习和分享她的知识。

 

Leave a Reply

Your email address will not be published. Required fields are marked *