[机器学习]特征工程:特征降维

news2024/11/19 3:27:12

特征降维

1、简介

特征降维是指通过减少特征空间中的维度,将高维数据映射到一个低维子空间的过程

在机器学习和数据分析中,特征降维可以帮助减少数据的复杂性、降低计算成本、提高模型性能和可解释性,以及解决维度灾难等问题。特征降维通常分为两种主要方法:特征选择和特征提取。

  1. 特征选择(Feature Selection)特征选择是指从原始特征中选择一部分最具有代表性和重要性的特征子集,而忽略其他特征。这样可以减少特征的数量,从而降低了维度。特征选择方法可以基于统计检验、信息增益、模型权重等指标来评估特征的重要性,然后选择排名靠前的特征。
  2. 特征提取(Feature Extraction)特征提取是通过数学变换将原始特征映射到一个新的低维子空间,从而保留数据中的关键信息。常见的特征提取方法包括主成分分析(PCA)、线性判别分析(LDA)、独立成分分析(ICA)等。这些方法通过线性或非线性的映射,将高维数据转化为低维表示,使得新特征具有更强的表达能力。

特征降维的优点包括:

  • 减少维度灾难:维度灾难是指在高维空间中,数据稀疏性增加,距离度量失效等问题。特征降维可以减轻这些问题,使得数据更易处理和分析。
  • 减少计算成本:高维数据的计算成本较高,特征降维可以降低计算复杂性,提高算法效率。
  • 提高模型性能:在一些情况下,特征降维可以提高模型的性能,减少过拟合,提高泛化能力。
  • 可视化和解释性:将数据映射到低维空间可以更容易地进行可视化和解释,帮助理解数据中的模式和关系。

特征降维的选择取决于数据的性质、问题的需求和模型的要求。不同的降维方法适用于不同的情况,需要根据具体问题来进行选择和应用。

2、降维

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程

降低随机变量的个数:

相关特征(correlated feature):相对湿度与降雨量之间的相关

正是因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大

降维的两种方式:特征选择和主成分分析(可以理解一种特征提取的方式)

3、特征选择

3.1、简述

定义:数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。

特征选择是指从原始数据的特征集合中选择出最具有代表性和重要性的一部分特征,以便用于构建模型、分析数据或解决问题。

特征选择的目标是减少特征的数量,同时保留数据中最具信息量的部分,从而降低计算成本、提高模型性能、加速训练过程和提高模型的可解释性。

特征选择的主要动机是:

  1. 降低维度:高维数据集中的特征数量可能非常庞大,导致计算和存储开销增加,降低了算法的效率。
  2. 减少过拟合:过多的特征可能导致模型过于复杂,容易在训练集上表现良好,但在新数据上表现较差(过拟合)。
  3. 提高模型性能:一些特征可能对模型性能没有贡献,甚至可能带来噪声。通过选择重要的特征,可以提高模型的性能。
  4. 改善解释性:使用更少的特征可以使模型更容易理解和解释。

特征选择方法可以分为三大类:

  1. 过滤法(Filter Methods):通过在特征选择之前对特征进行评估和排序,选择与目标变量相关性较高的特征。常用的过滤方法包括方差选择、相关系数、互信息等。
  2. 包装法(Wrapper Methods):将特征选择视为一个优化问题,根据模型的性能来选择特征。常见的包装方法包括递归特征消除(Recursive Feature Elimination, RFE)和前向选择(Forward Selection)等。
  3. 嵌入法(Embedded Methods):在模型训练过程中进行特征选择,通过优化模型的性能来选择特征。例如,决策树和正则化线性模型可以在训练过程中剪枝或约束特征的权重。

特征选择方法的选择取决于数据的性质、问题的需求和模型的要求。不同的方法适用于不同的情况,需要根据具体问题来选择和应用。特征选择是数据预处理的重要一环,能够为构建更准确、高效和可解释的机器学习模型奠定基础。

