《机器学习》数据预处理 删除、替换、填充 案例解析及实现

目录

一、了解数据清洗

1、什么是数据清洗

2、数据清洗步骤

1)缺失值处理

2)异常值处理

3)重复值处理

4)格式修正

5)数据一致性检查

6)数据类型转换

二、数据清洗用法

1、有如下文件内容

2、完整代码

1)代码1

2)自建包fill_na.py内代码:

1、运行结果

2、调试结果:

3)数据处理后的内容:


 

一、了解数据清洗

1、什么是数据清洗

        数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。 换句话说,数据清洗的目的是删除重复信息纠正存在的错误,并提供数据一致性。在进行数据清洗时,需要按照一定的规则把“脏数据”“洗掉”,以确保数据的准确性和可靠性。

 

2、数据清洗步骤

        1)缺失值处理

                找出数据中的缺失值,并根据具体情况进行处理,可以通过删除包含缺失值的样本、使用均值或中位数等等 进行填充,或使用其他合适的方法来处理缺失值。

 

        2)异常值处理

                检测并处理数据中的异常值,这些异常值可能是由于测量错误、输入错误或其他原因导致的,可以通过删除异常值、替换为合适的值或使用其他方法进行处理。

 

        3)重复值处理

                检测并删除数据中的重复值,这些重复值可能是由于数据输入错误、数据复制或其他原因导致的,重复值可能会对模型的训练和性能产生负面影响。

 

        4)格式修正

                将数据转换为统一的格式,例如将日期转换为特定的日期格式、将文本转换为小写或大写、移除多余的空格等。

 

        5)数据一致性检查

                对数据进行逻辑一致性检查,确保数据在不同字段、不同记录之间保持一致。

 

        6)数据类型转换

                将数据转换为适当的数据类型,例如将字符串转换为数值型、将文本转换为分类变量等。

 

 

二、数据清洗用法

1、有如下文件内容

                (内容随意敲的)

6b36028cac354b8e9101d8776be0d109.png

此时图中有一些无用的字符,还有一些空值,接下来要对这组数据进行数据预处理

 

2、完整代码

        1)代码1

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('111.xlsx')  # 导入文件
data = data[data['矿物类型'] != 'D']  # 删除无用的类别D
null_num = data.isnull()  # 判断是否为空,返回布尔值

null_total = null_num.sum()  # 对上述布尔类型的值进行求和,默认True为1,False为0

x_whole = data.drop('矿物类型',axis=1)  # 将除了矿物类型的列当做特征集
y_whole = data.矿物类型   # 将矿物类型列当做标签集

label_dict = {'A':0,'B':1,'C':2}  # 定义一个字典,用来将矿物类型转换为整型
encoded_label = [label_dict[label] for label in y_whole]  # 利用列表生成式,遍历标签集中的每一个字符串类型的类别,利用字典键值对的作用,将原来的值更改为整型,
y_whole = pd.Series(encoded_label,name='矿物类型')  # 将上述转变后的数据更改为Series类型,并赋值给原始标签集

"""去除无用符号"""
for column_name in x_whole.columns:   # 遍历特征集的列名
    x_whole[column_name] = pd.to_numeric(x_whole[column_name],errors='coerce')
# 使用numpy的用法to_numeric,将取出每列的数据转换为数值型,参数error表示如果转换为数值类型发生错误,就将那个值转换为Nan


""" Z标准化 """
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_whole_z = scaler.fit_transform(x_whole)  # 将去除无用符号的特征集数据进行z标准化
x_whole = pd.DataFrame(x_whole_z,columns=x_whole.columns)  # z标准化后为numpy数据,将其转换为dataframe类型


""" 数据集切分 """
from sklearn.model_selection import train_test_split
x_train_w,x_test_w,y_train_w,y_test_w = train_test_split(x_whole,y_whole,test_size=0.2,random_state=0)



""" 填充空值 """
import fill_na  # 导入自己写的填充函数


# 使用均值填充,调用自己写的函数,对空值进行填充
x_train_fill,y_train_fill = fill_na.mean_train_fill(x_train_w,y_train_w)  # 训练集的填充
x_test_fill,y_test_fill = fill_na.mean_test_fill(x_train_fill,y_train_fill,x_test_w,y_test_w)  # 测试集的填充




""" 对数据进行过采样,防止过拟合 """
from imblearn.over_sampling import SMOTE
oversampler = SMOTE(k_neighbors=1,random_state=0)  # k_neighbors=1表示最近邻的邻居个数,以及随机种子
os_x_train,os_y_train = oversampler.fit_resample(x_train_fill,y_train_fill)  # 输入参数训练集特征和标签,将他们进行过拟合操作,返回两个新的训练数据集


