为什么要降维降维技术一览Word文档下载推荐.docx

上传人:b****1 文档编号:5907187 上传时间:2023-05-05 格式:DOCX 页数:13 大小:21.62KB
下载 相关 举报
为什么要降维降维技术一览Word文档下载推荐.docx_第1页
第1页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第2页
第2页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第3页
第3页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第4页
第4页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第5页
第5页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第6页
第6页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第7页
第7页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第8页
第8页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第9页
第9页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第10页
第10页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第11页
第11页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第12页
第12页 / 共13页
为什么要降维降维技术一览Word文档下载推荐.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

为什么要降维降维技术一览Word文档下载推荐.docx

《为什么要降维降维技术一览Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《为什么要降维降维技术一览Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。

为什么要降维降维技术一览Word文档下载推荐.docx

如果缺失值少,我们可以填补缺失值或直接删除这个变量;

如果缺失值过多,你会怎么办呢?

当缺失值在数据集中的占比过高时,一般我会选择直接删除这个变量,因为它包含的信息太少了。

但具体删不删、怎么删需要视情况而定,我们可以设置一个阈值,如果缺失值占比高于阈值,删除它所在的列。

阈值越高,降维方法越积极。

下面是具体代码:

#导入需要的库

importpandasaspd

importnumpyasnp

importmatplotlib.pyplotasplt

加载数据:

#读取数据

train=pd.read_csv("

Train_UWu5bXk.csv"

[注]:

应在读取数据时添加文件的路径。

用.isnull().sum()检查每个变量中缺失值的占比:

train.isnull().sum()/len(train)*100

如上表所示,缺失值很少。

我们设阈值为20%:

#保存变量中的缺失值

a=train.isnull().sum()/len(train)*100

#保存列名

variables=train.columns

variable=[]

foriinrange(0,12):

ifa[i]tem_Weight].fillna(train[Item_Weight].median,inplace=True)

train[Outlet_Size].fillna(train[Outlet_Size].mode()[0],inplace=True)

检查缺失值是否已经被填充:

再计算所有数值变量的方差:

train.var()

如上图所示,和其他变量相比,Item_Visibility的方差非常小,因此可以把它直接删除。

umeric=train[[Item_Weight,Item_Visibility,Item_MRP,Outlet_Establishment_Year]]

var=numeric.var()

numeric=numeric.columns

foriinrange(0,len(var)):

ifvar[i]>

=10:

 

#将阈值设置为10%

variable.append(numeric[i+1])

以上代码帮我们列出了方差大于10的所有变量。

3.高相关滤波(HighCorrelationfilter)

如果两个变量之间是高度相关的,这意味着它们具有相似的趋势并且可能携带类似的信息。

同理,这类变量的存在会降低某些模型的性能(例如线性和逻辑回归模型)。

为了解决这个问题,我们可以计算独立数值变量之间的相关性。

如果相关系数超过某个阈值,就删除其中一个变量。

作为一般准则,我们应该保留那些与目标变量显示相当或高相关性的变量。

首先,删除因变量(ItemOutletSales),并将剩余的变量保存在新的数据列(df)中。

df=train.drop(Item_Outlet_Sales,1)

df.corr()

如上表所示,示例数据集中不存在高相关变量,但通常情况下,如果一对变量之间的相关性大于0.5-0.6,那就应该考虑是否要删除一列了。

4.随机森林(RandomForest)

随机森林是一种广泛使用的特征选择算法,它会自动计算各个特征的重要性,所以无需单独编程。

这有助于我们选择较小的特征子集。

在开始降维前,我们先把数据转换成数字格式,因为随机森林只接受数字输入。

同时,ID这个变量虽然是数字,但它目前并不重要,所以可以删去。

fromsklearn.ensembleimportRandomForestRegressor

df=df.drop([Item_Identifier,Outlet_Identifier],axis=1)

model=RandomForestRegressor(random_state=1,max_depth=10)

df=pd.get_dummies(df)

model.fit(df,train.Item_Outlet_Sales)

拟合模型后,根据特征的重要性绘制成图:

features=df.columns

importances=model.feature_importances_

indices=np.argsort(importances[0:

9]) 

#top10features

plt.title(FeatureImportances)

plt.barh(range(len(indices)),importances[indices],color=b,align=center)

plt.yticks(range(len(indices)),[features[i]foriinindices])

plt.xlabel(RelativeImportance)

plt.show()

基于上图,我们可以手动选择最顶层的特征来减少数据集中的维度。

如果你用的是sklearn,可以直接使用SelectFromModel,它根据权重的重要性选择特征。

fromsklearn.feature_selectionimportSelectFromModel

feature=SelectFromModel(model)

Fit=feature.fit_transform(df,train.Item_Outlet_Sales)

5.反向特征消除(BackwardFeatureElimination)

以下是反向特征消除的主要步骤:

先获取数据集中的全部n个变量,然后用它们训练一个模型。

