【数据探索与数据预处理】缺失数据处理

【数据探索与数据预处理】缺失数据处理

第6节:处理缺失数据

缺失数据是数据预处理中的一个常见问题,尤其是在现实世界的实际数据集(如用户行为、医疗记录、金融数据等)中。缺失数据如果未被有效处理,可能会导致模型表现不佳,甚至导致训练失败。因此,在机器学习和深度学习模型开发中,识别和处理缺失数据是确保数据完整性和准确性的关键步骤。

本节将介绍几种常见的处理缺失数据的方法,包括填充、删除、插值和转类别数据,并结合具体的AI应用案例进行演示。

案例一:泰坦尼克号数据集中的缺失数据处理

案例描述 泰坦尼克号数据集是一个经典的机器学习任务,任务是预测乘客是否在沉船事故中生还。在该数据集中,存在一些缺失值,尤其是在Age(年龄)和Embarked(登船港口)列中。为了解决这些缺失数据问题,我们将采取不同的处理策略,包括用中位数填充年龄,用众数填充登船港口,并删除缺失Survived(是否生还)列的样本。

案例分析 泰坦尼克号数据集的缺失值处理对于预测生还情况非常关键。Age列是数值型特征,适合用中位数来填充,而Embarked是类别型特征,因此填充众数(出现频率最多的类别)是一种合适的选择。对于Survived列,删除含有缺失值的样本是最合适的做法,因为目标列的缺失会直接影响模型的预测。

案例算法步骤

导入数据集并进行初步清洗。对数值型特征Age进行中位数填充。对类别型特征Embarked进行众数填充。删除目标列Survived中缺失值的样本。检查处理后的数据集,确保数据完整性。

Python代码实现

import pandas as pd

from sklearn.impute import SimpleImputer

# 导入泰坦尼克号数据集

url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"

data = pd.read_csv(url)

# 1. 检查数据集中的缺失值

print(data.isnull().sum())

# 2. 使用中位数填充 Age 列中的缺失值

age_imputer = SimpleImputer(strategy="median")

data['Age'] = age_imputer.fit_transform(data[['Age']])

# 3. 使用众数填充 Embarked 列中的缺失值

embarked_imputer = SimpleImputer(strategy="most_frequent")

data['Embarked'] = embarked_imputer.fit_transform(data[['Embarked']])

# 4. 删除 Survived 列中缺失值的样本

data.dropna(subset=['Survived'], inplace=True)

# 5. 确认数据中缺失值已经处理完毕

print(data.isnull().sum())

代码解读

数据加载:我们通过pandas.read_csv()函数加载泰坦尼克号数据集。缺失值统计:使用isnull().sum()来统计各列的缺失值数量。填充策略:对Age列使用中位数填充,对Embarked列使用众数填充。删除缺失目标值:删除Survived列中缺失的样本。检查结果:通过再次统计缺失值数量,确保所有缺失数据已被处理。

案例二:医疗数据中的缺失值处理

案例描述 在医疗数据中,经常遇到患者的某些健康指标(如血糖水平、血压等)缺失的情况。对于这种情况,我们将使用插值法来填补这些缺失数据,尤其是采用线性插值方法。这在时间序列数据(如监测病人健康指标的时间序列数据)中是常见的做法。

案例分析 在医疗数据中,许多数值型特征可以通过插值方法来处理缺失值。插值方法通过已有数据的趋势推测缺失值。例如,线性插值可以基于前后两点的趋势预测缺失值。此方法对于时间序列数据尤其有效。

案例算法步骤

导入医疗数据并进行初步清洗。检查缺失值所在的列。使用线性插值填充数值型特征中的缺失值。验证填充结果,确保数据完整性。

Python代码实现

# 模拟生成医疗数据

import numpy as np

np.random.seed(0)

n = 100

time = np.arange(n)

blood_glucose = np.random.normal(100, 15, n)

blood_glucose[::5] = np.nan # 每5行插入一个缺失值

# 创建DataFrame

medical_data = pd.DataFrame({

'Time': time,

'BloodGlucose': blood_glucose

})

# 显示缺失值统计

print(medical_data.isnull().sum())

# 使用线性插值填充血糖数据中的缺失值

medical_data['BloodGlucose'] = medical_data['BloodGlucose'].interpolate(method='linear')

# 显示填充后的数据

print(medical_data.isnull().sum())

代码解读

数据生成:我们模拟了一个简单的血糖数据集,其中每隔五行就有一个缺失值。线性插值:使用interpolate(method='linear')方法对缺失数据进行线性插值填充。缺失值检查:通过isnull().sum()方法确认数据中的缺失值已经填充完毕。

案例三:金融数据中的缺失值处理

案例描述 在金融数据中,例如股票价格数据,缺失值可能会因为数据收集的间隔时间不一致而出现。对于这种情况,通常采用填充前值(前向填充)或后值(后向填充)来处理缺失数据。我们将使用前向填充法来填补股票价格数据中的缺失值。

案例分析 前向填充和后向填充是时间序列数据中常用的缺失值处理方法。前向填充会将当前缺失值填充为其前一个非缺失值,适用于股票价格等具有时间连续性的金融数据。

