数据预处理在机器学习中起着至关重要的作用,它涉及到清洗数据、处理缺失值、特征选择等步骤,以确保数据适合模型训练和分析。本文将重点介绍如何使用中位数填充缺失值,并通过Python代码演示实现过程。
一、中位数填充缺失值的作用
在数据预处理中,使用中位数填充缺失值有几个主要作用和好处:
1、保持数据分布的稳定性和一致性:中位数是数据集中的一个统计量,使用中位数填充缺失值可以保持数据的整体分布特征。这对于某些机器学习算法(如决策树或支持向量机)可能特别重要,因为这些算法可能对数据分布的改变比较敏感。
2、减少数据偏倚的影响:如果数据中存在离群值或者极端值(outliers),使用均值来填充缺失值可能会受到这些值的影响而产生较大的偏差。中位数受离群值的影响较小,因此在面对这种情况时,中位数填充可以减少这种偏差的影响。
3、适用性广泛且简单易行:中位数填充是一种简单而有效的方法,特别适合于数值型数据的缺失值处理。它不需要额外的参数设置或复杂的计算,可以快速应用于各种数据集。
4、避免信息损失:删除缺失值可能会导致信息的丢失,特别是当缺失值占比较大或者缺失值的分布不随机时。中位数填充允许保留原始数据中的信息,同时有效地处理缺失值。
总的来说,使用中位数填充缺失值可以帮助保持数据的完整性和一致性,减少由于缺失值带来的潜在问题,同时保留数据集的统计特征,使其更适合用于后续的分析和建模工作。
二、数据加载与初步处理
首先,我们需要加载数据并进行初步的数据处理。在这个示例中,我们从Excel文件中读取矿物数据,排除了其中矿物类型为'E'的无效数据。
import pandas as pd
# 读取数据
data = pd.read_excel(".\矿物数据.xls")
data = data[data['矿物类型'] != 'E'] # 过滤掉矿物类型为'E'的无效数据
通过过滤操作,排除了矿物类型为'E'的无效数据,确保数据的质量和准确性。
三、准备特征变量和目标变量
接下来,我们准备特征变量(即需要被预测的数据)和目标变量(即已知结果)。
X_whole = data.drop(['矿物类型', '序号'], axis=1) # 特征变量,排除矿物类型和序号列
y_whole = data['矿物类型'] # 目标变量
X_whole
包含了所有的特征变量,而y_whole
则是我们要预测的目标变量。
四、数据预处理:使用中位数填充缺失值
数据集中经常会存在缺失值,为了保持数据的完整性和准确性,我们可以使用中位数来填充这些缺失值。以下是填充函数的实现。
def median_train_fill(X_train, y_train):
"""
计算每列的中位数,并使用中位数填充训练集的缺失值。
"""
median_values = X_train.median() # 计算每列的中位数
X_train_filled = X_train.fillna(median_values) # 使用中位数填充缺失值
return X_train_filled, y_train
def median_test_fill(X_train_filled, y_train, X_test, y_test):
"""
使用训练集的中位数填充测试集的缺失值,保持数据分布一致性。
"""
X_test_filled = X_test.fillna(X_train_filled.median()) # 使用训练集的中位数填充测试集的缺失值
return X_test_filled, y_test
median_train_fill函数计算了训练集X_train的每列的中位数,并使用这些中位数来填充训练集中的缺失值。median_test_fill函数则使用了训练集的中位数来填充测试集X_test中的缺失值,确保了数据分布的一致性。
五、数据探索与可视化
填充完数据后,我们可以探索每个矿物类型的数据量分布,并通过可视化工具展示结果。
import matplotlib.pyplot as plt
# 统计每个类别的数据量
y_whole = pd.concat([y_train_fill, y_test_fill])
labels_count = pd.value_counts(y_whole)
# 绘制条形图显示每个类别的数据量
fig, ax = plt.subplots()
bars = ax.bar(labels_count.index, labels_count.values)
for bar in bars:
yval = bar.get_height()
ax.text(bar.get_x() + bar.get_width() / 2, yval,
round(yval, 2),
va='bottom',
ha='center',
fontsize=10,
color='black')
plt.xlabel('矿物类型')
plt.ylabel('数据个数')
plt.title('删除空数据后每个矿物类型的数据个数')
plt.show()
使用matplotlib
库绘制了每个矿物类型的数据量条形图。这种可视化有助于我们理解数据的分布情况,并评估不同类别之间的数据均衡性。
六、数据保存与结论
最后,我们将填充后的数据保存为Excel文件,以便进一步的模型训练和分析。
# 将填充后的数据保存为Excel文件,分为训练集和测试集
data_train = pd.concat([y_train_fill, x_train_fill], axis=1).sample(frac=1, random_state=4) # 将训练集合并并打乱顺序
data_test = pd.concat([y_test_fill, x_test_fill], axis=1) # 将测试集合并
data_train.to_excel(r'.\训练数据集[删除空数据行].xlsx', index=False) # 将训练集保存为Excel文件,不保存行索引
data_test.to_excel(r'.\测试数据集[删除空数据行].xlsx', index=False) # 将测试集保存为Excel文件,不保存行索引
将填充后的训练集和测试集保存为Excel文件,便于后续的模型训练和评估。