计算模型的性能。

在删除每个变量(n次)后计算模型的性能,即我们每次都去掉一个变量,用剩余的n-1个变量训练模型。

确定对模型性能影响最小的变量,把它删除。

重复此过程,直到不再能删除任何变量。

在构建线性回归或Logistic回归模型时,可以使用这种方法。

fromsklearn.linear_modelimportLinearRegression

fromsklearn.feature_selectionimportRFE

fromsklearnimportdatasets

lreg=LinearRegression()

rfe=RFE(lreg,10)

rfe=rfe.fit_transform(df,train.Item_Outlet_Sales)

我们需要指定算法和要选择的特征数量,然后返回反向特征消除输出的变量列表。

此外,rfe.ranking_可以用来检查变量排名。

6.前向特征选择(ForwardFeatureSelection)

前向特征选择其实就是反向特征消除的相反过程,即找到能改善模型性能的最佳特征,而不是删除弱影响特征。

它背后的思路如下所述:

选择一个特征,用每个特征训练模型n次,得到n个模型。

选择模型性能最佳的变量作为初始变量。

每次添加一个变量继续训练,重复上一过程,最后保留性能提升最大的变量。

一直添加,一直筛选,直到模型性能不再有明显提高。

fromsklearn.feature_selectionimportf_regression

ffs=f_regression(df,train.Item_Outlet_Sales)

上述代码会返回一个数组,其中包括变量F值和每个F对应的p值。

在这里,我们选择F值大于10的变量:

foriinrange(0,len(df.columns)-1):

ifffs[0][i]>

variable.append(df.columns[i])

前向特征选择和反向特征消除耗时较久,计算成本也都很高,所以只适用于输入变量较少的数据集。

到目前为止,我们介绍的6种方法都能很好地解决示例的商场销售预测问题,因为这个数据集本身输入变量不多。

在下文中,为了展示多变量数据集的降维方法,我们将把数据集改成FashionMNIST,它共有70,000张图像,其中训练集60,000张,测试集10,000张。

我们的目标是训练一个能分类各类服装配饰的模型。

数据集2:

FashionMNIST

7.因子分析(FactorAnalysis)

因子分析是一种常见的统计方法,它能从多个变量中提取共性因子,并得到最优解。

假设我们有两个变量:

收入和教育。

它们可能是高度相关的,因为总体来看,学历高的人一般收入也更高,反之亦然。

所以它们可能存在一个潜在的共性因子,比如“能力”。

在因子分析中,我们将变量按其相关性分组,即特定组内所有变量的相关性较高,组间变量的相关性较低。

我们把每个组称为一个因子,它是多个变量的组合。

和原始数据集的变量相比,这些因子在数量上更少,但携带的信息基本一致。

fromglobimportglob

importcv2

