特征提取(机器学习数据预处理)

特征提取(机器学习数据预处理)

特征提取与特征选择都是数据降维的技术,不过二者有着本质上的区别;特征选择能够保持数据的原始特征,最终得到的降维数据其实是原数据集的一个子集;而特征提取会通过数据转换或数据映射得到一个新的特征空间,尽管新的特征空间是在原特征基础上得来的,但是凭借人眼观察可能看不出新数据集与原始数据集之间的关联。

这里介绍2种常见的特征提取技术:

1)主成分分析(PCA)

2)线性判别分析(LDA)

1.主成分分析(PCA)

一种无监督的数据压缩,数据提取技术,通常用于提高计算效率,帮助降低”维度灾难“,尤其是当模型不适于正则化时。

PCA是一种线性转换技术,其目标是在高纬度数据中找到最大方差的方向,并将数据映射到不大于原始数据的新的子空间上。(所谓数据方差最大的方向即数据沿着该方向的分布最分散)

PCA算法的流程:

1)对原始d维数据集做标准化处理;

2)构造样本的协方差矩阵;

3)计算协方差矩阵的特征值和相应的特征向量;

4)选择前k个最大特征值对应的特征向量,其中$k\leq d$;

5)通过前k个特征向量构建映射矩阵W;

6)通过映射矩阵W将d维的原始数据转换为k维的特征子空间。

标准化处理之前的内容有,这里不再赘述;

1.1构造协方差矩阵

公式:

$\sigma_{jk}=\frac{1}{n}\sum_{i=1}^{n}(x_{j}^{(i)}-u_{j})(x_{k}^{(i)}-u_{k})$

n代表数据的总个数,$u_{j}$和$u_{k}$分别代表特征j和k的均值;在标准化后的数据中,样本的均值为0,所以在标准化处理后的数据的协方差又可以表示为:

$\sigma_{jk}=\frac{1}{n}\sum_{i=1}^{n}x_{j}^{(i)}x_{k}^{(i)}$

1.2 协方差特征值与特征向量计算

数学原理不在这里细说,代码实现见下面的小节。

1.3 特征值与特征向量的选取

选取那些包含信息最多的的特征向量组成子集,特征值的大小决定了特征向量的重要性,所以选择特征值大小靠前的k个特征值作为选中的特征值,其对应的特征变量作为构建映射矩阵的特征向量。

我们还可以绘制特征值的贡献率:

$\frac{\lambda_{j}}{\sum_{j=1}^{d}\lambda_{j}}$,$\lambda_{j}$表示第j个特征值。

1.4 构建映射矩阵W

将选中的k个特征向量构成一个(d,k)维的矩阵W。

1.5程序实现

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler

df = pd.DataFrame([    [1,2,3,4,5,6],    [2,4,6,3,3,4],    [3,6,10,4,7,7],    [2,4,7,6,5,4],    [4,7,13,7,3,2],    [1,2,3,3,6,4]    ],columns=["A","B","C","D","E","F"])

#1.标准化
sc = StandardScaler()
sc.fit(df.values)
X_std = sc.transform(df.values)

#2.生成协方差矩阵
cov_mat = np.cov(X_std)

#3.协方差矩阵的特征值与特征向量
eigen_vals,eigen_vecs = np.linalg.eig(cov_mat)

#4.按照重要程度由高往低将特征变量排序
sort_list = np.argsort(eigen_vals)
#取前两个向量组成转换矩阵
w = np.column_stack((eigen_vecs[:,sort_list[0]],eigen_vecs[:,sort_list[1]]))

#5.取第一个数据进行转换
x_1= X_std[0].dot(w)
print(x_1)

结果如下:

scikit_learn.decomposition模块中的PCA类也可实现此功能,使用方式如下:

from sklearn.decomposition import PCA
pca = PCA(n_component=2)
X_train_pca = pca(X_train_std)

PCA类中的n_component用于指定需要降到的维数。

2.线性判别分析(LDA)

LDA的目标是发现可以最优化分类的特征子空间,是一种监督算法。

LDA的执行步骤是:

1)对d维的原数据集进行标准化处理;

2)对于每一类别,计算d维的均值向量;

3)构造类间的散布矩阵$S_{B}$以及类内的散布矩阵$S_{W}$;

4)计算$S_{W}^{-1}S_{B}$的特征值及对应的特征向量;

5)选取前k个特征值所对应的特征向量,构造一个$d\timesk$维的转换矩阵W,其中特征向量以列的形式排列;

6)使用转换矩阵W将样本映射到新的特征子空间上。

大致上与PCA很相似,这里只介绍与PCA中不同的部分。

2.1计算类内散布矩阵$S_{W}$

首先计算均值向量$m_{i}$,$m_{i}$储存了类别i中样本的特征均值$u_{m}$,$m_{i}$不是一个值,而是一个向量,包含了每一个特征的均值。

$m_{i}=\frac{1}{n_{i}}\sum_{x\in  D_{i}}^{c}x_{m}$;

import pandas as pd
import numpy as np

df = pd.DataFrame([    [1,2,3,4,5,"ONE"],    [2,4,6,3,3,"TWO"],    [2,4,7,6,5,"ONE"],    [4,7,13,7,3,"TWO"],    ],columns=["A","B","C","D","E","class_label"])

#类别列表
label_list = np.unique(df["class_label"].values)

mean_by_label = {}

#通过类别的数值作为key保存该类别对应的数据的均值
for label in label_list:
    mean_by_label[label] = np.mean(df[df["class_label"]==label].values[:,:-1],axis=0)