""" 绘制每个类别数据个数图 """
y_whole = pd.concat([os_y_train,y_test_fill])  # 合并过拟合后的数据
labels_count= pd.value_counts(y_whole)  # 返回每个类别的数据个数
fig,ax = plt.subplots()  # 使用subplot创建子图,fig表示整个图像,ax表示子图坐标区域
bars = ax.bar(labels_count.index,labels_count.values)  # 表示在指定区域绘制条形图,x轴表示数据的索引,y轴表示值
for bar in bars:  # 遍历每一个条形图
    yval = bar.get_height()  # 获取每个条形图的高度
    # 在条形图上增加文本,用bar.get()+bar.get_width()/2计算文本的水平位置
    ax.text(bar.get_x()+bar.get_width()/2,yval,round(yval,2),va='bottom',ha='center',fontsize=10,color='black')
plt.xlabel('lables')  # x轴名字
plt.ylabel('numbers')  # y轴名字
plt.title('The number of data for each category after removing empty data')  # 标题
plt.show()


data_train = pd.concat([os_y_train,os_x_train],axis=1).sample(frac=1,random_state=0)  # sample(frac=1,random_state=0)表示随机选择行,frac表示返回样本比例
data_test = pd.concat([y_test_fill,x_test_fill],axis=1)


data_train.to_excel(r'./训练数据集[均值填充].xlsx',index=False)
data_test.to_excel(r'./测试数据集[均值填充].xlsx',index=False)

        2)自建包fill_na.py内代码:


import pandas as pd


"""  使用均值填充  """
def mean_method(data):    # 参数为data

    fill_values = data.mean()   # mean会计算每一列的均值,然后返回给fill_values
    return data.fillna(fill_values)   # 返回 均值填充到data的数据

def mean_train_fill(train_data, train_label):   # 传入两个参数,一个是训练的特征集,一个训练的标签
    data = pd.concat([train_data, train_label], axis=1)   # 将特征集和标签集合并
    data = data.reset_index(drop=True)   # 重置合并后数据的索引
    A = data[data['矿物类型'] == 0]   # 将标签为0的数据取出,赋值给A
    B = data[data['矿物类型'] == 1]   # 将标签为1的数据取出,赋值给B
    C = data[data['矿物类型'] == 2]   # 将标签为2的数据取出,赋值给C

    A = mean_method(A)   # 调用mean_method函数对A类别中的数值进行求均值后再进行填充
    B = mean_method(B)
    C = mean_method(C)


    df_filled = pd.concat([A, B, C])   # 填充完后将每一类数据合并
    df_filled = df_filled.reset_index(drop=True)    # 重置索引
    return df_filled.drop('矿物类型', axis=1), df_filled.矿物类型  # 返回训练集的特征和标签
def mean_test_method(train_data, test_data):
    fill_values = train_data.mean()   # 对训练集的数据进行求均值
    return test_data.fillna(fill_values)  # 将训练集计算的均值填充到测试集

def mean_test_fill(train_data, train_label, test_data, test_label):  # 导入填充好的训练集数据和标签,以及未填充的测试集特征和标签
    train_data_all = pd.concat([train_data, train_label], axis=1)  # 合并填充好的训练集数据
    train_data_all = train_data_all.reset_index(drop=True)   # 重置索引
    test_data_all = pd.concat([test_data, test_label], axis=1)  # 合并未处理的测试集数据
    test_data_all = test_data_all.reset_index(drop=True)

    A_train = train_data_all[train_data_all['矿物类型'] == 0]     # 取出训练集中0类别的数据
    B_train = train_data_all[train_data_all['矿物类型'] == 1]
    C_train = train_data_all[train_data_all['矿物类型'] == 2]

    A_test = test_data_all[test_data_all['矿物类型'] == 0]   # 取出测试集中0类别的数据
    B_test = test_data_all[test_data_all['矿物类型'] == 1]
    C_test = test_data_all[test_data_all['矿物类型'] == 2]

    A = mean_test_method(A_train, A_test)  # 调用上述函数mean_test_method,输入参数0类别的数据的训练集和测试集合,返回填充后的0类别测试集数据
    B = mean_test_method(B_train, B_test)
    C = mean_test_method(C_train, C_test)

    df_filled = pd.concat([A, B, C])  # 合并处理完三个类别的测试集数据
    df_filled = df_filled.reset_index(drop=True)
    return df_filled.drop('矿物类型', axis=1), df_filled.矿物类型  # 返回测试集的特征集和标签集

 

        1、运行结果

abb2841d3f594148976f1c7f506a5963.png

 

        2、调试结果:

34b1b1461ba249379261e18fd3bae1ae.png

 

3)数据处理后的内容:

8f7f16b480f34a06b3a082268b1bb2d6.png

9b9dfa9a22d54b9ab239126998b65214.png

 

(还有其他填充方法,例如直接删除空值、中位数填充、众数填充、线性回归填充、随机森林填充等等,代码大致相同,可私信发代码)

 

 

 

  • 29
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜就多练_0828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值