机器学习实战(降维)

降维

主要动机

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

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

什么时候用到降维

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

维度诅咒

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

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

例子: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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值