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

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()

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

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

相关文章

可调电源LM317 的内部原理 - 特殊的电压跟随器

之前一直没想过这类LDO 内部是怎么整的&#xff0c;它似乎是用一个分压电路采集它输出的电压作为参考&#xff0c;然后却能把输出电压稳定下来&#xff0c;颇有种左脚踩右脚上天的意思。典型的LM317 电路如下&#xff1a; 如果是个普通的电压跟随器&#xff0c;无论是基于三极管…

牛客小白月赛56

今天无聊vp了一下 A.省略 B.最优肯定是全部都是1 C.直接统计每个余数下可以填多少个数&#xff0c;然后排序从小到大的排序输出即可 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> #inc…

【八大排序(六)】快排终极篇-快速排序非递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 快排非递归版 1. 前情回顾2. 快排非递归基…

windows10家庭版禁用Device/Credential Guard解决方案

文章目录 背景&#xff08;禁用的原因&#xff09;解决的方式方式一&#xff1a;通过Windows本身的功能设置禁用 ( 非家庭版的使用)1. 禁用Device Guard或Credential Guard&#xff1a;2. 关闭Hyper-V选项3. 重启电脑 方式二&#xff1a;通过命令关闭Hyper-V ( Windows 10家庭版…

java三大特性之【多态】

多态 1.1 概念1.2 实现条件1.3 方法重写&#xff08;override&#xff09;与方法重载&#xff08;overload&#xff09;1.4 向上转型1.5 向下转型 1.1 概念 同样的一个方法/行为&#xff0c;经过不同的对象&#xff0c;表现出不同的行为&#xff0c;这样的现象就称为多态。 举…

二叉搜索树之AVL树

目录 1.概念 2.定义 3.插入 4.旋转 1. 新节点插入较高左子树的左侧---右单旋 2. 新节点插入较高右子树的右侧---左单旋 3. 新节点插入较高左子树的右侧&#xff1a;先左单旋再右单旋【左右双旋】 4. 新节点插入较高右子树的左侧---右左&#xff1a;先右单旋再左单旋【右…

I.MX6ULL_Linux_驱动篇(37) linux系统定时器

定时器是我们最常用到的功能&#xff0c;一般用来完成定时功能&#xff0c;本章我们就来学习一下 Linux 内核提供的定时器 API 函数&#xff0c;通过这些定时器 API 函数我们可以完成很多要求定时的应用。 Linux内核也提供了短延时函数&#xff0c;比如微秒、纳秒、毫秒延时函数…

Car Guide

文章目录 科目一第一章 机动车驾驶证申领和使用规定第一节 驾驶证的许可&#xff1f;种类和有效期第二节 驾驶证的申领第三节 驾驶证的使用第四节 驾驶考试第五节 违法记分制度 第二章 交通信号第一节 交通信号灯第二节 交通标志第三节 交通标线第四节 交警手势 第三章 道路交通…

【编程语言 · C语言 · 递归函数】

递归函数 C 语言的函数都支持递归, 也就是说&#xff0c;每个函数都可以直接或者间接第调用自己。所谓的间接调用&#xff0c;是指在递归函数调用的下层函数中再调用自己。 递归关系图如下&#xff1a; 递归之所以能实现&#xff0c;是因为函数的每个执行过程在栈中都有自己的…

Redis从入门到精通之底层数据结构快表QuickList详解

文章目录 0.前言1. 快表的结构2. Redis 6.0 快表quicklist 基本结构2.1 成员变量2.1 主要操作2.1 推导结果 3. 快表的操作 3. 快表的优缺点3.1 优点&#xff1a;3.2 缺点&#xff1a; 5. Redis从入门到精通系列文章 0.前言 上个篇章回顾&#xff0c;我们上个章节&#xff0c;讲…

Win10 系统专业版远程桌面如何才能多用户同时登录使用?

