问题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 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()
降维数据可视化结果:
要是你在西安,感兴趣一起学习AIOPS,欢迎加入QQ群 860794445