Bobo老师机器学习笔记第七课-sklearn中PCA的用法

问题1: PCA在sklearn中的哪个模块?

答:PCA在sklearn的decomposition模块中。通过from sklearn.decomposition import PCA可以导入PCA。sklearn.decomposition模块包括矩阵分解算法,包括PCA,NMF或ICA。 该模块的大多数算法可以被视为降维技术。官网介绍

问题2:在利用PCA算法中,用什么指标来判断一个特征对整体数据的影响大小?

答: PCA中有一个特殊的指标explained_variance_ratio_(解释方差比例), 表示所保留的n个成分各自的方差百分比,它们的和越大,表示保留原来数据的信息越多。它是一个矩阵,每一个值在0~1之间,代表着该特征值对样本值得影响大小。比如在下面例子中,我计算出前2个主成分,pca.explained_variance_ratio_=[0.14566817, 0.13735469] 。这说明第一个特征主成分方差值占总方差的14.56。 如果把所有特征的主成分都求出来,那么explained_variance_ratio_就是一个N个元素由大到小排列好的数组,越在前面的数据说明占据总方差的数据也越大,越说明越重要。

我们绘制出digits数据集的前N个主成分方差占比折线图:

Bobo老师机器学习笔记第七课-sklearn中PCA的用法_第1张图片

就可以看出大概过了前30个主成分占总方差的0.9以上,后面的主成分对整体的数据影响较小。

问题3:在使用PCA的过程中,我如何来确定一个高危数据应该降到几维最合适?

答:  Sklearn中PCA初始化时候设置参数n_components 来实现。在前面的学习中,我们把n_components定义为一个整数,是用来指定我们获取的前N个主成分。而在Sklearn中这个参数可以是float类型,如果是float,并且其他参数是默认的,那么这个字段表示你想保留原来数据信息的比率, 也就是上一个问题说到的explained_variance_ratio_。

用法如下:

pca = PCA(0.95)
pca.fit(X_train)

通过这种用法表示利用PCA降维保持原来数据95%以上的信息。 然后利用pca.n_components_就可以看到具体降到几维了。在digits这个数据样本中pca.n_components_是为28. 也就是说只要求出前28个主成分就可以保留原来数据的95%信息。

问题4:如何对数据进行降维可视化?

我们一般只能可视化2维或者3维的数据,只要超过了我们就不能进行可视化。 所以利用PCA我们可以求出前2个主成分分析,然后把数据可视化出来,这边我们对数据有个大概的理解。数据可视化工具主要是利用matplotlib. 可以参考代码实例。

代码:

# -*- coding: utf-8 -*-
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

from timeit import timeit

X, y = load_digits(return_X_y=True)
print('X shape:', X.shape)  # 此处会看到X是64维的数据
X_train, x_test, y_train, y_test = train_test_split(X, y)


def exec_without_pca():
    knn_clf = KNeighborsClassifier()
    knn_clf.fit(X_train, y_train)
    print (knn_clf.score(x_test, y_test))


def exec_with_pca():
    knn_clf = KNeighborsClassifier()
    pca = PCA(n_components=0.95)
    pca.fit(X_train, y_train)
    X_train_dunction = pca.transform(X_train)
    X_test_dunction = pca.transform(x_test)
    knn_clf.fit(X_train_dunction, y_train)
    print (knn_clf.score(X_test_dunction, y_test))


if __name__ == '__main__':
    print ('Time of method[exec_with_pca] costs:',
           timeit('exec_without_pca()', setup='from __main__ import exec_without_pca', number=3))
    print '----' * 10
    print ('Time of method[exec_with_pca] costs:',
           timeit('exec_with_pca()', setup='from __main__ import exec_with_pca', number=3))

运行结果

('X shape:', (1797L, 64L))
0.9888888888888889
0.9888888888888889
0.9888888888888889
('Time of method[exec_with_pca] costs:', 0.2033715630098584)
----------------------------------------
0.9888888888888889
0.9888888888888889
0.9888888888888889
('Time of method[exec_with_pca] costs:', 0.10723048678987901)

可以得出:

1、PCA降维后的数据大概能节省一半

2、 PCA降维后的数据进行准确度并没有丢失。

对数据降维的代码:

def draw_graph():
    # 绘制主成分增加对原数据的保留信息影响
    # pca = PCA(n_components=X_train.shape[1])
    # pca.fit(X_train)
    # plt.plot([i for i in range(X_train.shape[1])],
    #          [np.sum(pca.explained_variance_ratio_[:i + 1]) for i in range(X_train.shape[1])])
    # plt.show()
    # 把64维降维2维,进行数据可视化
    pca = PCA(n_components=2)
    pca.fit(X)
    X_reduction = pca.transform(X)
    for i in range(10):
        plt.scatter(X_reduction[y==i,0], X_reduction[y==i,1], alpha=0.8, label='%s' % i)
    plt.legend()
    plt.show()

降维数据可视化结果:

Bobo老师机器学习笔记第七课-sklearn中PCA的用法_第2张图片

 

要是你在西安,感兴趣一起学习AIOPS,欢迎加入QQ群 860794445

你可能感兴趣的:(机器学习)