特征工程之特征降维

本文介绍了特征降维在机器学习中的重要性,包括去除不重要的特征和减少方差以提高模型性能。讲解了低方差过滤法、皮尔逊相关系数和斯皮尔曼相关系数作为相关性评估手段,以及主成分分析(PCA)用于数据降维的实际应用和代码示例。
摘要由CSDN通过智能技术生成

为什么要进行特征降维?

特征对训练模型是非常重要的,用于训练的数据集包含一些不重要的特征,可能导致模型泛化性能

不佳              

        某些特征的取值较为接近,其包含的信息较少              

        希望特征独立存在对预测产生影响,两个特征同增同减非常相关,不会给模型带来更多信息

特征降维目的:

指在某些限定条件下,降低特征个数

特征降维涉及的知识面比较多,当前阶段常用的方法:        

低方差过滤法、PCA(主成分分析)降维法、相关系数(皮尔逊相关系数、斯皮尔曼相关系数)

 低方差过滤法

低方差过滤法:指的是删除方差低于某些阈值的一些特征

特征方差小:特征值的波动范围小,包含的信息少,模型很难学习到信息

特征方差大:特征值的波动范围大,包含的信息相对丰富,便于模型进行学习

低方差过滤API:

sklearn.feature_selection.VarianceThreshold(threshold = 0.0)       

        实例化对象用于删除所有低方差特征

variance_obj.fit_transform(X)              

        X:numpy array格式的数据[n_samples,n_features]

返回值:训练集差异低于threshold的特征将被删除。            

        默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征

代码示例

import pandas as pd
# 读数据
data =  pd.read_csv('垃圾邮件分类数据.csv')
print(data.shape)
#%%
# 过滤低方差法
from sklearn.feature_selection import VarianceThreshold
transformer = VarianceThreshold(threshold = 0.1)
transformer.fit_transform(data)
print(data.shape)

相关系数

为什么会使用相关系数?

相关系数:反映特征列之间(变量之间)密切相关程度的统计指标

        常见2个相关系数:皮尔逊相关系数、斯皮尔曼相关系数

相关系数的值介于–1与+1之间,即–1≤ r ≤+1。其性质如下:     

        当 r>0 时,表示两变量正相关,r<0 时,两变量为负相关     

        当 |r|=1 时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系     

        当 0<|r|<1时,表示两变量存在一定程度的相关。             

        且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱

一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关

 皮尔逊相关系数

 斯皮尔曼相关系数

代码示例 

import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
iris_df = pd.DataFrame(iris.data,columns=iris.feature_names)
iris_df.corr()  # 默认 皮尔逊相关系数
iris_df.corr('spearman')  # 斯皮尔曼相关系数

主成分分析PCA

PCA 通过对数据维数进行压缩,尽可能降低原数据的维数(复杂度)损失少量信息,在此过程中会舍

弃原有数据、创造新的变量

 主成分分析API:

sklearn.decomposition.PCA(n_components=None)  

        将数据分解为较低维数空间, n_components: 小数表示保留百分之多少的信息;

        整数表示减少到多少特征 ,由20个特征减少到10个

mypcaobj.fit_transform(X)  

返回值:转换后指定维度的array

代码示例

import pandas as pd
from sklearn.decomposition import PCA   # decomposition 分解
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

# 加载数据
x,y = load_iris(return_X_y = True) # 只返回特征值和目标值
x
#%%
# 指定保留比例的信息
transformer = PCA(n_components=0.95)

# 标准化数据
x_scaled = StandardScaler().fit_transform(x)

# # pca
x_pca = transformer.fit_transform(x_scaled)
x_pca
#%%
# 画图确定x,y
import pandas as pd

x_pca_df = pd.DataFrame(x_pca, columns=['component_1', 'component_2'])
x_pca_df['label'] = y


#%%
import seaborn as sns
sns.scatterplot(data=x_pca_df,x='component_1',y='component_2',hue='label')

  • 33
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值