数据预处理:使用中位数填充缺失值

        数据预处理在机器学习中起着至关重要的作用,它涉及到清洗数据、处理缺失值、特征选择等步骤,以确保数据适合模型训练和分析。本文将重点介绍如何使用中位数填充缺失值,并通过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文件,便于后续的模型训练和评估。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值