数据挖掘(二)数据预处理

前言

基于国防科技大学 丁兆云老师的《数据挖掘》
数据挖掘
数据挖掘(一)数据类型与统计

2、数据预处理

在这里插入图片描述

2.1数据清理

缺失值处理:

from sklearn.impute import SimpleImputer

# 创建一个SimpleImputer对象,指定缺失值的处理策略(如均值、中位数、众数等)
imputer = SimpleImputer(strategy='mean')  # 可以替换为'median'、'most_frequent'或'constant'

# 假设X是包含缺失值的特征矩阵
X = [[1, 2], [np.nan, 3], [7, 6]]

# 使用fit_transform方法对特征矩阵进行缺失值处理
X_imputed = imputer.fit_transform(X)

# 输出处理后的特征矩阵
print(X_imputed)

离群值处理:

一般使用基于统计方法的离群值处理:(配合箱线图)

  • 标准差方法(Standard Deviation Method):通过计算数据的均值和标准差,将超过一定标准差阈值的值识别为离群值,并进行处理。
  • 百分位数方法(Percentile Method):基于数据的百分位数,将超过一定百分位数阈值的值识别为离群值,并进行处理。

其它方法还有基于聚类方法的离群值处理,基于监督学习方法的离群值处理等等

2.2 数据集成:

数据集成(Data Integration)是将来自不同来源的数据合并到一个一致的数据集中的过程。在数据集成中,目标是将具有不同结构和格式的数据源整合成一个统一的视图,以便更好地进行数据分析和建模。

在数据集成过程中,可以采用以下方法:

  1. 数据合并(Data Concatenation):将相同结构的数据源按行或列进行合并。例如,使用Pandas库可以使用concat函数或merge函数来合并DataFrame对象。
  2. 数据追加(Data Appending):将不同结构的数据源按行追加到一个数据集中。这通常用于添加新的记录。同样,Pandas库提供了append函数来实现数据追加。
  3. 数据连接(Data Joining):根据特定的键(Key)将不同数据源中的记录连接起来。这类似于数据库中的表连接操作。Pandas库中的merge函数提供了灵活的数据连接功能。
  4. 数据匹配(Data Matching):通过相似性匹配的方法将数据源中的记录进行关联。这可以使用文本匹配、字符串匹配或其他相似性度量来实现。
  5. 实体解析(Entity Resolution):通过识别和解决不同数据源中的相同实体(例如人名、公司名等)来进行数据集成。这可以使用姓名解析、实体链接等方法来实现。

容易出现的问题:数据冗余

解决方案:相关性分析和协方差分析

相关性分析(离散型):

在这里插入图片描述

连续型:

在这里插入图片描述

在这里插入图片描述

协方差只能测量线性关系,不能完全描述两个变量之间的非线性关系。此外,协方差的数值大小受到变量单位的影响,因此通常使用标准化的相关系数(如皮尔逊相关系数)来更准确地衡量变量之间的相关性。

2.3 数据规约:

数据规约(Data Reduction)是数据挖掘和分析中的一个重要步骤,旨在减少数据集的维度或数量,同时保留关键信息,以提高计算效率和模型性能。

2.3.1降维:

在数据分析和机器学习任务中,降维(Dimensionality Reduction)是一种常用的数据规约技术,它通过减少特征的维度来处理高维数据。

在这里插入图片描述

主成分分析(Principal Component Analysis,PCA)是一种常用的降维方法和统计技术,用于将高维数据集转换为低维表示,同时保留数据中的主要信息。PCA的目标是通过线性变换将原始特征空间映射到新的特征空间,使得新的特征具有最大的方差。

以下是PCA的基本步骤:

  1. 标准化数据:首先,对原始数据进行标准化处理,使得每个特征具有零均值和单位方差。这是为了确保不同特征的尺度不会对PCA的结果产生不合理的影响。
  2. 计算协方差矩阵:通过计算标准化后的数据的协方差矩阵,来衡量不同特征之间的相关性。协方差矩阵的元素表示了不同特征之间的协方差。
  3. 计算特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征值表示了新特征空间中的方差,特征向量表示了原始特征空间到新特征空间的映射关系。
  4. 选择主成分:按照特征值的大小降序排列,选择最大的k个特征值对应的特征向量作为主成分,其中k是希望保留的维度。
  5. 构建投影矩阵:将选择的主成分作为列向量,构建投影矩阵。通过将原始数据与投影矩阵相乘,可以将数据映射到新的低维特征空间。