images=[cv2.imread(file)forfileinglob(train/*.png)]

你必须使用train文件夹的路径替换glob函数内的路径。

现在我们先把这些图像转换为numpy数组格式,以便执行数学运算并绘制图像。

images=np.array(images)

images.shape

返回:

(60000,28,28,3)

如上所示,这是一个三维数组,但我们的目标是把它转成一维,因为后续只接受一维输入。

所以我们还得展平图像:

image=[]

foriinrange(0,60000):

img=images[i].flatten()

image.append(img)

image=np.array(image)

创建一个数据框,其中包含每个像素的像素值,以及它们对应的标签:

train=pd.read_csv("

train.csv"

) 

#Givethecompletepathofyourtrain.csvfile

feat_cols=[pixel+str(i)foriinrange(image.shape[1])]

df=pd.DataFrame(image,columns=feat_cols)

df[label]=train[label]

用因子分析分解数据集:

fromsklearn.decompositionimportFactorAnalysis

FA=FactorAnalysis(n_components=3).fit_transform(df[feat_cols].values)

这里,n_components将决定转换数据中的因子数量。

转换完成后,可视化结果:

%matplotlibinline

plt.figure(figsize=(12,8))

plt.title(FactorAnalysisComponents)

plt.scatter(FA[:

0],FA[:

1])

1],FA[:

2])

2],FA[:

0])

在上图中,x轴和y轴表示分解因子的值,虽然共性因子是潜在的,很难被观察到,但我们已经成功降维。

8.主成分分析(PCA)

如果说因子分析是假设存在一系列潜在因子,能反映变量携带的信息,那PCA就是通过正交变换将原始的n维数据集变换到一个新的被称做主成分的数据集中,即从现有的大量变量中提取一组新的变量。

下面是关于PCA的一些要点:

主成分是原始变量的线性组合。

第一个主成分具有最大的方差值。

第二主成分试图解释数据集中的剩余方差,并且与第一主成分不相关(正交)。

第三主成分试图解释前两个主成分等没有解释的方差。

再进一步降维前,我们先随机绘制数据集中的某些图:

rndperm=np.random.permutation(df.shape[0])

plt.gray()

fig=plt.figure(figsize=(20,10))

foriinrange(0,15):

ax=fig.add_subplot(3,5,i+1)

ax.matshow(df.loc[rndperm[i],feat_cols].values.reshape((28,28*3)).astype(float))

实现PCA:

fromsklearn.decompositionimportPCA

pca=PCA(n_components=4)

pca_result=pca.fit_transform(df[feat_cols].values)

其中n_components将决定转换数据中的主成分。

接下来,我们看一下这四个主成分解释了多少方差:

plt.plot(range(4),pca.explained_variance_ratio_)

plt.plot(range(4),np.cumsum(pca.explained_variance_ratio_))

plt.title("

Component-wiseandCumulativeExplainedVariance"

在上图中,蓝线表示分量解释的方差,而橙线表示累积解释的方差。

我们只用四个成分就解释了数据集中约60%的方差。

9.独立分量分析(ICA)

独立分量分析(ICA)基于信息理论,是最广泛使用的降维技术之一。

PCA和ICA之间的主要区别在于,PCA寻找不相关的因素,而ICA寻找独立因素。

如果两个变量不相关,它们之间就没有线性关系。

如果它们是独立的,它们就不依赖于其他变量。

例如,一个人的年龄和他吃了什么/看了什么电视无关。

该算法假设给定变量是一些未知潜在变量的线性混合。

它还假设这些潜在变量是相互独立的,即它们不依赖于其他变量,因此它们被称为观察数据的独立分量。

下图是ICA和PCA的一个直观比较:

(a)PCA,(b)ICA

PCA的等式是x=Wχ。

这里,

x是观察结果

W是混合矩阵

χ是来源或独立成分

现在我们必须找到一个非混合矩阵,使成分尽可能独立。

而测试成分独立性最常用的方法是非高斯性:

根据中心极限定理(CentralLimitTheorem),多个独立随机变量混合之后会趋向于正态分布(高斯分布)。

因此,我们可以寻找所有独立分量中能最大化峰度的分量。

一旦峰度被最大化,整个分布会呈现非高斯分布,我们也能得到独立分量。

在Python中实现ICA:

fromsklearn.decompositionimportFastICA

ICA=FastICA(n_components=3,random_state=12)

X=ICA.fit_transform(df[feat_cols].values)

10.IOSMAP

代码:

fromsklearnimportmanifold

trans_data=manifold.Isomap(n_neighbors=5,n_components=3,n_jobs=-1).fit_transform(df[feat_cols][:

6000].values)

使用的参数:

n_neighbors:

决定每个点的相邻点数

n_components:

决定流形的坐标数

n_jobs=-1:

使用所有可用的CPU核心

可视化:

plt.title(DecompositionusingISOMAP)

plt.scatter(trans_data[:

0],trans_data[:

1],trans_data[:

2],trans_data[:

11.t-SNE

fromsklearn.manifoldimportTSNE

tsne=TSNE(n_components=3,n_iter=300).fit_transform(df[feat_cols][:

plt.title(t-SNEcomponents)

plt.scatter(tsne[:

0],tsne[:

1],tsne[:

2],tsne[:

12.UMAP

importumap

umap_data=umap.UMAP(n_neighbors=5,min_dist=0.3,n_components=3).fit_transform(df[feat_cols][:

确定相邻点的数量。

min_dist:

控制允许嵌入的紧密程度,较大的值可确保嵌入点的分布更均匀。

plt.title(DecompositionusingUMAP)

plt.scatter(umap_data[:

0],umap_data[:

1],umap_data[:

2],umap_data[:

总结

到目前为止,我们已经介绍了12种降维方法,考虑到篇幅,我们没有仔细介绍后三种方法的原理,感兴趣的读者可以找资料查阅,因为它们中的任何一个都足够写一篇专门介绍的长文。

本节会对这12种方法做一个总结,简要介绍它们的优点和缺点。

缺失值比率:

如果数据集的缺失值太多,我们可以用这种方法减少变量数。

低方差滤波:

这个方法可以从数据集中识别和删除常量变量,方差小的变量对目标变量影响不大,所以可以放心删去。

高相关滤波:

具有高相关性的一对变量会增加数据集中的多重共线性,所以用这种方法删去其中一个是有必要的。

随机森林:

这是最常用的降维方法之一,它会明确算出数据集中每个特征的重要性。

前向特征选择和反向特征消除:

这两种方法耗时较久,计算成本也都很高,所以只适用于输入变量较少的数据集。

因子分析:

这种方法适合数据集中存在高度相关的变量集的情况。

PCA:

这是处理线性数据最广泛使用的技术之一。

ICA:

我们可以用ICA将数据转换为独立的分量,使用更少的分量来描述数据。

ISOMAP:

适合非线性数据处理。

t-SNE:

也适合非线性数据处理,相较上一种方法,这种方法的可视化更直接。

UMAP:

适用于高维数据,与t-SNE相比,这种方法速度更快。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2