for key,value in mean_by_label.items():
    print(key,value)

结果如下:

每个类别i的散布矩阵$S_{i}$的表达式,Ni表示类别i内的样本数量,这个和协方差的表达式是相同的。

$S_{i}=\frac{1}{N_i}\sum_{x\in D_{i}}^{c}(x-m_{i})(x-m_{i})^{T}N_i$

最终的类内散布矩阵$S_{W}$是由各个类别的散布矩阵累加得来的:

$S_{W}=\sum_{i=1}^{c}S_{i}$

2.2计算类间散布矩阵$S_{B}$

$S_{B}=\sum_{i=1}^{c}N_{i}(m_{i}-m)(m_{i}-m)^{T}$

其中c代表类别总数量,Ni表示类别i的样本数量,mi是类别i的均值,m是所有数据的均值

2.3LDA转换矩阵

PCA是对协方差举证求特征值和特征向量,而LDA是对$S_{W}^{-1}S_{B}$矩阵求解广义特征值和特征向量,剩下的与PCA相同。

同样scikit-learn库中也实现了LDA类

from sklearn.lda import LDA
lda = LDA(n_componets=2)

原文地址:https://www.cnblogs.com/sienbo/p/11432505.html

时间: 2024-08-14 08:07:44

特征提取(机器学习数据预处理)的相关文章

python大战机器学习——数据预处理

数据预处理的常用流程: 1)去除唯一属性 2)处理缺失值 3)属性编码 4)数据标准化.正则化 5)特征选择 6)主成分分析 (1)去除唯一属性 在获取的数据集中,经常会遇到唯一属性.这些属性通常是添加的一些di属性,如存放在数据库中自增的主键.这些属性并不能刻画样本自身的分布规律,所以只需要简单地删除这些属性即可. (2)处理缺失值的三种方法 1)直接使用含有缺失值的特征  2)删除含有缺失值的特征  3)缺失值补全 1)直接使用:对于某些算法可以直接使用含有缺失值的情况.如决策树. 2)特征

机器学习数据预处理——标准化/归一化方法总结

通常,在Data Science中,预处理数据有一个很关键的步骤就是数据的标准化.这里主要引用sklearn文档中的一些东西来说明,主要把各个标准化方法的应用场景以及优缺点总结概括,以来充当笔记. 首先,我要引用我自己的文章Feature Preprocessing on Kaggle里面关于Scaling的描述 Tree-based models doesn't depend on scaling Non-tree-based models hugely depend on scaling 一

数据预处理:独热编码(One-Hot Encoding)

http://blog.csdn.net/pipisorry/article/details/61193868 问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from Europe", "from US", "from Asia"] ["uses Firefox", "uses Ch

机器学习之数据预处理

归一化处理 from sklearn.preprocessing import StandardScaler X_scaler = StandardScaler() y_scaler = StandardScaler() X_train = X_scaler.fit_transform(X_train) y_train = y_scaler.fit_transform(y_train) X_test = X_scaler.transform(X_test) #同样的模型来训练转化测试数据 y_t

机器学习实战:数据预处理之独热编码(One-Hot Encoding)

问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from Europe", "from US", "from Asia"] ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet

机器学习之数据预处理,Pandas读取excel数据

Python读写excel的工具库很多,比如最耳熟能详的xlrd.xlwt,xlutils,openpyxl等.其中xlrd和xlwt库通常配合使用,一个用于读,一个用于写excel.xlutils结合xlrd可以达到修改excel文件目的.openpyxl可以对excel文件同时进行读写操作. 而说到数据预处理,pandas就体现除了它的强大之处,并且它还支持可读写多种文档格式,其中就包括对excel的读写.本文重点就是介绍pandas对excel数据集的预处理. 机器学习常用的模型对数据输入

08-05 细分构建机器学习应用程序的流程-数据预处理

目录 细分构建机器学习应用程序的流程-数据预处理 一.1.1 缺失值处理 1.1 1.1.1 删除缺失值 1.1.1 4.6.1.2 填充缺失值 二.1.2 异常值处理 三.1.3 自定义数据类型编码 四.1.4 通过sklearn对数据类型编码 五.1.5 独热编码 5.1 1.5.1 sklearn做独热编码 5.2 1.5.2 pandas做独热编码 六.1.6 数据标准化 6.1 1.6.1 最小-最大标准化 6.2 1.6.2 Z-score标准化 七.1.7 二值化数据 八.1.8

【机器学习】数据预处理之将类别数据转换为数值

在进行python数据分析的时候,首先要进行数据预处理. 有时候不得不处理一些非数值类别的数据,嗯, 今天要说的就是面对这些数据该如何处理. 目前了解到的大概有三种方法: 1,通过LabelEncoder来进行快速的转换: 2,通过mapping方式,将类别映射为数值.不过这种方法适用范围有限: 3,通过get_dummies方法来转换. 1 import pandas as pd 2 from io import StringIO 3 4 csv_data = '''A,B,C,D 5 1,2

python 机器学习之数据预处理

#数据预处理方法,主要是处理数据的量纲和同趋势化问题. import numpy as np from sklearn import preprocessing #零均值规范 data=np.random.rand(3,4)#随机生成3行4列的数据 data_standardized=preprocessing.scale(data)#对数据进行归一化处理,即每个数值减去均值除以方差 主要用于svm #线性数据变换最大最小化处理 data_scaler=preprocessing.MinMaxS