from sklearn.decomposition import PCA
import numpy as np

# 创建一个示例数据集
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])

# 创建PCA对象,并指定降维后的维度为2
pca = PCA(n_components=2)

# 对数据集进行PCA降维
X_reduced = pca.fit_transform(X)
# 获取每个主成分的贡献率
variance_ratio = pca.explained_variance_ratio_

# 计算累积贡献率
cumulative_variance_ratio = np.cumsum(variance_ratio)

# 输出每个主成分的贡献率和累积贡献率
for i, ratio in enumerate(variance_ratio):
    print(f"Component {i+1}: {ratio:.4f}")

print("Cumulative Contribution Rate:")
print(cumulative_variance_ratio)
# 输出降维后的数据
print(X_reduced)

一般取累积贡献比达到85%到95%

2.3.2 降数据(降采样):

下面介绍两种常见的降采样方法:

  1. 随机抽样(Random Sampling):从原始数据集中随机选择一部分样本作为降采样后的数据集。这种方法简单快速,但可能会导致抽样后的数据集不够代表性。
import numpy as np

# 创建一个示例数据集
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])

# 随机抽样,降采样至2个样本
num_samples = 2
random_indices = np.random.choice(X.shape[0], size=num_samples, replace=False)
X_reduced = X[random_indices]

# 输出降采样后的数据
print(X_reduced)
  1. 分层抽样(Stratified Sampling):保持原始数据集中不同类别样本的比例,从每个类别中抽取一定数量的样本作为降采样后的数据集。这种方法可以保持类别分布的均衡性。
from sklearn.model_selection import train_test_split

# 创建一个示例数据集和标签
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
y = np.array([0, 1, 0, 1])

# 分层抽样,保持类别比例,降采样至2个样本
num_samples = 2
X_reduced, _, y_reduced, _ = train_test_split(X, y, train_size=num_samples, stratify=y, random_state=42)

# 输出降采样后的数据和标签
print(X_reduced)
print(y_reduced)

2.3.3 数据压缩

2.4 数据转换与离散化:

2.4.1 规范化在这里插入图片描述

最小-最大规范化(Min-Max Normalization):
最小-最大规范化将数据线性地映射到一个指定的范围(通常是[0, 1]或[-1, 1])。公式如下:

X_norm = (X - X_min) / (X_max - X_min)

其中,X为原始数据,X_min和X_max分别为原始数据的最小值和最大值。

import numpy as np

# 创建一个示例数据集
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 最小-最大规范化
X_min = np.min(X, axis=0)
X_max = np.max(X, axis=0)
X_norm = (X - X_min) / (X_max - X_min)

# 输出规范化后的数据
print(X_norm)

Z-Score规范化(Standardization):
Z-Score规范化将数据转换为均值为0、标准差为1的分布。公式如下:

X_norm = (X - mean) / std

其中,X为原始数据,mean为原始数据的均值,std为原始数据的标准差。

import numpy as np

# 创建一个示例数据集
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# Z-Score规范化
mean = np.mean(X, axis=0)
std = np.std(X, axis=0)
X_norm = (X - mean) / std

# 输出规范化后的数据
print(X_norm)

2.4.2 离散化
在这里插入图片描述

等宽离散化(Equal Width Discretization):
等宽离散化将数据的值范围分成相等宽度的区间。具体步骤如下:

  • 确定要划分的区间个数(例如,n个区间)。
  • 计算数据的最小值(min_value)和最大值(max_value)。
  • 计算每个区间的宽度(width):width = (max_value - min_value) / n。
  • 将数据根据区间宽度映射到相应的区间。
import numpy as np