3.2、两种方法

Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联

方差选择法:低方差特征过滤

相关系数

Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联)

决策树:信息熵、信息增益

正则化:L1、L2

深度学习:卷积等

需要使用的模块:sklearn.feature_selection

3.3、过滤式

3.3.1、低方差特征过滤

删除低方差的一些特征,前面讲过方差的意义。再结合方差的大小来考虑这个方式的角度。

特征方差小:某个特征大多样本的值比较相近

特征方差大:某个特征很多样本的值都有差别

API:

sklearn.feature_selection.VarianceThreshold(threshold = 0.0)

删除所有低方差特征

Variance.fit_transform(X)

X:numpy array格式的数据[n_samples,n_features]

返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。

案例实践:

下面进行数据计算,我们对某些股票的指标特征之间进行一个筛选,需要的数据保存在factor_returns.csv文件。

需要除去'index,'date','return'列不考虑(这些类型不匹配,也不是所需要指标)

所以需要的特征如下:pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense

下面进行分析:

1、初始化VarianceThreshold,指定阀值方差

2、调用fit_transform

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/8/16 10:01
import pandas as pd
from sklearn.feature_selection import VarianceThreshold  # 低方差特征过滤

'''
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
    删除所有低方差特征
    Variance.fit_transform(X)
    X:numpy array格式的数据[n_samples,n_features]
    返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
'''
def variance_demo():
    """
    删除低方差特征——特征选择
    :return: None
    """
    data = pd.read_csv("data/factor_returns.csv")
    print(data)
    # 1、实例化一个转换器类
    transfer = VarianceThreshold(threshold=1)
    # 2、调用fit_transform
    data = transfer.fit_transform(data.iloc[:, 1:10])
    print("删除低方差特征的结果:\n", data)
    print("形状:\n", data.shape)


if __name__ == '__main__':
    # 设置 Pandas 输出选项以展示所有行和列的内容
    pd.set_option('display.max_columns', None)
    variance_demo()

结果如下:

3.3.2、相关系数

皮尔逊相关系数(Pearson Correlation Coefficient):反映变量之间相关关系密切程度的统计指标

皮尔逊相关系数(Pearson Correlation Coefficient),也称为皮尔逊相关系数或皮尔逊相关系数,是一种用于衡量两个连续变量之间线性关系强度和方向的统计量。它衡量了两个变量之间的线性相关程度。

相关系数的值介于–1与+1之间,即–1≤ r ≤+1。其性质如下:

  • 当r>0时,表示两变量正相关,r<0时,两变量为负相关
  • 当|r|=1时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系
  • 当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱
  • 一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关

公式:

 

参数如下:

n:观测值的数量。

∑:求和符号,表示对所有观测值求和。

x 和 y:分别表示两个变量的观测值。

API:

from scipy.stats import pearsonr

x : (N,) array_like

y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)

案例:股票的财务指标相关性计算

我们刚才的股票的这些指标进行相关性计算, 假设我们以factor = ['pe_ratio','pb_ratio','market_cap','return_on_asset_net_profit','du_return_on_equity','ev','earnings_per_share','revenue','total_expense']这些特征当中的两两进行计算,得出相关性高的一些特征。

分析:两两特征之间进行相关性计算

import pandas as pd
from scipy.stats import pearsonr  # 皮尔逊相关系数

'''
from scipy.stats import pearsonr
    x : (N,) array_like
    y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
'''
def pearsonr_demo():
    """
    相关系数计算
    """
    data = pd.read_csv("data/factor_returns.csv")

    factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev',
              'earnings_per_share', 'revenue', 'total_expense']

    for i in range(len(factor)):
        for j in range(i, len(factor) - 1):
            print("指标%s与指标%s之间的相关性大小为%f" % (factor[i], factor[j + 1], pearsonr(data[factor[i]], data[factor[j + 1]])[0]))

