【数据分析与挖掘】数据预处理

news2025/2/26 18:56:30

目录

  • 概述
  • 一、数据清洗
    • 1.1 缺失值处理
      • 1.1.1 拉格朗日插值法
      • 1.1.2 牛顿插值法
    • 1.2 异常值处理
  • 二、数据集成
    • 2.1 实体识别
    • 2.2 冗余属性识别
  • 三、数据变换
    • 3.1 简单函数变换
    • 3.2 规范化
    • 3.3 连续属性离散化
    • 3.4 属性构造
    • 3.5 小波变换
  • 四、数据规约
    • 4.1 属性规约
    • 4.2 数值规约

概述

数据挖掘过程中,数据预处理占整个过程的60%,主要分为以下四个步骤:
在这里插入图片描述

一、数据清洗

数据清洗的主要目的是为了删除原始数据集中的无关数据、重复数据、平滑噪声数据、处理缺失值、异常值等。

1.1 缺失值处理

处理缺失值的方法可分为三类:删除数据、数据插补和不处理,常见的数据插补方法见下表:
在这里插入图片描述
插值法有:Hermite插值、分段插值、样条插值法,而最主要的有拉格朗日插值法和牛顿插值法。

1.1.1 拉格朗日插值法

在这里插入图片描述

def lagrange_interpolation(x, y, x_int):
    """
    使用拉格朗日插值法计算函数在指定点的值
    :param x: 函数自变量的取值列表
    :param y: 函数因变量的取值列表
    :param x_int: 指定点的自变量取值
    :return: 指定点的函数值
    """
    n = len(x)
    assert n == len(y), "输入的 x 和 y 列表长度不一致"

    # 定义拉格朗日插值函数
    def L(k):
        lk = 1
        for i in range(n):
            if i != k:
                lk *= (x_int - x[i]) / (x[k] - x[i])
        return lk

    # 计算插值函数的值
    f_int = 0
    for k in range(n):
        f_int += y[k] * L(k)

    return f_int

import math

# 定义自变量和因变量列表
x = [0, 0.25, 0.5, 0.75, 1]
y = [math.sin(xx) for xx in x]

# 计算插值函数在 x=0.5 处的值
x_int = 0.5
f_int = lagrange_interpolation(x, y, x_int)

# 输出结果
print("f({:.2f}) = {:.4f}".format(x_int, f_int))

1.1.2 牛顿插值法

在这里插入图片描述

在这里插入图片描述

def newton_interpolation(x, y, x_int):
    """
    使用牛顿插值法计算函数在指定点的值
    :param x: 函数自变量的取值列表
    :param y: 函数因变量的取值列表
    :param x_int: 指定点的自变量取值
    :return: 指定点的函数值
    """
    n = len(x)
    assert n == len(y), "输入的 x 和 y 列表长度不一致"

    # 计算差商
    f = [[y[i]] for i in range(n)]
    for j in range(1, n):
        for i in range(j, n):
            f[i].append((f[i][j - 1] - f[i - 1][j - 1]) / (x[i] - x[i - j]))

    # 计算插值函数的值
    f_int = f[0][0]
    for i in range(1, n):
        term = f[i][i]
        for j in range(i):
            term *= (x_int - x[j])
        f_int += term

    return f_int


import math

# 定义自变量和因变量列表
x = [0, 0.25, 0.5, 0.75, 1]
y = [math.sin(xx) for xx in x]

# 计算插值函数在 x=0.5 处的值
x_int = 0.5
f_int = newton_interpolation(x, y, x_int)

# 输出结果
print("f({:.2f}) = {:.4f}".format(x_int, f_int))

1.2 异常值处理

在数据预处理时,异常值是否提出,需要根据具体情况,有些异常值可能蕴含某些信息。
在这里插入图片描述

二、数据集成

数据挖掘需要的数据往往分布在不同的数据源中,数据集成就是将多个数据源合并存放在一个一致的数据存储中的过程。

在数据集成时,来自于多个数据源的现实世界实体的表达形式是不一样的,不一定是匹配的,要考虑实体识别问题属性冗余问题,从而把数据源在最底层上加以转化、提炼和集成。

2.1 实体识别

实体识别的任务是检测和解决同名异义、同名同义、单位不统一的冲突。如:

  • 同名异义:数据源A中的属性ID和数据源B中的属性ID分别描述的是菜品编号和订单编号,描述的是不同实体。
  • 同名同义:数据源A中的sales_dt和数据源B中的sales_dt都是描述销售日期的,即:A.sales_dt=B.sales_dt.
  • 单位不统一:描述同一个实体分别用的是国际单位和中国传统的计量单位。