# 创建一个示例数据集
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 等宽离散化
n_bins = 3
width = (np.max(X) - np.min(X)) / n_bins
bins = np.arange(np.min(X), np.max(X) + width, width)
X_discretized = np.digitize(X, bins)

# 输出离散化后的数据
print(X_discretized)

等频离散化(Equal Frequency Discretization):
等频离散化将数据划分为相同数量的区间,每个区间包含相同数量的数据。具体步骤如下:

  • 确定要划分的区间个数(例如,n个区间)。
  • 计算每个区间的数据数量(每个区间应包含总数据数量除以区间个数的数据)。
  • 将数据按照值的大小排序。
  • 按照区间的数据数量依次划分数据。
import numpy as np

# 创建一个示例数据集
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 等频离散化
n_bins = 3
bin_size = len(X) // n_bins
sorted_X = np.sort(X)
bins = [sorted_X[i * bin_size] for i in range(1, n_bins)]
X_discretized = np.digitize(X, bins)

# 输出离散化后的数据
print(X_discretized)

聚类离散化(Cluster Discretization):
聚类离散化使用聚类算法将数据划分为不同的簇,每个簇作为一个离散化的值。常用的聚类算法包括K-Means、DBSCAN等。该方法需要根据数据的分布和特点进行参数调整和簇数的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day07beef-xss之根据beef-xss获取cookies

1.安装 apt-get update apt-get install beef-xss 若报错运行不了尝试 apt remove ruby apt remove beef-xss apt-get install ruby apt-get install ruby-dev libpcap-dev gem install eventmachine apt-get install beef-xss 2.运行 beef-xss 运行成功会自动弹出浏览框。 攻…

WM Transaction Code 仓库管理模块事务代码大全

1.1 LE-WM 仓库管理 Warehouse Management 仓库管理事务码 描述 LB01 Create Transfer Requirement 创建转储需求 LB02 Change transfer requirement 修改转储需求 LB03 Display Transfer Requirement 显示转储需求 LB10 TRs for Storage Type 按仓储类型的转储请求 …

一次完整的GC流程

