Python3数据分析与挖掘建模(16)特征降维与特征衍生

news2024/11/24 13:44:13

1. 特征降维(PCA)

回顾知识点:

特征降维是指将高维特征空间的数据映射到低维空间的过程,以减少特征的数量并保留数据的主要信息。下面是特征降维的一般步骤:

(1)求特征协方差矩阵:对原始数据进行预处理,计算特征之间的协方差矩阵。协方差矩阵描述了特征之间的线性关系。

(2)求协方差的特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。

(3)排序选择特征:将特征值按照从大到小的顺序进行排序,选择其中最大的k个特征值对应的特征向量作为主要特征。

(4) 样本投影:将原始数据样本点投影到选取的特征向量所张成的低维空间上,得到降维后的数据表示。

通过特征降维,可以减少数据的维度,降低计算复杂度,去除冗余信息,提取主要特征,从而更好地理解数据、可视化数据、加快模型训练和预测等。

需要注意的是,特征降维方法有多种,除了基于协方差矩阵的主成分分析(PCA)方法外,还有独立成分分析(ICA)、线性判别分析(LDA)等方法,选择合适的特征降维方法要根据具体任务和数据特点进行综合考虑。

2. LDA 降维

2.1 概述

LDA(Linear Discriminant Analysis)降维是一种经典的线性降维方法,其核心思想是通过投影变换将数据映射到一个低维空间,使得同一类别内的样本尽可能接近,不同类别之间的样本尽可能远离。

具体的步骤如下:

(1) 计算类内散度矩阵(Within-class scatter matrix):对于每个类别,计算该类别内样本的协方差矩阵,然后将所有类别的协方差矩阵求和,得到类内散度矩阵。

(2)计算类间散度矩阵(Between-class scatter matrix):计算每个类别的均值向量,然后计算所有类别均值向量的协方差矩阵,得到类间散度矩阵。

(3)解决广义特征值问题:通过求解广义特征值问题,找到类内散度矩阵的逆矩阵与类间散度矩阵的乘积的特征向量和特征值。

(4)选择最大的k个特征值对应的特征向量:将特征值按照从大到小排序,选择最大的k个特征值对应的特征向量。

(5)投影数据:将原始数据样本点投影到选取的特征向量所张成的低维空间上,得到降维后的数据表示。

LDA降维方法的目标是在降低维度的同时,尽可能地保留类别间的差异性,提高分类性能。它在模式识别、人脸识别、图像处理等领域有广泛应用。

需要注意的是,LDA是一种有监督的降维方法,需要样本的标签信息来进行类别间的判别。

2.2 标注间距离的衡量

在LDA降维中,同一标注内距离的衡量通常使用类内散度矩阵(Within-class scatter matrix)来表示。类内散度矩阵衡量了同一类别内样本点之间的距离,希望同一类别内的样本点尽可能接近。类内散度矩阵可以通过计算每个类别内样本的协方差矩阵,并将所有类别的协方差矩阵求和得到。

而不同标注间距离的平衡通常使用类间散度矩阵(Between-class scatter matrix)来表示。类间散度矩阵衡量了不同类别之间的距离,希望不同类别之间的样本点尽可能远离。类间散度矩阵可以通过计算每个类别的均值向量,然后计算所有类别均值向量的协方差矩阵得到。

在LDA中,我们的目标是最大化类间散度矩阵与类内散度矩阵之间的比值,从而达到同一标注内距离尽可能小,不同标注间距离尽可能大的效果。这一比值被称为广义瑞利商(Generalized Rayleigh Quotient),我们通过求解广义特征值问题来得到最大化该比值的特征向量。

通过调整类内散度矩阵与类间散度矩阵之间的平衡,我们可以控制同一标注内距离和不同标注间距离的权重,以满足具体问题的需求。

最佳转换图:

2.3 python操作LDA

import numpy as np
import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 创建特征矩阵X
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [3, 2]])
print(X)

# 创建标签数组Y
Y = np.array([1, 1, 1, 2, 2, 2])
print(Y)

# 使用LinearDiscriminantAnalysis进行特征降维
lda_result = LinearDiscriminantAnalysis(n_components=1).fit_transform(X, Y[:5])
print(lda_result)

# 创建LinearDiscriminantAnalysis分类器并拟合数据
clf = LinearDiscriminantAnalysis(n_components=1).fit(X, Y[:5])
print(clf)

