机器学习实战(降维)

机器学习实战(降维),第1张

降维 主要动机

加速,可视化数据,节省空间

缺点:丢失信息,计算密集,转换过程难以理解

什么时候用到降维

分类前,加速;聚类前,可视化数据

维度诅咒

高维数据集——非常稀疏——训练实例彼此远离——容易过拟合

主要动机:特征过多,训练变得缓慢,难以寻找更好的解决方案

例子:MNIST数据集中图像边界的像素全是白色,删除这些像素也不会丢失太多信息,或者相邻两个像素合并。


降维的主要方法

投影:适用于一个分布接近于2D子空间的3D数据集

流形学习:瑞士卷数据集

投影

投影的方法:PCA (主成分分析)寻找训练集中可获得最大方差的轴。


如何寻找训练集的主成分

奇异值分解(SVD)

使用numpy提供的svd()函数获得训练集的主成分

如果不是用sklearn的PCA类,就要将数据集做中心化处理.

X_centered=X-X.mean(axis=0)`

`U,s,V=np.linalg.svd(X_centered)`

`c1=V.T[:,0]`

`c2=V.T[:,1]

有了奇异值分解得到的V,任意选取前d个主成分点乘原始数据集便可实现在d维的投影。


W2 = V.T[:,:2]`

`X2D=X_centered.dot(W2)
sklearn实现PCA
from sklearn.decomposition import PCA` 

`pca=PCA(n_components=2)`

 `X2D=pca.fit_transform(X)

使用components_访问每一个主成分

`pca.components_.T[:,0]`
方差解释率
pca.explained_variance_ratio_`

`pca = PCA(n_components=0.95)
  • 可以将 n_components 设置为 0.0 到 1.0 之间的浮点数,表明希望保留的方差比率
cumsum = np.cumsum(pca.explained_variance_ratio_)`

`d = np.argmax(cumsum >= 0.95)+1
  • 也可以保留相加足够大的方差部分维度

  • 也可以画图寻找拐点

    plt.plot(cumsum,linewidth=3)

    Q:假设你对一个 1000 维的数据集应用 PCA,同时设置方差解释率为 95%,你的最终数据集将会有多少维?

    可能是1-1000之间的任何数字,取决于数据集,

PCA数据压缩
`pca = PCA(n_components=154)`
`X_reduced = pca.fit_transform(X_train)`
`X_recovered = pca.inverse_transform(X_reduced)`
几种不同的PCA
  • 随机PCA
`rnd_pca = PCA(n_components=154,svd_solver='randomized',random_state=42)`
`X_reduced = rnd_pca.fit_transform(X_train)`
  • 增量PCA:对于大型数据集可以划分成小批量,但是要在每个小批量里调用partial_fit方法
from sklearn.decomposition import IncrementalPCA`

`n_batches = 100`
`inc_pca = IncrementalPCA(n_components=154)`
`for X_batch in np.array_split(X_train,n_batches):`
    `inc_pca.partial_fit(X_batch)`

`X_reduced = inc_pca.transform(X_train)`    
  • Kernel PCA
`from sklearn.decomposition import KernelPCA rbf_pca=KernelPCA(n_components=2,kernel='rbf',gamma=0.04) X_reduced=rbf_pca.fit_transform(X)`
  • 为kPCA调参方法
  1. 引入模型,通过最优化模型表现调参

    `from sklearn.model_selection import GridSearchCV`
    `from sklearn.linear_model import LogisticRegression`
    `from sklearn.pipeline import Pipeline`
    
    `clf = Pipeline([`
        `("kpca",KernelPCA(n_components=2)),`
        `("log_reg",LogisticRegression(solver="lbfgs"))`
    `])`
    
    `param_grid = [{`
        `"kpca__gamma":np.linspace(0.03,0.05,10),
        "kpca__kernel":["rbf","sigmoid"]`
    `}]`
    
    `grid_search = GridSearchCV(clf,param_grid,cv=3)`
    `grid_search.fit(X,y)`
    

2.基于重建功能算误差

`best_score = 0.0`
`for gamma in np.linspace(0.01, 0.05, 10):`
    `for kernel in ["rbf", "sigmoid"]:`
        `kpca = KernelPCA(n_components=27,fit_inverse_transform=True)`
        `X_reduced = kpca.fit_transform(X)`
        `X_preimage = kpca.inverse_transform(X_reduced )`
         score = mean_squared_error(X, X_preimage)
        if score > best_score:
            best_score = score
            best_parameters = {'gamma':gamma,'kernel':kernel}
print(best_parameters,best_score)
各种PCA的选择

首选常规PCA,不适合内存的大型数据集用增量PCA,想要大幅度降低维度并且追求速度用随机PCA,非线性数据集用内核PCA

流形学习 LLE
from sklearn.manifold import LocallyLinearEmbedding
lle=LocallyLinearEmbedding(n_components=2,n_neighbors=10)
X_reduced=lle.fit_transform(X)

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/571055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存