案例算法步骤

导入股票数据并进行初步清洗。检查缺失值所在的列。使用前向填充法填充缺失值。验证填充结果,确保数据完整性。

Python代码实现

# 模拟生成股票价格数据

stock_prices = np.random.normal(100, 5, n)

stock_prices[::7] = np.nan # 每7天插入一个缺失值

# 创建DataFrame

stock_data = pd.DataFrame({

'Day': time,

'StockPrice': stock_prices

})

# 显示缺失值统计

print(stock_data.isnull().sum())

# 使用前向填充填充股票价格数据中的缺失值

stock_data['StockPrice'] = stock_data['StockPrice'].fillna(method='ffill')

# 显示填充后的数据

print(stock_data.isnull().sum())

代码解读

数据生成:我们模拟了一个股票价格数据集,其中每隔七天就有一个缺失值。前向填充:使用fillna(method='ffill')方法将缺失值填充为前一个非缺失值。缺失值检查:通过isnull().sum()确认缺失值已经成功填充。

案例四:自然语言处理中的缺失值处理

案例描述 在文本数据中,缺失值通常表现为空字符串或空值。处理缺失文本数据时,常见的方法是填充空字符串或用“未知”类别填充。我们将使用填充空字符串的方式来处理缺失的文本数据。

案例分析 对于文本数据,缺失值处理方法往往取决于数据的特点。在一些文本分类任务中,空白文本可能会影响模型训练,因此我们将空白文本替换为一个特定的填充标记,如“未知”。

案例算法步骤

导入文本数据并进行初步清洗。检查缺失值所在的列。使用特定标记(如“未知”)填充缺失值。验证填充结果,确保数据完整性。

Python代码实现

# 继续模拟生成文本数据

text_data = ['This is a comment.', 'Good product.', 'Very bad.', np.nan, 'Not worth it.']

labels = [1, 1, 0, 0, 0] # 1: Positive, 0: Negative

# 创建DataFrame

text_df = pd.DataFrame({

'Review': text_data,

'Label': labels

})

# 显示缺失值统计

print(text_df.isnull().sum())

# 使用特定标记填充缺失文本

text_df['Review'] = text_df['Review'].fillna('Unknown')

# 显示填充后的数据

print(text_df.isnull().sum())

print(text_df)

代码解读

数据生成:我们模拟了一个简单的文本数据集,其中包含一些缺失的文本数据(使用np.nan表示缺失)。填充缺失值:使用fillna('Unknown')方法填充缺失文本,填充内容为“Unknown”。缺失值检查:通过isnull().sum()确认缺失值已被填充,并显示填充后的数据。

案例五:用户行为数据中的缺失值处理

案例描述 在用户行为数据集中,缺失值可能出现在特征如用户的购买次数、访问时间等列。对于这种情况,我们可以采用删除缺失数据或填充0的策略(特别是在分析用户活跃度等特征时)。我们将在此示例中使用填充0的方法,假设缺失值表示该用户没有任何行为。

案例分析 填充0是一种常见的做法,尤其在用户行为数据中。如果用户的某个行为特征缺失,填充0可以表明该用户在该特征上没有任何行为。这种策略通常用于分析用户活跃度或行为频率时。

案例算法步骤

导入用户行为数据并进行初步清洗。检查缺失值所在的列。使用0填充缺失值。验证填充结果,确保数据完整性。

Python代码实现

# 模拟生成用户行为数据

user_ids = np.arange(1, 101)

purchase_count = np.random.randint(0, 10, 100)

purchase_count[::10] = np.nan # 每10个用户插入一个缺失值

# 创建DataFrame

user_data = pd.DataFrame({

'UserID': user_ids,

'PurchaseCount': purchase_count

})

# 显示缺失值统计

print(user_data.isnull().sum())

# 使用0填充缺失的购买次数

user_data['PurchaseCount'] = user_data['PurchaseCount'].fillna(0)

# 显示填充后的数据

print(user_data.isnull().sum())

代码解读

数据生成:我们模拟了一个用户行为数据集,其中包含PurchaseCount(购买次数)特征,并有部分缺失值。填充缺失值:使用fillna(0)方法将缺失的购买次数填充为0,假设缺失值表示该用户没有进行购买行为。缺失值检查:通过isnull().sum()确认缺失值已被填充。

总结

在AI模型的开发过程中,处理缺失数据是数据预处理的关键环节。不同类型的数据(数值型、类别型、文本数据等)往往需要不同的处理方法,如填充、中位数插值、前向填充、后向填充等。在上述案例中,我们展示了几种典型的缺失数据处理方法,并通过具体应用场景(如泰坦尼克号数据集、医疗数据、金融数据、用户行为数据等)进行了详细的演示。

针对缺失值的处理策略应该根据实际数据的特点来选择,确保数据的完整性和准确性,以便为后续的机器学习模型训练提供可靠的输入。

【学习大模型技术与深度学习,必须从机器学习开始】

哈佛博后带小白玩转机器学习 【限时5折-含直播】哈佛博后带小白玩转机器学习_哔哩哔哩_bilibili

总课时超400+,时长75+小时

相关探索