博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bobo老师机器学习笔记第七课-sklearn中PCA的用法
阅读量:4171 次
发布时间:2019-05-26

本文共 3203 字,大约阅读时间需要 10 分钟。

问题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个主成分方差占比折线图:

就可以看出大概过了前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 PCAfrom sklearn.datasets import load_digitsfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.model_selection import train_test_splitfrom timeit import timeitX, 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()

降维数据可视化结果:

 

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

转载地址:http://qhkai.baihongyu.com/

你可能感兴趣的文章
javaWeb监听器、过滤器、拦截器
查看>>
RESTFUL风格的接口
查看>>
后台参数验证配置
查看>>
SpringBoot之外置Tomcat配置
查看>>
java 删除 list 中的元素
查看>>
idea启动优化
查看>>
java发展史
查看>>
Java内存区域
查看>>
数据库与模式的区别
查看>>
数字签名的原理
查看>>
showDialog
查看>>
Flex 拖拽范例
查看>>
flash builder 4 编译器参数
查看>>
flex常用网站
查看>>
flex 页面跳转
查看>>
cat | wc -l 少一行的问题
查看>>
socket 科普文章
查看>>
Mutex, semaphore, spinlock的深度解析
查看>>
pthread线程使用小结
查看>>
A Game of Thrones(59)
查看>>