热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pearson特征选择matlab,常用的特征选择方法之Pearson相关系数

众所周知,特征选择是机器学习活动至关重要的一步。最理想的情况下,我们把所有影响目标的独立因素给找出来,然后使用合适的量化手段,

众所周知,特征选择是机器学习活动至关重要的一步。最理想的情况下,我们把所有影响目标的独立因素给找出来,然后使用合适的量化手段,就能够得到完美描述目标问题的特征列表,用这些特征去建立合适容量的模型,这样的模型能够完美的匹配我们要解决的任务。

但是实际上这种想法太难实现了,我们往往只能从已有的数据出发,通过一些特征变换和组合得到一些原始特征,然后从这些原始特征中选出与目标相关的特征。

随着深度网络的崛起,越来越多的未经复杂变换的原始特征被加入到了深度网络中,大家期待有用的特征能够被自动的抽取和组合出来。但是这并不意味着特征工程就不需要了,推荐系统的大牛 Xavier 在技术博客《Rules of Machine Learning: Best Practices for ML Engineering》中提到很多关于特征工程的建议,非常值得一读,其中包含的思想就是特征是随着系统的优化进程而逐步添加的,并非一蹴而就,要始终保证特征的简单、直观、可复用、可监控和可靠性,这意味着我们需要时常对系统中存量特征做测试和筛选。

特征选择通常有过滤法(Filter)、打包法(Wrap)和嵌入法(Embed),其中,后两者都是与模型相关的,需要具体问题具体对待,而过滤法是指对特征进行预处理,提前过滤掉一些对目标无益(即对模型无益)的特征,它只考虑任务目标,而与模型无关。

我打算把常用的特征选择方法都再回顾一遍,力争把每种方法都讲得通俗易懂。这篇文章先介绍 Pearson 相关系数。

Pearson 相关系数的定义

Pearson 相关系数是用来检测两个连续型变量之间线性相关的程度,取值范围为 $[-1,1]$,正值表示正相关,负值表示负相关,绝对值越大表示线性相关程度越高。在实际做特征工程时候,如果两个变量的相关系数取值为负,可以将特征变量取负号,使之与目标变量正相关,这样来保证所有特征与目标之间都是正相关。

两个变量之间的 Pearson 相关系数定义为两个变量之间的协方差和标准差的商:

上式定义了总体相关系数,常用希腊小写字母 $\rho$ 作为代表符号。估算样本的协方差和标准差,可得到样本 Pearson 相关系数,用英文小写字母 $r$ 表示:

记 $\boldsymbol{x}’=\boldsymbol{x}-\overline{x}$ 和 $\boldsymbol{y}’=\boldsymbol{y}-\overline{y}$ 表示对变量 $\boldsymbol{x}$ 和 $\boldsymbol{y}$ 进行 $0$ 均值化,则实际上 $\boldsymbol{x}$ 和 $\boldsymbol{y}$ 的 Pearson 相关系数就是 $\boldsymbol{x}’$ 和 $\boldsymbol{y}’$ 的 cosine 相似度:$r_{\boldsymbol{x},\boldsymbol{y}}=\cos(\boldsymbol{x}’,\boldsymbol{y}’)=\frac{\boldsymbol{x}’\cdot\boldsymbol{y}’}{|\boldsymbol{x}’|\cdot|\boldsymbol{y}’|}$。

Pearson 相关系数的使用条件

使用 Pearson 相关系数之前需要检查数据是否满足前置条件:

两个变量间有线性关系;

变量是连续变量;

变量均符合正态分布,且二元分布也符合正态分布;

两变量独立;

两变量的方差不为 0;

这些条件在实际中很容易被忽略。

例如,在视频推荐中,我们可以将用户对视频的播放完成度作为目标变量,检测其他连续型特征与它的相关性,或者将这些连续型特征做特定的变换后,检测其与播放完成度的相关性。

但是播放完成度实际上不是正态分布的,如下图所示(实际上大多数日志统计特征,如用户播放视频数、视频播放完成度等,也都不服从正态分布),因此实际上是不能使用 Pearson 相关系数的,这时候可以用 Spearman 或者 Kendall 相关系数来代替。

1d7597eb82dce1443cbcafae5e3e8ec1.png

另外要注意的是,如果两个变量本身就是线性的关系,那么 Pearson 相关系数绝对值越大相关性越强,绝对值越小相关性越弱;但在当两个变量关系未知情况下,Pearson 相关系数的大小就没有什么指导意义了,它的绝对值大小并不能表征变量间的相关性强弱,这个时候最好能够画图出来看看作为辅助判断。我会在下面的例子里再详细的说明这一点。

举例说明

我们举个例子来看如何计算 Pearson 相关系数(这里仅仅演示计算过程,实际上数据的分布也不满足使用 Pearson 相关系数的条件)。

考虑视频推荐场景下,假设我们的目标 (之一) 是最大化视频的播放完成度 $y$,播放完成度的取值范围是 $[0,1]$,我们需要分析哪些因素跟 $y$ 相关,例如有一维特征是表示用户对视频的偏好度,记为 $x$,它的取值范围也是 $[0,1]$,我们把几条样本中 $x$ 和 $y$ 的取值计算出来,并画成散点图,如下所示:

ee5abae215d49cf3997c32b06d323d7d.png

我们可以按照公式 (2) 来计算 $x$ 与 $y$ 的 Pearson 相关系数:

计算变量平均值:$\overline{x} = 0.5,\ \overline{y}=0.55$;