if __name__ == '__main__':
    # 设置 Pandas 输出选项以展示所有行和列的内容
    pd.set_option('display.max_columns', None)
    pearsonr_demo()

结果:

从中可以得出:

指标revenue与指标total_expense之间的相关性大小为0.995845

指标return_on_asset_net_profit与指标du_return_on_equity之间的相关性大小为0.818697

画图:

这两对指标之间的相关性较大,可以做之后的处理,比如合成这两个指标。

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

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

相关文章

机器学习知识点总结:什么是EM(最大期望值算法)

什么是EM(最大期望值算法) 在现实生活中&#xff0c;苹果百分百是苹果&#xff0c;梨百分白是梨。 生活中还有很多事物是概率分布&#xff0c;比如有多少人结了婚&#xff0c;又有多少人有工作&#xff0c; 如果我们想要调查人群中吸大麻者的比例呢&#xff1f;敏感问题很难得…

实战项目:基于主从Reactor模型实现高并发服务器

项目完整代码仿mudou库one thread one loop式并发服务器实现: 仿muduo库One Thread One Loop式主从Reactor模型实现⾼并发服务器&#xff1a;通过模拟实现的⾼并发服务器组件&#xff0c;可以简洁快速的完成⼀个⾼性能的服务器搭建。并且&#xff0c;通过组件内提供的不同应⽤层…

更新arm的linux编译工具链

虑到目前arm的gcc 5.5的工具链对C17语法支持不足&#xff0c;需要升级下工具链。 以下是详细步骤。使用官方提供的工具链 ARM官方的工具链网站&#xff1a; https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads bare-metal这个版本就是没有操作系统(裸机环…

如何利用Simulation模拟零件受到的冲击力

线性静力载荷作用过程是恒定的&#xff0c;不随时间变化&#xff1b;单冲击力载荷作用的时间很短&#xff0c;高速高能量&#xff1b;今天给大家分享的是Simulation怎么模拟零件受到冲击力。 DEMO案例介绍&#xff1a;板材规格250X120X10&#xff0c;在板材的中心Φ5的区域受冲…

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基…

【T3】畅捷通T3凭证预览/打印摘要和凭证中看到的摘要不一样。

【问题描述】 畅捷通T3软件中&#xff0c; 凭证打印预览以及打印出来的效果和直接在凭证界面看到的该凭证摘要不一致。 【解决方法】 执行下述清除凭证摘要特殊字符和空格的语句后&#xff0c;重新预览打印。 update GL_accvouch set cdigestREPLACE(cdigest,CHAR(9),) whe…

找pr剪辑素材就上这6个网站,免费可商用。

视频剪辑没素材&#xff0c;就上这几个网站找&#xff0c;免费、付费、商用素材全都有&#xff0c;最重要的是高清、4K无水印&#xff0c;赶紧马住了。 潮点视频 https://shipin520.com/?from_code2510 潮点视频是一个提供优质高清、无水印的视频素材网站&#xff0c;站内有大…

javaScript:数组方法(增删/提取类/截取/操作方法等)

目录 一.数组的增删方法 1.push()数组末尾添加元素 解释 代码 运行截图 2.unshift()向数组的头部添加数组 解释 代码 运行截图 3.pop()数组的尾部删除一个元素 解释 代码 运行截图 4.shift()数组的头部删除一个元素 解释 代码 运行截图 5. splice()任意位…

2003-2022年高铁站开通时间

2003-2022年高铁站开通时间 1、时间区间&#xff1a;2003-2022年 2、指标如下&#xff1a;高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注 指标说明&#xff1a;Hsrwsnm[高铁站名称]-高铁站名称 Optm[开通时间]-高铁站开通的时间 Prvn[所在省份]-高…

《Go 语言第一课》课程学习笔记(一)

配好环境&#xff1a;选择一种最适合你的 Go 安装方法 选择 Go 版本 一般情况下&#xff0c;建议采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的&#xff0c;少有影响使用的重大 bug。可以根据不同实际项目需要或开源社区的情况使用不同的版本。 有…