环境&#xff1a; Win10专业版19041 RDPWrap-v1.6.2 dell5493笔记本 问题描述&#xff1a; Win10 系统专业版远程桌面如何才能多用户同时登录使用&#xff1f; 解决方案&#xff1a; 安装RDPWrap 1.关闭remote desktop services服务 安装RDP之前&#xff0c;要先关闭re…

Kuberentes,k8s诞生简介

一、前言 什么是k8s&#xff1f; Kuberentes 是基于容器的集群管理平台&#xff0c;它的简称&#xff0c;是K8S。有人说之所以叫k8s&#xff0c;是因为k到s中间有8个字母&#xff0c;因此叫k8s&#xff0c;也有人说&#xff0c;在使用k8s的安装配置流程中&#xff0c;共分为8…

验证attention是否在图像分类问题上起决定性作用

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 Motivation 现阶段出现了大量的Transformer-style图像分类模型&#xff0c;并且这些模型在ImageNet上取得了不俗的成绩&#xff0c;这些Transformer-style模型将取得高性能的功劳归功于Multi-head attention注…

12.异常检测

12.1 异常检测的应用 异常检测最常见的应用是欺诈检测&#xff1b; 如果你有很多用户&#xff0c;每个用户都在从事不同的的活动&#xff0c;你可以对不同的用户活动计算特征变量&#xff0c;然后可以建立一个模型来表示用户表现出各种行为的可能性&#xff0c;用来表示用户行…

微服务 springcloud 05 hystrix框架,降级,可视化Hystrix dashboard 仪表盘,熔断

01.微服务宕机时&#xff0c;ribbon 无法转发请求 关闭 user-service 和 order-service 02.hystrix框架 03.创建hystrix项目&#xff0c;hystrix与ribbon经常一起出现 第一步&#xff1a;复制 sp06-ribbon 项目&#xff0c;命名为sp07-hystrix 选择 sp06-ribbon 项目&#…

高并发架构设计方法

我们知道&#xff0c;“高并发”是现在系统架构设计的核心关键词。一个架构师如果设计、开发的系统不支持高并发&#xff0c;那简直不好意思跟同行讨论。但事实上&#xff0c;在架构设计领域&#xff0c;高并发的历史非常短暂&#xff0c;这一架构特性是随着互联网&#xff0c;…

【JVM】日志分析工具--gcviewer的使用

文章目录 gcviewer是什么&#xff1f;gcviewer的使用最后 gcviewer是什么&#xff1f; GCViewer是一个小工具&#xff0c;可以可视化Sun / Oracle、IBM、HP和BEA Java虚拟机生成的详细GC输出。它是在GNU LGPL下发布的自由软件。—官网翻译 gcviewer的使用 文章使用的配置 工具…

权限验证框架之Shiro

文章目录 前言shiro 核心项目构建默认Session模式配置测试接口Realm编写权限测试无权限测试登录测试权限测试 前后端分离tokenJWTFilter重写认证修改配置 总结 前言 交替换个脑子&#xff0c;一直搞考研的东西&#xff0c;实在是无聊。所以顺便把工程上的东西&#xff0c;拿来…

探索Redis内部数据结构

Redis支持多种数据结构&#xff0c;每种数据结构都有其特定的用途。下面对Redis支持的主要数据结构进行详细阐述&#xff1a; 一、字符串&#xff08;String&#xff09; 字符串是Redis最基本的数据结构&#xff0c;可以存储一个字符串或者二进制数据&#xff0c;例如图片、序…

HID协议学习

HID协议学习 0. 文档资料 USB_HID协议中文版_USB接口HID设备_AUJsRmB9kg.pdf HID报告描述符精细说明_mgCxM8_ci9.pdf hut1_22_U3cvnwn_ZZ.pdf 1. 基本概念 HID协议是一种基于USB的通讯协议&#xff0c;用于在计算机和输入设备之间进行数据传输。HID协议定义了标准的数据格…