2.2 冗余属性识别

  • 数据集成往往导致数据冗余,如:
    • 同一属性多次出现
    • 同一属性命名不一致导致重复
  • 不同源数据的仔细整合能减少甚至避免数据冗余与不一致,以提高数据挖掘的速度和质量。对于冗余属性要先分析检测后再将其删除。
  • 有些冗余属性可以用相关分析检测出。给定两个数值型属性A和B,根据其属性值,可以用相关系数度量一个属性在多大程度上蕴含另一个属性。

三、数据变换

主要是对数据进行规范化操作,将数据转换成“适当的”格式,以适用于挖掘任务及算法的需要。

3.1 简单函数变换

简单函数变换就是对原始数据进行某些数学函数变换,常用的函数变换包括平方、开方、对数、差分运算等,即:
在这里插入图片描述

  1. 不正太分布的变成具有正太分布的数据
import numpy as np
from scipy.stats import boxcox
from sklearn.preprocessing import StandardScaler

# 定义非正态分布的数据
x = np.random.exponential(2, size=1000)

# 将数据进行 Box-Cox 变换
x_boxcox, _ = boxcox(x)

# 将变换后的数据进行标准化
scaler = StandardScaler()
x_norm = scaler.fit_transform(x_boxcox.reshape(-1, 1))

# 输出结果
print("原始数据的均值和标准差:{:.4f},{:.4f}".format(x.mean(), x.std()))
print("Box-Cox 变换后的数据的均值和标准差:{:.4f},{:.4f}".format(x_boxcox.mean(), x_boxcox.std()))
print("标准化后的数据的均值和标准差:{:.4f},{:.4f}".format(x_norm.mean(), x_norm.std()))
  1. 非平稳序列转化成平稳序列
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller

# 定义非平稳序列
x = np.cumsum(np.random.normal(0, 1, size=1000))

# 检验序列是否平稳
result = adfuller(x)
print("原始序列的 ADF 检验结果:p-value = {:.4f}".format(result[1]))

# 对序列进行一阶差分
x_diff = np.diff(x)

# 再次检验序列是否平稳
result = adfuller(x_diff)
print("差分后序列的 ADF 检验结果:p-value = {:.4f}".format(result[1]))
  1. 压缩变换等(PCA)
import numpy as np
from sklearn.decomposition import PCA

# 定义原始数据
x = np.random.normal(size=(100, 3))

# 使用 PCA 进行压缩变换
pca = PCA(n_components=2)
x_pca = pca.fit_transform(x)

# 输出结果
print("原始数据的形状:", x.shape)
print("PCA 变换后的数据的形状:", x_pca.shape)

3.2 规范化

数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,数值间的差别可能很大,不进行处理可能会影响数据分析的结果,为了消除指标之间的量纲和大小不一致的影响,需要将数据进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域,从而进行综合分析。

有三种常用的规范化方法:最大最小值规范化、零均值规范化、小数定标规范化。

在这里插入图片描述

# -*- coding: utf-8 -*-

# 代码4-2  数据规范化
import pandas as pd
import numpy as np
datafile = '../data/normalization_data.xls'  # 参数初始化
data = pd.read_excel(datafile, header = None)  # 读取数据
print(data)

(data - data.min()) / (data.max() - data.min())  # 最小-最大规范化
(data - data.mean()) / data.std()  # 零-均值规范化
data / 10 ** np.ceil(np.log10(data.abs().max()))  # 小数定标规范化

3.3 连续属性离散化

一些数据挖掘算法,特别是某些分类算法,要求数据是分类属性形式,如ID3算法、Apriior算法等。这样,需要将连续属性变化成类别属性,即连续属性离散化。

常用的离散化方法:
等宽法、等频法、基于聚类分析的方法。

# -*- coding: utf-8 -*-

# 代码4-3  数据离散化
import pandas as pd
import numpy as np
datafile = '../data/discretization_data.xls'  # 参数初始化
data = pd.read_excel(datafile)  # 读取数据
data = data[u'肝气郁结证型系数'].copy()
k = 4

d1 = pd.cut(data, k, labels = range(k))  # 等宽离散化,各个类比依次命名为0,1,2,3

#等频率离散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1]  # 使用describe函数自动计算分位数
w[0] = w[0]*(1-1e-10)
d2 = pd.cut(data, w, labels = range(k))

from sklearn.cluster import KMeans  # 引入KMeans
kmodel = KMeans(n_clusters = k, n_jobs = 4)  # 建立模型,n_jobs是并行数,一般等于CPU数较好
kmodel.fit(np.array(data).reshape((len(data), 1)))  # 训练模型
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0)  # 输出聚类中心,并且排序(默认是随机序的)
w = c.rolling(2).mean()  # 相邻两项求中点,作为边界点
w = w.dropna()
w = [0] + list(w[0]) + [data.max()]  # 把首末边界点加上
d3 = pd.cut(data, w, labels = range(k))
def cluster_plot(d, k):  # 自定义作图函数来显示聚类结果
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
  plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
  
  plt.figure(figsize = (8, 3))
  for j in range(0, k):
    plt.plot(data[d==j], [j for i in d[d==j]], 'o')
  
  plt.ylim(-0.5, k-0.5)
  return plt

cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()

3.4 属性构造

在数据挖掘的过程中,为了帮助提取有用的信息、挖掘更深层次的模式,提高挖掘结果的精度,需要利用已有的属性集构造出新的属性,加入到现有集合中。

3.5 小波变换

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

# -*- coding: utf-8 -*-

# 代码4-5  小波变换特征提取代码
# 利用小波分析进行特征分析
# 参数初始化
inputfile= '../data/leleccum.mat'  # 提取自Matlab的信号文件

from scipy.io import loadmat  # mat是Python专用格式,需要用loadmat读取它
mat = loadmat(inputfile)
signal = mat['leleccum'][0]

import pywt  # 导入PyWavelets
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
# 返回结果为level+1个数字,第一个数组为逼近系数数组,后面的依次是细节系数数组

四、数据规约

数据规约是将海量数据进行规约,规约之后的数据扔接近于保持原数据的完整性,但数据量小很多。

通过数据规约,可以降低无效、错误数据对建模的影响,提高建模的准确性;少量且具有代表性的数据将大幅缩减数据挖掘所需的时间;降低存储数据的成本。

4.1 属性规约

属性规约常用的方法:合并属性、逐步向前选择、逐步向后删除、决策树归纳、主成分分析。

# -*- coding: utf-8 -*-

# 代码4-6 主成分分析降维
import pandas as pd

# 参数初始化
inputfile = '../data/principal_component.xls'
outputfile = '../tmp/dimention_reducted.xls'  # 降维后的数据

data = pd.read_excel(inputfile, header = None)  # 读入数据

from sklearn.decomposition import PCA

pca = PCA()
pca.fit(data)

pca.components_  # 返回模型的各个特征向量


pca.explained_variance_ratio_  # 返回各个成分各自的方差百分比




# 代码4-7 计算成分结果
pca = PCA(3)
pca.fit(data)
low_d = pca.transform(data)  # 用它来降低维度
pd.DataFrame(low_d).to_excel(outputfile)  # 保存结果
pca.inverse_transform(low_d)  # 必要时可以用inverse_transform()函数来复原数据

low_d

4.2 数值规约

数值规约通过选择替代的、较小的数据来减少数据量。数据规约可以是有参的,也可以是无参的。有参方法是使用一个模型来评估数据,只需存放参数,而不需要存放实际数据,有参的数据规约技术主要有两种:回归(线性回归和多元回归)和对数线性模型(近似离散属性集中的多维概率分布)。数值规约常用方法有直方图、用聚类数据表示实际数据、抽样(采样)、参数回归法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/427229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot中使用Redis

目录 1.依赖 2.依赖关系 3.配置 4.RedisTemplate 5.基础操作 6.事务 1.依赖 maven依赖如下,需要说明的是,spring-boot-starter-data-redis里默认是使用lettuce作为redis客户端的驱动,但是lettuce其实用的比较少,我们常用的…

如何在 Web 实现支持虚拟背景的视频会议

前言 众所周知,市面上有比如飞书会议、腾讯会议等实现视频会议功能的应用,而且随着这几年大环境的影响,远程协作办公越来越成为常态,关于视频会议的应用也会越来越多,且在远程办公的沟通协作中对沟通软件的使用要求会…

ARMv8-A非对齐数据访问支持(Alignment support)

目录 1,对齐传输和非对齐传输 2,AArch32 Alignment support 2.1 Instruction alignment 指令对齐 2.2 Unaligned data access 非对齐数据访问 2.3 SCTLR.A Alignment check enable 3,AArch64 Alignment support 3.1 Instruction align…

Text to image论文精读GigaGAN: 生成对抗网络仍然是文本生成图像的可行选择

GigaGAN是Adobe和卡内基梅隆大学学者们提出的一种新的GAN架构,作者设计了一种新的GAN架构,推理速度、合成高分辨率、扩展性都极其有优势,其证明GAN仍然是文本生成图像的可行选择之一。 文章链接:https://arxiv.org/abs/2303.0551…

大数据周会-本周学习内容总结07

目录 01【hadoop】 1.1【编写集群分发脚本xsync】 1.2【集群部署规划】 1.3【Hadoop集群启停脚本】 02【HDFS】 2.1【HDFS的API操作】 03【MapReduce】 3.1【P077- WordCount案例】 3.2【P097-自定义分区案例】 历史总结 01【hadoop】 1.1【编写集群分发脚本xsync】…

