机器学习数据预处理之数据降维(附Python代码实现)

数据预处理之数据标准化


前言

这是一个新的专题!

欢迎来到全新的篇章,这里我们将会学到机器学习的一些小知识。
在这里我们可以学到:
1、Python第三方库numpy、pandas以及sklearn库的使用
2、机器学习的基本概念和流程
3、机器学习的一些基本算法


机器学习(ML)

机器学习(Machine Learning)是从数据中自动分析获得模型,并利用模型对未知数据进行预测。

在这里插入图片描述

机器学习工作流程可总结如下:
1.获取数据
2.数据基本处理
3.特征工程
4.机器学习(模型训练)
5.模型评估
6.结果达到要求,形成知识;
没有达到要求,重新上面步骤
在这里插入图片描述


数据预处理

数据预处理(Data Preprocessing)是指:在使用数据进行建模或分析前,对其进行的处理。
真实环境中产生的数据往往都不是完整、不一致的“脏数据”,无法直接用来建模或进行数据分析。为了提高数据挖掘质量,需要对数据进行一定的处理。
常见的数据预处理包括:标准化、离散化、抽样、降维、去噪等。
今天我们简单介绍一下数据降维


数据降维

对特征简化属性、去噪、去冗余,以求取更典型的属性,但同时又不希望损失数据本身的意义,这时所采取的操作就是数据降维。

降维的意义

在构建机器学习模型时,有时特征是极其复杂的,如果特征的维度达到几千维度时,训练模型将需要大量的时间。不仅如此,当特征特别多时,还会出现多重共线性、稀疏性等问题。

降维的方法

数据降维分为线性降维和非线性降维。
线性降维:主成分分析(PCA)、线性判断分析(LDA)
非线性降维:分为基于核函数的KPCA、KICA、KDA和基于特征值的ISOMAP、LLE、LE、LPP、LTSA、MVU等。

下面我们以鸢尾花数据为例简单介绍一下PCA降维的实现过程。

主成分分析法(PCA)

PCA(principal components analysis)即主成分分析法,又称主分量分析,旨在利用降维的思想,把多指标转化为少数几个综合指标。
在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用于减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。

PCA 的目标是寻找 r ( r<n )个新变量,使它们反映事物的主要特征,压缩原有数据矩阵的规模,将特征向量的维数降低,挑选出最少的维数来概括最重要特征。每个新变量是原有变量的线性组合,体现原有变量的综合效果,具有一定的实际含义。这 r 个新变量称为“主成分”,它们可以在很大程度上反映原来 n 个变量的影响,并且这些新变量是互不相关的,也是正交的。通过主成分分析,压缩数据空间,将多元数据的特征在低维空间里直观地表示出来。

通常,PCA的降维过程如下:
(1)对特征进行标准化;
(2)计算协方差矩阵;
(3)计算协方差矩阵的特征值和特征向量;
(4)选取最大的k个特征值对应的特征向量,得到特征向量矩阵;
(5)将数据变换到k维,得到新的数据集。

代码实现

我们以鸢尾花数据集为例,通过Python代码在jupyter notebook中实现展示PCA降维的全过程。

鸢尾花数据集是一个多重变量分析的数据集,其中包含150个数据集,分为3类,每类50个数据。每个数据包含花萼长度、花萼宽度、花瓣长度、花瓣宽度4个属性。
利用这些属性特征可以预测某个鸢尾花属于Setosa、Versicolour、Virginica三个种类中的哪一类。

原始数据格式如下:
在这里插入图片描述
第一列维数据编号,依次数据属性为花萼长度、花萼宽度、花瓣长度、花瓣宽度,最后一列为标签。

数据读入代码如下(示例):

# 借助Python的三方库pandas实现对数据集的读取与处理,numpy实现科学计算
# 代码主要通过jupyter notebook编写完成,复制时注意输出格式
import numpy as np
import pandas as pd

df = pd.read_csv("iris.csv",header=None,names=['花萼长度','花萼宽度','花瓣长度','花瓣宽度','标签'])
labels = np.array(df['标签'])

df.head(10)

示例输出:
在这里插入图片描述

(1)特征标准化

标准化数据代码如下(示例):

# 标准化数据
def Standard(data):
    # axis=0按列取均值
    mean_vector=np.mean(data,axis=0)
    new_data = data - mean_vector
    return mean_vector,new_data

mean_vector,new_data = Standard(df)
mean_vector     # 属性均值

示例输出:
在这里插入图片描述

(2)协方差矩阵计算

计算协方差矩阵代码如下(示例):

# 计算协方差矩阵
def getCovMatrix(newData):
    # rowvar=0表示数据的每一列代表一个feature
    return np.cov(newData,rowvar=0)

covMatrix = getCovMatrix(new_data)
covMatrix

示例输出:
在这里插入图片描述

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

计算协方差矩阵的特征值和特征向量代码如下(示例):

# 计算协方差矩阵的特征值和特征向量
def getFValueAndFVector(covMatrix):
    fValue,fVector = np.linalg.eig(covMatrix)
    return fValue,fVector

fValue,fVector = getFValueAndFVector(covMatrix)
fValue      # 协方差矩阵的特征值

示例输出:
在这里插入图片描述

(4)选取最大的k个特征值对应的特征向量,得到特征向量矩阵

计算特征向量矩阵代码如下(示例):

# 得到特征向量矩阵
def getVectorMatrix(fValue,fVector,k):
    fValueSort = np.argsort(fValue)
    fValueTopN = fValueSort[:-(k + 1):-1]
    return fVector[:,fValueTopN]

vectorMatrix = getVectorMatrix(fValue,fVector,2)
vectorMatrix

示例输出:
在这里插入图片描述

(5)将数据变换到k维,得到新的数据集

计算降维后的数据代码如下(示例):

# 得到降维后的数据
def getResult(data,vectorMatrix):
    return np.dot(data,vectorMatrix)

result = getResult(df,vectorMatrix)
result[:10]		# 取数据前十列展示

示例输出:
在这里插入图片描述

参考

  • 53
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值