PCA降维

1、赔率

在这里插入图片描述

2、PCA

引入PCA降维的原因是由于“维数灾难”,在机器学习中,过多的特征有时会使分类结果更差;或者是该特征是冗余特征。“维数灾难”是指计算量急剧增加,而分类精度下降。

PCA降维,就是将高维特征(n维)投影到低维子空间(k维),从而实现特征的融合。
在这里插入图片描述

1). 样本标准化
在这里插入图片描述
其中,
在这里插入图片描述

2). PCA降维
将n维数据降到k维,我们要选择最大的主成分。

  • 首先计算协方差矩阵
    在这里插入图片描述

  • 其次求特征值特征向量,选择最大特征值对应的特征向量作为第一主成分,次大特征值对应的特征向量作为第二主成分…最终选出k组主成分,组成一个n*k维的特征向量矩阵。
    在这里插入图片描述

  • 将X投影到相应的k个主成分,融合形成K组新的特征。
    在这里插入图片描述

这样,我们就得到了降维后的新的数据。

思考:为什么要求 X T X X^TX XTX的特征值、特征向量?即PCA推导过程
在这里插入图片描述
在这里插入图片描述

补充:特征选择和PCA特征降维的区别

特征选择是考察每一个特征 x j i x^{i}_j xji与样本类别标签 y i y^{i} yi的相似度,优先选择相似度大的留下。PCA是融合所有特征做了降维

数据清洗

在这里插入图片描述

独热编码(one-hot)

logistic回归将文本特征转为数值特征时需要
决策树和随机森林不需要

离散特征的编码分为两种情况:

  • 离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码

  • 离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}
    在这里插入图片描述
    在这里插入图片描述
    会造成特征急剧膨胀

小象学院

Python_PCA

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import matplotlib as mpl
from matplotlib.font_manager import FontProperties


font=FontProperties(fname=r'C:\Windows\Fonts\simsun.ttc',size=12)

"""1、读取鸢尾花数据"""
data = pd.read_csv('iris.data', header=None,
                   names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class'])
print(data.head())
data['class'] = pd.Categorical(data['class']).codes  # 将鸢尾花类别信息转换为数值信息
x = data.iloc[:, 0:4]  # 特征
y = data['class']  # 标签

"""2、用PCA进行特征选择"""
# 它会返回组分方差大的2个组分
pca = PCA(n_components=2)
x = pca.fit_transform(x)  # 返回降维后的新的特征(150,2)
print('2个成分各自的方差百分比', pca.explained_variance_ratio_)
print('2个组分各自的方差', pca.explained_variance_)

"""3、绘制降维后的新的数据"""
# 得到自己的colormap
color_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
plt.scatter(x[:, 0], x[:, 1], s=20, c=y, cmap=color_dark)
plt.xlabel(u'组分1', fontproperties=font)
plt.ylabel(u'组分2', fontproperties=font)
plt.title(u'Iris Data PCA降维', fontproperties=font)
plt.show()

在这里插入图片描述
在这里插入图片描述

Python_one-hot

这里给出了pandas和sklearn两颗库的标签编码和独热编码的实现方式。

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

"""读取数据"""
data = pd.read_csv(r'iris.data', header=None,
                   names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class'])
print(data.head())
x = data.iloc[:, 0:4]
y = data['class']

"""one-hot编码"""
# pandas
y2 = pd.get_dummies(y)
print('pandas-one-hot',y2.head())

"""one-hot编码"""
# sklearn
y1=pd.Categorical(y).codes
# sparse = False 输出的是稀疏的存储格式,即索引加值的形式
one_hot=OneHotEncoder(sparse=False,categories='auto')
y1=one_hot.fit_transform(y1.reshape(-1, 1))
print('sklearn-one-hot',y1[:5])

"""Label Encoder"""
# pandas
y1=pd.Categorical(y).codes
# sklearn
l_enc=LabelEncoder()
y=l_enc.fit_transform(y)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellobigorange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值