# 预测新样本的标签
print(clf.predict([[0.8, 1]]))

执行结果如下:

[[-1 -1]
 [-2 -1]
 [-3 -2]
 [ 1  1]
 [ 3  2]]
[1 1 1 2 2 2]
[[-1.87888373]
 [-0.96974644]
 [-3.09106679]
 [ 2.36375695]
 [ 3.57594001]]
LinearDiscriminantAnalysis(n_components=1)
[2]

结果分析:

  • 原始特征矩阵X包含了5个样本,每个样本有2个特征。
  • 标签数组Y表示了对应于特征矩阵X中每个样本的类别标签。
  • 经过LDA降维后,特征矩阵X从2维降至1维,得到降维后的结果lda_result
  • 创建的LinearDiscriminantAnalysis分类器对象clf通过拟合特征矩阵X和标签数组Y[:5]得到。
  • 对新样本[[0.8, 1]]进行预测,分类器预测其标签为2。

3. 特征衍生

3.1 概述

特征衍生是指根据已有的特征或属性,通过变换、组合或生成新的特征来丰富数据集的过程。特征衍生的目的是通过创造新的特征,提取数据中的隐藏信息、增加模型的表达能力、改善模型的性能等。

特征衍生的方法可以包括以下几种:

(1) 算术运算:通过对现有特征进行加减乘除等算术运算,生成新的特征。例如,将身高和体重结合计算BMI指数。

(2) 多项式特征:通过对现有特征进行多项式展开,生成新的特征。例如,对年龄进行平方、立方等操作。

(3)对数、指数变换:通过对现有特征进行对数或指数变换,改变特征的分布形态,提取更多信息。

(4)统计特征:通过统计数据的分布、聚合或变异程度等属性,生成新的特征。例如,计算均值、标准差、最大值、最小值等。

(5)时间特征:针对时间序列数据,可以衍生出小时、天、周、月、季度等时间单位的特征。

(6)文本特征:对文本数据进行分词、提取关键词、统计词频等操作,生成文本特征。

特征衍生的目的是为了更好地描述数据的特征,提取潜在的信息,以便更好地支持建模和预测任务。通过引入新的特征,可以增加模型的表达能力,提高模型的性能和泛化能力。然而,在进行特征衍生时需要谨慎操作,避免引入过多冗余或无关的特征,以及注意处理特征间的相关性和共线性。

3.2 示例

 直接进行分析,我们仅能得到日期、用户Id、产品ID三个信息。通过特征衍生,我们可以知道其他特征,比如:用户角度衍生,可以得到用户购买习惯,购买次数等信息(ID为1122的用户购买了三次商品)。另外,还可以从商品角度衍生,得到商品特征、是否为快消品、是否有季节影响(ID为3的商品每个用户在每个季节都有用,说明可能是快消品;而2可能是季节性的商品)。从关系角度衍生,可以知道某商品是不是用户常卖的、用户一般会怎么搭配。

4. HR表的特征预处理

import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.decomposition import PCA
from sklearn.preprocessing import LabelEncoder

def hr_preprocessing(sl=False, le=False, npr=False, amh=False, tsc=False, wa=False, pl5=False, dp=False, slr=False, lower_d=False, ld_n=1):
    # 读取HR.csv数据文件为DataFrame对象df
    df = pd.read_csv("../data/HR.csv")

    # 1、清洗数据
    df = df.dropna(subset=["satisfaction_level", "last_evaluation"])  # 删除包含空值的行
    df = df[df["satisfaction_level"] <= 1][df["salary"] != "nme"]  # 去除满意度超过1和工资为"nme"的行

    # 2、得到标注
    label = df["left"]  # 标签列
    df = df.drop("left", axis=1)  # 从原始数据中删除标签列

    # 3、特征选择(缺失相关代码)

    # 4、特征处理
    scaler_lst = [sl, le, npr, amh, tsc, wa, pl5]  # 需要进行标准化或归一化处理的特征列表
    column_lst = ["satisfaction_level", "last_evaluation", "number_project",
                  "average_monthly_hours", "time_spend_company", "Work_accident",
                  "promotion_last_5years"]  # 对应的列名

    for i in range(len(scaler_lst)):
        if not scaler_lst[i]:
            # 进行归一化处理
            df[column_lst[i]] = MinMaxScaler().fit_transform(df[column_lst[i]].values.reshape(-1, 1)).reshape(1, -1)[0]
        else:
            # 进行标准化处理
            df[column_lst[i]] = StandardScaler().fit_transform(df[column_lst[i]].values.reshape(-1, 1)).reshape(1, -1)[0]

    scaler_lst = [slr, dp]  # 需要进行独热编码或映射处理的特征列表
    column_lst = ["salary", "department"]  # 对应的列名

    for i in range(len(scaler_lst)):
        if not scaler_lst[i]:
            if column_lst[i] == "salary":
                # 将工资进行映射处理
                df[column_lst[i]] = [map_salary(s) for s in df["salary"].values]
            else:
                # 将部门进行标签编码处理
                df[column_lst[i]] = LabelEncoder().fit_transform(df[column_lst[i]])

            # 进行归一化处理
            df[column_lst[i]] = MinMaxScaler().fit_transform(df[column_lst[i]].values.reshape(-1, 1)).reshape(1, -1)[0]
        else:
            # 进行独热编码处理
            df = pd.get_dummies(df, columns=[column_lst[i]])

    if lower_d:
        # 进行降维处理
        return PCA(n_components=ld_n).fit_transform(df.values), label

    return df, label