计算平移后的变量:$\boldsymbol{x}=[-0.4,-0.3,-0.2,-0.1,0.1,0.2,0.3,0.4]$,$\boldsymbol{y}=[-0.45,-0.45,-0.35,0.05,0.15,0.25,0.35,0.45]$;

计算公式 (2) 的结果:$r=\frac{0.73}{\sqrt{0.6}\cdot\sqrt{ 0.94}}=0.972$;

通过计算,我们发现,这个特征与目标变量之间的线性相关性非常高,这与我们看图得到的认知是一致的。因此我们可以把这一维特征作为有效特征加入。

但是,如果我们对这个例子稍加修改,将最后一个数据点 $(0.9,1.0)$ 改为 $(0.9,-1.0)$,如图 3 所示:

6fd6c5921ad6bed8e14e7bd6d2401ed6.png

从我们的观察来看,最后一个数据点可能是噪声或者异常值,对我们判断两个变量的线性相关性应该不造成影响,但是实际上,我们再次计算一下这两个变量的 Pearson 相关系数,此时的值仅仅只有 $-0.0556$,可以说是几乎不线性相关了,这说明 Pearson 相关系数小并不代表线性相关性一定弱。在这种情况下,我们应该在数据清洗阶段把特征的异常值过滤或者平滑掉以后,再计算它与目标的相关系数。

反过来,Pearson 相关系数大也并不代表线性相关性一定强。图 4 列举了几个 Pearson 相关系数均为 $0.816$ 的变量数据,其中有些变量间并非明显的线性相关,或者是明显的二次相关,只是 Pearson 相关系数恰好较大而已。

9aa3bfe6a159613fbac56af062a10568.png

附示例的 python 代码:

1

2

3

4

5

6

7

8>>>from scipy.stats import pearsonr

>>>x = [0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9]

>>>y = [0.1, 0.1, 0.2, 0.6, 0.7, 0.8, 0.9, 1.0]

>>>pearsonr(x, y)

(0.97203814535663591, 5.3516208203873684e-05)

>>>z = [0.1, 0.1, 0.2, 0.6, 0.7, 0.8, 0.9, -1.0]

>>>pearsonr(x, z)

(-0.055618651039326214, 0.89592989552025337)

这里,pearsonr 返回的第二个结果是 p-value,其具体含义可参考官方文档。

Take-aways

本文简单的介绍了基于 Pearson 相关系数的特征选择方法,主要注意点总结如下:

Pearson 相关系数是用来检测两个连续型变量之间线性相关的程度,并且要求这两个变量分别分布服从正态分布;

Pearson 相关系数仅能度量变量间的线性相关性,如果变量间相关性未知,则 Pearson 相关系数的大小没有指导意义,此时需要借助可视化手段辅助判断;

两变量的 Pearson 相关系数实际上是这两个变量 $0$ 均值化后的 cosine 相似度;

如果两个变量是非线性相关,为了使用线性模型,可以先将特征变量进行非线性变换,使之与目标线性相关;

Pearson 相关系数对异常值比较敏感,在数据清洗阶段需要将异常值过滤或者平滑处理。



推荐阅读
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • 在 Windows 10 系统下配置 Python 3 和 OpenCV 3 的环境时,建议使用 Anaconda 分发版以简化安装过程。Anaconda 可以从其官方网站(https://www.anaconda.com/download)下载。此外,本文还推荐了几本关于 Python 和 OpenCV 的专业书籍,帮助读者深入理解和应用相关技术。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • 在使用sbt构建项目时,遇到了“对象apache不是org软件包的成员”的错误。本文详细分析了该问题的原因,并提供了有效的解决方案,包括检查依赖配置、清理缓存和更新sbt插件等步骤,帮助开发者快速解决问题。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • Android开发常见问题汇总(含Gradle解决方案)第二篇
    本文继续深入探讨Android开发中常见的问题及其解决方案,特别聚焦于Gradle相关的挑战。通过详细分析和实例演示,帮助开发者高效解决构建过程中的各种难题,提升开发效率和项目稳定性。 ... [详细]
  • Python进阶:深入理解高阶函数的应用与实践
    本文深入探讨了Python中高阶函数的应用与实践,重点分析了 `map` 函数的使用方法及其在不同版本 Python 中的差异。`map` 函数能够将序列中的每个元素传递给指定的函数,并返回一个新的可迭代对象(在 Python 3 中为 `map` 对象,在 Python 2 中为列表)。通过具体示例,详细讲解了如何利用 `map` 函数进行高效的函数式编程,以及如何在实际开发中优化代码结构和性能。 ... [详细]
  • 在上篇文章的基础上,本文将继续探讨 Linux 设备驱动中的设备模型与 `devicedriverbus` 机制。在将设备注册到总线之前,需要先创建 `device` 对象。可以通过静态定义 `device` 结构体变量,并调用 `device_register` 函数来完成这一过程。此外,文章还将详细解析设备模型的内部工作机制,以及 `devicedriverbus` 机制如何实现设备与驱动的自动匹配和管理。 ... [详细]
  • 谷歌工程师:TensorFlow已重获新生;网友:我还是用PyTorch
    乾明发自凹非寺量子位报道|公众号QbitAI道友留步!TensorFlow已重获新生。在“PyTorch真香”的潮流中,有人站出来为TensorFlow说话了。这次来自谷歌的工程师 ... [详细]
  • 如何精准识别真正的36k纯数据科学家:专业指南与技巧分享
    2019独角兽企业重金招聘Python工程师标准毋庸置疑,数据科学家是大数据时代最紧缺的人才。但数据科学家究竟具备什么特质?会编程的工程师声称自己 ... [详细]
author-avatar
GloryWumie
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有