zoukankan      html  css  js  c++  java
  • 机器学习sklearn(51): 特征工程(十八) 特征降维(九)降维算法PCA和SVD(四)PCA对手写数字数据集的降维

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

      还记得我们上一周在讲特征工程时,使用的手写数字的数据集吗?数据集结构为(42000, 784),用KNN跑一次半小时,得到准确率在96.6%上下,用随机森林跑一次12秒,准确率在93.8%,虽然KNN效果好,但由于数据量太大,KNN计算太缓慢,所以我们不得不选用随机森林。我们使用了各种技术对手写数据集进行特征选择,最后使用嵌入法SelectFromModel选出了324个特征,将随机森林的效果也调到了96%以上。但是,因为数据量依然巨大,还是有300多个特征。今天,我们就来试着用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为我们提供了无限的可能,终于不用再因为数据量太庞大而被迫选择更加复杂的模型了!
     
     
     
     
     
  • 相关阅读:
    Educational Codeforces Round 6
    Educational Codeforces Round 5
    [Educational Round 5][Codeforces 616F. Expensive Strings]
    [Codeforces Round #508 (Div. 2)][Codeforces 1038E. Maximum Matching]
    Codeforces Round #509 (Div. 2)
    从零开始编写一个vue插件
    Web前端错题模糊题记录
    vue中响应式props办法
    vue中router-link的click事件失效的解决办法
    ubuntu修改顶栏颜色
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14933135.html
Copyright © 2011-2022 走看看