Java堆中内存区分 Java的堆由新生代(Young Generation)和老年代(Old Generation)组成。新生代存放新分配的对象,老年代存放长期存在的对象。 新生代(Young)由年轻区(Eden&a…

uniapp开发微信小程序,选择地理位置uni.chooseLocation

<view click"toCommunity">点击选择位置</view>toCommunity() {const that thisuni.getSetting({success: (res) > {const status res.authSetting// 如果当前设置是&#xff1a;不允许&#xff0c;则需要弹框提醒客户&#xff0c;需要前往设置页面…

linux开发笔记(buildroot 增加自己的开发板支持文件)

1、该笔记参考了mangopi r3的buildroot。某宝上卖的LC-PI-200S提供的buildroot就是这个。已经上传到我的资源中&#xff0c;可以下载看看。 2、首先在buildroot目录输入make menuconfig打开buildroot配置。 进入build options查看 可以看到第二行就是buildroot配置的保存位置…

STM32_HAL_RTC_中断实现闹钟

1STM32设置 在STM32Cude中设置RTC//具体设置看先前发的文章 再打开闹钟中断&#xff08;如下图&#xff09; 2代码思路 2.1启动闹钟&#xff08;HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,FORMAT_BCD)&#xff09; 2.2设置回调函数&#xff08;void HAL_RTC_AlarmAEventC…

指针(脑图梳理)

今天让我们来梳理一下指针都有哪些概念吧 这个脑图是整理的一些指针相关知识的概念&#xff0c;希望对大家有帮助

uni-app(二):本地插件使用(Android)

本地插件使用 项目创建等参考1.下载并引用本地插件2.注意插件配置3.制作自定义基座4.编写调用代码5.运行 项目创建等参考 https://lprosper.blog.csdn.net/article/details/138655526 1.下载并引用本地插件 2.注意插件配置 3.制作自定义基座 4.编写调用代码 <template>…

leetcode刷题——设计循环链表

题目要求我们设计循环队列&#xff0c;其特点是容量固定&#xff0c;队列循环&#xff0c;如图所示&#xff1a; 这里的队列我们以链表队列举例&#xff0c;对于循环&#xff0c;只需要把尾节点的指针指向头节点。重点是队列的容量固定&#xff1a;如何确定队列是否已满和空&am…

ExcelVBA取序号与合计之间的数据

今天有人提出这样一个问题&#xff0c; ExcelVBA取序号与合计之间的数据 数据如下: 分析一下&#xff0c;问题关键&#xff1a; 问题&#xff1a;1.我要在“序号”两字后面开始取数&#xff0c;因为序号是合并的&#xff0c;所以。。。2.我要取合计前面的数据&#xff0c;所以要…

WebRTC 的核心:RTCPeerConnection

WebRTC 的核心&#xff1a;RTCPeerConnection WebRTC 的核心&#xff1a;RTCPeerConnection创建 RTCPeerConnection 对象RTCPeerConnection 与本地音视频数据绑定媒体协商ICE什么是 Candidate&#xff1f;收集 Candidate交换 Candidate尝试连接 SDP 与 Candidate 消息的互换远端…

【JavaSE】/*初识Java*/

目录 一、了解 Java 语言 二、Java 语言的重要性 2.1 使用程度 2.2 工作领域 三、Java 语言的特性 四、Java 的基础语法 五、可能遇到的错误 六、第一个 java 程序代码解析 七、Java 注释 八、Java 标识符 九、Java 关键字 一、了解 Java 语言 Java 是由 Sun Micr…

攻防世界(CTF)~web-supersqli(详细解题思路)

题目介绍 题目描述“随便注” 先看一下是否存在注入 判断闭合方式 输入1’ and 11-- -正常回显 输入1and 12-- -无回显,确认是单引号闭合 看一下列数 输入1 order by 2-- - 有回显 输入1 order by 3-- - 报错&#xff0c;由此判断两列 使用union联合注入发现select被过滤了&a…

【学习AI-相关路程-工具使用-自我学习-Ubuntucudavisco-开发工具尝试-基础样例 (2)】

【学习AI-相关路程-工具使用-自我学习-cuda&visco-开发工具尝试-基础样例 &#xff08;2&#xff09;】 1、前言2、环境说明3、总结说明4、工具安装0、验证cuda1、软件下载2、插件安装 5、软件设置与编程练习1、创建目录2、编译软件进入目录&创建两个文件3、编写配置文…

Java练手项目 个人学习等选题参考

难度系数说明&#xff1a; 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目是非常值得反复学习的&#xff0c;从项目中成长 前言 大家好&#xff0c;我是二哈喇子&#xff0c;此博文整理了各种项目需求 要从本篇文章下的项目中学习的思路&#xff1a; 用的…

2024 年最新使用 ntwork 框架搭建企业微信机器人详细教程

NTWORK 概述 基于 PC 企业微信的 api 接口&#xff0c;支持收发文本、群、名片、图片、文件、视频、链接卡片等。 下载安装 ntwork pip install ntwork国内源安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ntwork企业微信版本下载 官方下载&#xff1a;h…

大模型prompt实例:知识库信息质量校验模块

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

移动应用开发实验四AlarmManager实现闹钟提醒

实验目的和要求 在Android Studio中&#xff0c;通过AlarmManager实现闹钟提醒。 点击“SET ALARM”后&#xff0c;采用Toast方式提示用于设定的闹钟成功&#xff0c;并包含设定的闹钟启用时间。 当闹钟生效时&#xff0c;采用AlertDialog实现闹钟题型&#xff0c;并通过Ale…

Linux 进程信号【信号产生】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 信号概念 1. 生活角度的信号 2…

解决常见的Android问题

常见问题&#xff1a; 1、查杀&#xff1a; 查杀一般分为两个方向一种是内存不足的查杀&#xff0c;一种的是因为温度限频查杀&#xff0c;统称为内存查杀&#xff0c;两个问题的分析思路不同 1、内存不足查杀&#xff1a; 主要是因为当用户出现后台运行多个APP或者是相机等…