机器学习预处理-表格数据的空值处理

机器学习预处理-表格数据的空值处理

机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化,可视化能够帮助我们了解数据的构成和分布,是我们进行机器学习的必备步骤。上文中也提及,原始的数据存在部分的缺失,需要进行数据的空值处理,下面进行介绍。

PY工程下载:机器学习预处理-表格数据的空值处理-py工程

目录

0、原始数据集空缺信息查看

使用下面代码进行数据集的加载,并查看数据集的描述信息:

python 复制代码
import pandas as pd
import os

HOUSING_PATH = os.path.join("datasets", "housing")  # 存储位置


def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)  # 返回 包含所有数据的pandas DataFrame对象


housing = load_housing_data()
housing.info()#查看数据集属性描述

1、删除空值所在行

下面代码能够删除空值所在行,只要有空值,这一行都会被删除:

python 复制代码
housing_drop_row = housing.dropna()  # 删除包含空值的行
housing_drop_row.info()  # 查看数据集属性描述
output_path = os.path.join(HOUSING_PATH, "housing_drop_row.csv")  # 定义保存清理后数据的路径和文件名
housing_drop_row.to_csv(output_path, index=False)  # index=False 表示不保存行索引,将清理后的数据保存到新的 CSV 文件中

删除后的无空值数据如下所示:

2、删除空值所在列

下面代码能够删除空值所在列,只要有空值,这一列都会被删除(从上面截图看一共有9列,删除之后变成了8列):

python 复制代码
housing_drop_column = housing.dropna(axis=1)  # axis=1 表示按列操作
housing_drop_column.info()  # 查看数据集属性描述
output_path = os.path.join(HOUSING_PATH, "housing_drop_column.csv")  # 定义保存清理后数据的路径和文件名
housing_drop_column.to_csv(output_path, index=False)  # index=False 表示不保存行索引,将清理后的数据保存到新的 CSV 文件中

3、使用中位数、均值进行填补

python 复制代码
# 遍历DataFrame的每一列,用该列的中位数填补空值
housing_fill_median = housing.copy()
for column in housing_fill_median.columns:
    # 跳过非数值列,因为中位数仅适用于数值数据
    if housing_fill_median[column].dtype in ['int64', 'float64']:
        # fill_value = housing_fill_median[column].median()  # 计算中位数
        fill_value = housing_fill_median[column].mean()  # 计算均值
        housing_fill_median[column] = housing_fill_median[column].fillna(fill_value)  # 直接赋值
housing_fill_median.info()
output_path = os.path.join(HOUSING_PATH, "housing_fill_median.csv")  # 定义保存清理后数据的路径和文件名
housing_fill_median.to_csv(output_path, index=False)  # index=False 表示不保存行索引,将清理后的数据保存到新的 CSV 文件中

其中,修改下面代码的注释切换使用中位数、均值进行填充:

python 复制代码
# fill_value = housing_fill_median[column].median()  # 计算中位数
fill_value = housing_fill_median[column].mean()  # 计算均值

4、使用k-means算法进行补充

这是一种高级的方式,使用k-means对空值进行填充,如果部分数据是字符串的,则先对其进行编码后在进行K-Means 聚类处理

python 复制代码
# 使用 K-Means 填充空值
# 定义填补函数
def fill_missing_with_kmeans(df, n_clusters=5):
    df = df.copy()
    label_encoders = {}

    # 对非数值型特征进行编码
    for column in df.select_dtypes(exclude=[np.number]).columns:
        le = LabelEncoder()
        # 注意空值先暂时填充为一个特殊字符 '<missing>',避免 LabelEncoder 出错
        df[column] = df[column].fillna('<missing>')
        df[column] = le.fit_transform(df[column])
        label_encoders[column] = le

    # 找到含有空值的列
    missing_columns = df.columns[df.isnull().any()]

    # 针对每一列进行填补
    for column in missing_columns:
        # 提取当前列非空的数据用于聚类
        non_missing_data = df.loc[df[column].notnull(), :]
        missing_data = df.loc[df[column].isnull(), :]

        # 如果整列为空,直接跳过
        if non_missing_data.empty:
            continue

        # 使用 K-Means 聚类
        kmeans = KMeans(n_clusters=n_clusters, random_state=42)
        cluster_features = non_missing_data.drop(columns=[column])
        kmeans.fit(cluster_features)

        # 将每个非空数据点分配到一个簇,并计算簇中心的均值
        cluster_labels = kmeans.labels_

        for cluster_idx in range(n_clusters):
            # 当前簇的数据
            cluster_data = non_missing_data.loc[cluster_labels == cluster_idx]
            if column in df.select_dtypes(include=[np.number]).columns:
                # 如果是数值型特征,用簇中心的均值填充
                cluster_mean = cluster_data[column].mean()
            else:
                # 如果是编码后的字符串特征,用簇中最频繁的值填充
                cluster_mean = cluster_data[column].mode().iloc[0]

            # 填充缺失数据中属于该簇的值
            cluster_missing_data = missing_data[
                kmeans.predict(missing_data.drop(columns=[column])) == cluster_idx
                ]
            df.loc[cluster_missing_data.index, column] = cluster_mean

    # 反编码字符串特征
    for column, le in label_encoders.items():
        df[column] = le.inverse_transform(df[column].astype(int))

    return df

# 填充数据中的缺失值
housing_fill_kmeans = fill_missing_with_kmeans(housing)
housing_fill_kmeans.info()
output_path = os.path.join(HOUSING_PATH, "housing_fill_kmeans.csv")  # 定义保存清理后数据的路径和文件名
housing_fill_kmeans.to_csv(output_path, index=False)  # index=False 表示不保存行索引,将清理后的数据保存到新的 CSV 文件中
相关推荐
SmartBrain29 分钟前
常耀斌:深度学习和大模型原理与实战(深度好文)
人工智能·深度学习
人类群星闪耀时1 小时前
深度学习在日志分析中的应用:智能运维的新前沿
运维·人工智能·深度学习
weixin_404551241 小时前
HUGGINGFACE NLP- MAIN NLP TASKS
人工智能·自然语言处理·nlp·huggingface·tasks
china—hbaby2 小时前
人工智能在自动驾驶领域的技术与应用
人工智能·机器学习·自动驾驶
可即2 小时前
自动驾驶域控制器简介
人工智能·自动驾驶·智能电视
搏博2 小时前
在优化算法中常见哪些数学函数(根据数学性质分类)
人工智能·算法
曦云沐2 小时前
深入解析:选择最适合你的Whisper语音识别模型
人工智能·whisper·语音识别
AI视觉网奇2 小时前
UniDepth 学习笔记
人工智能
GPT祖弘2 小时前
【AI热点】小型语言模型(SLM)的崛起:如何在AI时代中找到你的“左膀右臂”?
人工智能·语言模型·自然语言处理
Fuweizn2 小时前
技术解决方案|复合机器人在cnc行业的上下料
人工智能·智能机器人·复合机器人