【vue3】关于ref、toRef、toRefs那些事

😉博主:初映CY的前说(前端领域) 📒本文核心:ref、toRef、toRefs的使用方法 【前言】我们在上一节的学习当中,使用了reactive()函数将vue3中的数据变成响应式的数据,本文中所讲的三个方法也能实现将数据转化…

安全防御之IPsec VPN篇

目录 1.什么是数据认证,有什么用,有哪些实现的技术手段? 2.什么是身份认证,有什么用,有哪些实现的技术手段? 3.什么是VPN技术? 4.VPN技术有哪些分类? 5.IPsec技术能够提供哪些安…

走进小程序【八】微信小程序中使用【Vant组件库】

文章目录🌟前言🌟Vant介绍🌟Vant安装🌟npm 支持🌟使用Vant🌟引入组件🌟页面使用组件🌟样式覆盖🌟介绍🌟解除样式隔离🌟使用外部样式类&#x1f31…

基于冯洛伊曼拓扑的鲸鱼算法用于滚动轴承的故障诊断研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…

【YOLO】YOLOv8实操:环境配置/自定义数据集准备/模型训练/预测

YOLOv8实操:环境配置/自定义数据集准备/模型训练/预测引言1 环境配置2 数据集准备3 模型训练4 模型预测引言 源码链接:https://github.com/ultralytics/ultralytics yolov8和yolov5是同一作者,相比yolov5,yolov8的集成性更好了&a…

C++面向对象丨1. 内存分区模型

Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDNAXYZdong,CSDN首发,AXYZdong原创 唯…

图解NLP模型发展:从RNN到Transformer

图解NLP模型发展:从RNN到Transformer 自然语言处理 (NLP) 是深度学习中一个颇具挑战的问题,与图像识别和计算机视觉问题不同,自然语言本身没有良好的向量或矩阵结构,且原始单词的含义也不像像素值那么确定和容易表示。一般我们需…

【随笔记】Win11、RTX3070、CUDA117的深度学习机器学习环境配置

文章目录一、创建深度学习 Conda 虚拟环境二、安装 Pytorch-Gpu三、安装 PyTorch Geometric四、安装 Sklearn五、Jupyter 配置5.1 将虚拟环境加入内核5.2 插件配置5.3 主题、字体、字号配置假设你已经安装了Anaconda3(最新Anaconda3的安装配置及使用教程&#xff08…

里程碑,ChatGPT插件影响几何?

目录插件发布网络浏览器代码解释器平台生态微软魄力总结3月15日OpenAI推出了GPT-4,引起了全球轰动,仅仅过去一周多时间,OpenAI又宣布推出插件功能。如果说ChatGPT是AI的“iPhone时刻”,那么插件就是ChatGPT的“App Store”。超强的…

SpringBoot整合Flink(施耐德PLC物联网信息采集)

SpringBoot整合Flink(施耐德PLC物联网信息采集)Linux环境安装kafka前情:施耐德PLC设备(TM200C16R)设置好信息采集程序,连接局域网,SpringBoot订阅MQTT主题,消息转至kafka&#xff0c…

【chatgpt-01】部署学术神器chatgpt_academic

目录1 chatgpt_academic简介2 前置准备3 项目下载/配置4 安装依赖5 项目配置6 运行7 测试实验性功能1 chatgpt_academic简介 chatgpt_academic是一个科研工作专用ChatGPT拓展,特别优化学术Paper润色体验,支持自定义快捷按钮,支持markdown表格…

Jenkins部署与自动化构建

Jenkins笔记 文章目录Jenkins笔记[toc]一、安装Jenkinsdocker 安装 JenkinsJava启动war包直接安装二、配置mavenGit自动构建jar包三、自动化发布到测试服务器运行超时机制数据流重定向编写清理Shell脚本四、构建触发器1. 生成API token2. Jenkins项目配置触发器3. 远程Git仓库配…

Elasticsearch:配置选项

Elasticsearch 带有大量的设置和配置,甚至可能让专家工程师感到困惑。 尽管它使用约定优于配置范例并且大部分时间使用默认值,但在将应用程序投入生产之前自定义配置是必不可少的。 在这里,我们将介绍属于不同类别的一些属性,并讨…

【风光场景生成】基于改进ISODATA的负荷曲线聚类算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳座右铭&#…

《计算机网络-自顶向下》04. 网络层-数据平面

文章目录网络层数据平面和控制平面两者的概述数据平面控制平面控制平面:传统方法控制平面:SDN 方法网络服务模型路由器工作原理通用路由器体系结构输入端口的功能基于目标的转发交换结构内存交换方式总线交换方式纵横式交换方式输出端口的功能何时何处出…