d = dict([("low", 0), ("medium", 1), ("high", 2)])

def map_salary(s):
    return d.get(s,0)
def main():
    features,label=hr_preprocessing()
if __name__=="__main__":
    main()

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

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

相关文章

I2C协议

i2c硬件电路 i2c总线连接图&#xff1a; 注&#xff1a; i2c的SDA和SCL都需要上拉电阻&#xff0c;改变上拉电阻大小可调节I2C总线的上拉强度&#xff0c;上拉电阻用1k~100k不等&#xff0c;小了驱动能力就强&#xff0c;但电流就大了。不同内核版本上的驱动不一样&#xff…

C语言之指针详解(3)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析、 4. 数组参数、指针参数 我们来看一维数组传参 #include<stdio.h> void test(in…

Rust语言从入门到入坑——(2)Rust在windows上搭建开发环境

文章目录 0 引入1、搭建 Visual Studio Code 开发环境1.1、安装 Rust 编译工具1.2 、VS Code安装 2、官网在线3、总结4、引用 0 引入 开始搭建一个适合在windows上运行的Rust环境。 Rust支持的程序语言很多&#xff1a;可详见官网介绍 1、搭建 Visual Studio Code 开发环境 …

Systrace分析知识点

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、抓取Systrace二、CPU模块知识点三、input 点击事件处理流程四、Vsync 事件处理五、Android 绘制一帧流程分析六、Camx Trace TAG开启方法七、参考文…

管理类联考——英语——趣味篇——刷题需要实现什么目的?

刷题需要实现什么目的&#xff1f;  第一&#xff1a;在真题中巩固考研英语基础 在掌握一定的词汇量和句子分析能力后&#xff0c;开始一字不漏、逐字逐句的完成历年真题的超精读。抄写真题中生词&#xff0c;继续夯实词汇、分析长难句翻译&#xff0c;弄清楚题目中正确选项为…

Science: 功能饮料里面的这种添加剂会使动物寿命更长——这对人类意味着什么尚不清楚...

一项研究表明&#xff0c;当喂食大量牛磺酸&#xff08;一种常见的健康补充剂和能量饮料成分&#xff0c;最早从牛黄中分离出来&#xff09;时&#xff0c;老年小鼠、线虫和猴子可以活得更长或更健康。研究人员证明&#xff0c;这种天然氨基酸的水平与动物的衰老有关&#xff0…

STM32之外设DMA

DMA(Direct Memory Access)—直接存储器存取&#xff0c;是单片机的一个外设&#xff0c;它的主要功能是用来搬数据&#xff0c;但是不需要占用 CPU&#xff0c;即在传输数据的时候&#xff0c;CPU 可以干其他的事情&#xff0c;好像是多线程一样。数据传输支持从外设到存储器或…

Triton教程 -- 模型仓库

Triton教程 – 模型仓库 文章目录 Triton教程 -- 模型仓库存储库布局模型存储库位置本地文件系统 具有环境变量的云存储谷歌云存储S3Azure 存储带凭证文件的云存储&#xff08;测试版&#xff09; 模型版本模型文件TensorRT 模型ONNX 模型TorchScript 模型TensorFlow 模型OpenV…

