机器学习实战基础(二十七):sklearn中的降维算法PCA和SVDPCA对手写数字数据集的降维

Posted qiu-hua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习实战基础(二十七):sklearn中的降维算法PCA和SVDPCA对手写数字数据集的降维相关的知识,希望对你有一定的参考价值。

PCA对手写数字数据集的降维

1. 导入需要的模块和库

from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

2. 导入数据,探索数据

data = pd.read_csv(r"C:worklearnbettermicro-classweek 3 Preprocessingdigit 
recognizor.csv")
 
X = data.iloc[:,1:]
y = data.iloc[:,0]
 
X.shape

3. 画累计方差贡献率曲线,找最佳降维后维度的范围

pca_line = PCA().fit(X)
plt.figure(figsize=[20,5])
plt.plot(np.cumsum(pca_line.explained_variance_ratio_))
plt.xlabel("number of components after dimension reduction")
plt.ylabel("cumulative explained variance ratio")
plt.show()

4. 降维后维度的学习曲线,继续缩小最佳维度的范围

#======【TIME WARNING:2mins 30s】======#
 
score = []
for i in range(1,101,10):
    X_dr = PCA(i).fit_transform(X)
    once = cross_val_score(RFC(n_estimators=10,random_state=0)
                           ,X_dr,y,cv=5).mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(1,101,10),score)
plt.show()

5. 细化学习曲线,找出降维后的最佳维度

#======【TIME WARNING:2mins 30s】======#
 
score = []
for i in range(10,25):
    X_dr = PCA(i).fit_transform(X)
    once = cross_val_score(RFC(n_estimators=10,random_state=0),X_dr,y,cv=5).mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(10,25),score)
plt.show()

6. 导入找出的最佳维度进行降维,查看模型效果

X_dr = PCA(23).fit_transform(X)
 
#======【TIME WARNING:1mins 30s】======#
cross_val_score(RFC(n_estimators=100,random_state=0),X_dr,y,cv=5).mean()

模型效果还好,跑出了94.49%的水平,但还是没有我们使用嵌入法特征选择过后的96%高,有没有什么办法能够提高模型的表现呢?

7. 突发奇想,特征数量已经不足原来的3%,换模型怎么样?

在之前的建模过程中,因为计算量太大,所以我们一直使用随机森林,但事实上,我们知道KNN的效果比随机森林
更好,KNN在未调参的状况下已经达到96%的准确率,而随机森林在未调参前只能达到93%,这是模型本身的限制
带来的,这个数据使用KNN效果就是会更好。现在我们的特征数量已经降到不足原来的3%,可以使用KNN了吗?

from sklearn.neighbors import KNeighborsClassifier as KNN
cross_val_score(KNN(),X_dr,y,cv=5).mean()

8. KNN的k值学习曲线

#======【TIME WARNING: 】======#
 
score = []
for i in range(10):
    X_dr = PCA(23).fit_transform(X)
    once = cross_val_score(KNN(i+1),X_dr,y,cv=5).mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(10),score)
plt.show()

9. 定下超参数后,模型效果如何,模型运行时间如何?

 

cross_val_score(KNN(4),X_dr,y,cv=5).mean()
 
 
#=======【TIME WARNING: 3mins】======#
%%timeit
cross_val_score(KNN(4),X_dr,y,cv=5).mean()

可以发现,原本785列的特征被我们缩减到23列之后,用KNN跑出了目前位置这个数据集上最好的结果。再进行更
细致的调整,我们也许可以将KNN的效果调整到98%以上。PCA为我们提供了无限的可能,终于不用再因为数据量
太庞大而被迫选择更加复杂的模型了!

 

以上是关于机器学习实战基础(二十七):sklearn中的降维算法PCA和SVDPCA对手写数字数据集的降维的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战基础(二十六):sklearn中的降维算法PCA和SVD 附录

机器学习实战基础(二十六):sklearn中的降维算法PCA和SVD 附录

机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD PCA与SVD 之 PCA中的SVD

机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD PCA与SVD 之 PCA中的SVD

机器学习实战基础(十七):sklearn中的数据预处理和特征工程特征选择 之 Embedded嵌入法

机器学习实战基础(十七):sklearn中的数据预处理和特征工程特征选择 之 Embedded嵌入法