【Web 表单】与用户数据打交道-2(mdn笔记)

8. UI 伪类 8.1 都有什么样的伪类&#xff1f; 我们可以使用的&#xff08;截至 CSS 2.1&#xff09;与表单相关的原始伪类是&#xff1a; :hover&#xff1a;只在鼠标指针悬停在一个元素上时选择该元素。:focus&#xff1a;只在元素被聚焦时选择该元素&#xff08;也就是说&am…

绘制 PCA 双标图和碎石图

1、双标图 import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn import datasets# data np.random.random((1000,10)) # y np.random.randint(0,6,1000)iris datase…

C# WPF 无焦点自动获取USB 二维码扫码枪内容,包含中文

C# WPF 无焦点自动获取USB 二维码扫码枪内容&#xff0c;包含中文 前言项目背景 需要预知的知识实现方案第一步 安装键盘钩子第二步 获取输入的值第3 步 解决中文乱码问题分析解决思路工具函数 结束 前言 USB接口的扫码枪基本就相当于一个电脑外设&#xff0c;等同于一个快速输…

Jmeter数据驱动 —— csv高效用例

目录 1、设置测试用例&#xff0c;创建用例数据文件&#xff1a;testcase.csv 2、新建一个线程组&#xff0c;命名为&#xff1a;数据驱动&#xff0c;添加配置元件-HTTP请求默认值&#xff0c;配置好IP地址和端口号 3、添加逻辑控制器-循环控制器。循环控制器的作用可以控制…

IDEA中导出Javadoc遇到的GBK编码错误的解决思路和应用

IDEA中导出Javadoc遇到的GBK编码错误的解决思路和应用 ​ 当我们在导出自己写的项目的api文档的时候呢&#xff0c;有的时候会出现以下问题&#xff1a;也就是GBK编码错误不可导出 错误描述&#xff1a;编码GBK的不可映射字符无法导出&#xff0c;可以看出这是我们自己写的中文…

移动app软件安全性测试内容有哪些?专业移动app测试报告获取

移动app软件安全性测试报告是评估和验证移动应用程序在设计和开发过程中是否具有足够的安全性措施。在当今移动应用程序的高度发展和普及中&#xff0c;保护用户的个人数据和信息安全至关重要。 一、移动app软件安全性测试包括的内容 1、权限访问测试&#xff1a;测试app获取…

【BIOS】Bios设置通电即自动开机。

【问题需求】 设置电脑/服务器接通电源后&#xff0c;自动开机。 【解决方案】 不同主板的bios设置不一样&#xff0c;但方向都差不多。 在此整理一些不同准版bios的设置方法。 【通用主板Bios】 开机后连续按del键&#xff0c;进入Bios。 切换到【Advanced】菜单下&#xff…

【STM32学习】搭建一个简单的 keil5 工程

一、安装 pack 支持包 pack是支持包文件&#xff0c;当你的板子连接到电脑时&#xff0c;keil5 怎么知道你的板子是哪个型号的&#xff0c;这就需要用到 pack 文件了。Keil 官方下载pack文件的地址&#xff1a;download | device pack 我这里使用的是 STM324 系列 随后直接一…

Nginx运行Vue项目:基本运行

需求 在Nginx服务器中&#xff0c;运行Vue项目。 说明 Vue项目打包生成的生产文件&#xff0c;是无法直接在浏览器打开的。需要放到Nginx服务器中&#xff0c;才能够访问。 本文章只介绍最基本的情况&#xff1a;Nginx中运行一个Vue项目。 实际生产环境&#xff0c;一个Ng…

Qt开发实现字幕滚动效果

1、效果展示 我们经常能够在外面看到那种滚动字幕&#xff0c;那么就拿qt来做一个吧。 2、实现思路 实现一个窗口部件&#xff0c;这个窗口部件显示了一串文本标语,它会每t毫秒向左移动一个像素。如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度…