滴滴实时数据链路建设组件选型实践篇

写在前面 随着滴滴内部技术栈的不断统一&#xff0c;实时相关技术组件资源的不断整合&#xff0c;各业务线实时数据相关开发经验的不断沉淀&#xff0c;基本形成了一套面向公司不同业务场景需求的最佳技术选型和具体落地方案。但同时我们也发现&#xff0c;大部分实时开发同学在…

React基础教程(一):React简介

React基础教程(一)&#xff1a;React简介 1、React是什么&#xff1f; 发生请求获取数据处理数据&#xff08;过滤&#xff0c;整理格式等&#xff09;操作DOM呈现页面 2、谁开发的 由Facebook的软件工程师 Jordan Walke创建于2011年部署于Facebook的newsfeed随后在2012年部…

一本书让你彻底搞懂安卓系统性能优化

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Transformer详解,中文版架构图

2.2.1 “编码器-解码器”架构 Seq2Seq 思想就是将网络的输入输出分别看作不同的序列&#xff0c;然后实现序列到序列 的映射&#xff0c;其经典实现结构就是“编码器-解码器”框架。编码器-解码器框架如图 2.7 所 示。 图2.7 编码器-解码器的基本框架 在 Seq2Seq 思想应用于自然…

机器鸟实现摆动尾巴功能

1. 功能说明 本文示例将实现R329样机机器鸟摆动尾巴的功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09;‍ 扩展板 Bigfish2.1扩展板‍ 电池7.4V锂电池 电路连接…

新的挑战:WebGL

这段时间一直在死磕 Chromium 的 8K 高清视频播放&#xff0c;虽然之前写过一些关键技术的实现&#xff0c;主要难点差不多攻破&#xff0c;但投入到产品中&#xff0c;依然还要解决很多实际中的问题&#xff0c;比如卡顿、格式支持、音视频不同步等等。前期的相关文章&#xf…

RocketMQ基础API使用以及基本原理探究

文章目录 同步发送异步发送单向发送拉模式随机获取一个queue的消息指定一个queue的消息 顺序消息广播消息延迟消息批量消息过滤消息Tag过滤sql过滤 事务消息RocketMQ常见问题RocketMQ如何保证消息不丢失&#xff1f;RocketMQ的消息持久化机制RocketMQ如何保证消息顺序RocketMQ事…

Day07 Python函数详解

文章目录 第四章 Python函数使用4.1. 函数介绍4.2. 函数的定义与使用4.2.1. 函数的定义4.2.2. 调用 4.3. 函数的参数4.4. 函数的返回值4.4.1. 返回值介绍4.4.2. None类型 4.5. 函数说明4.5.1. 函数注释4.5.2. 函数的4中定义方式4.5.3. 函数的调用 4.6. 函数的嵌套调用4.7. 函数…

哪款 IMG BXS GPU 适合您的汽车?

Imagination 是汽车行业领先的图形处理器供应商。Imagination 的 GPU IP 经过了九代更新迭代&#xff0c;为车辆提供了舒适性和安全性&#xff0c;在汽车行业的总出货量接近 5 亿。通过将响应迅速的 HMI&#xff08;人机界面&#xff09;与功能日益强大的高级驾驶员辅助系统相结…

Linux:主机状态监控

查看系统的资源占用 可以通过top命令&#xff0c;查看系统CPU、内存使用情况 top命令内容详解&#xff1a; 第一行&#xff1a;top&#xff1a;命令名称&#xff0c;10.49.16&#xff1a;当前系统时间&#xff0c;up 4:40&#xff1a;启动了4小时40分&#xff0c;4 users&#…

Aspose.Pdf使用教程:为PDF文件添加swf注释

Aspose.PDF 是一款高级PDF处理API&#xff0c;可以在跨平台应用程序中轻松生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现&#xff0c;保护和打印文档。无需使用Adobe Acrobat。此外&#xff0c;API提供压缩选项&#xff0c;表创建和处理&#xff0c;图形和图像功能&am…

STL之priority_queue与仿函数

目录 一.仿函数1.介绍2.示例 二.priority_queue1.介绍2.成员函数3.模拟实现4.使用 三.其他1.typename Container::value_type 一.仿函数 1.介绍 函数对象&#xff0c;又称仿函数&#xff0c;是可以像函数一样使用的对象&#xff0c;其原理就是重载了函数调用符&#xff1a;()…