前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于《Python数据挖掘入门与实战》读书笔记七(主成分分析二)

关于《Python数据挖掘入门与实战》读书笔记七(主成分分析二)

作者头像
python与大数据分析
发布2022-03-11 13:19:02
3760
发布2022-03-11 13:19:02
举报
文章被收录于专栏:python与大数据分析

主成分分析算法(Principal Component Analysis,PCA)的目的是找到能用较少信息描述数据集的特征组合。它意在发现彼此之间没有相关性、能够描述数据集的特征,确切说这些特征的方差跟整体方差没有多大差距,这样的特征也被称为主成分。这也就意味着,借助这种方法,就能通过更少的特征捕获到数据集的大部分信息。

PCA跟其他转换器用法类似。它只有主成分数量这一个参数。它默认会返回数据集中的所有特征。然而,PCA会对返回结果根据方差大小进行排序,返回的第一个特征方差最大,第二个特征方差稍小,以此类推。因此,前几个特征往往就能够解释数据集的大部分信息

案例集中包括3279行, 1559列数据,其中前1558列是图片的各种属性,最后一列是图表是否广告的标志,怎么从这1558列特征中找到哪些特征是判断广告的重要标准。

代码示例

代码语言:javascript
复制
#http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements, Data Folder,ad.data and ad.names
import os
import numpy as np
import pandas as pd
from collections import defaultdict
#用pandas加载数据集,查看数据质量
data_folder = ''
data_filename = os.path.join(data_folder,  "ad.data")
ads = pd.read_csv(data_filename, header=None)
#print(ads[:5])
#print(ads.shape)
#(3279, 1559)
#定义转换函数,主要是数据异常则返回Nan值
#转换函数
#转换函数
def convert_number(x):
    try:
        return float(x)
    except ValueError:
        return np.nan
#我们创建一个字典存储所有特征及其转换结果,把所有的特征值转换为浮点型。
converters = defaultdict(convert_number)
#还想把最后一列的值转换为0或1,该列表示每条数据的类别。
converters[1558] = lambda x: 1 if x.strip() == "ad." else 0
#加载数据集,在参数中指定我们刚创建的转化函数。
ads = pd.read_csv("ad.data", header=None, converters=converters)
ads = ads.replace('?', np.nan)
ads = ads.replace(' ?', np.nan)
ads = ads.replace('   ?', np.nan)   #第1,2列转换为NAN
ads = ads.replace('     ?', np.nan) #第3列转换为NAN
ads = ads.replace(np.nan, 0) #缺失值处理不到位,以后不能直接化0。看情况处理,本题应该取前2列取均值,第三列为前两列的比。
print(ads[:5])
#数据集所描述的是网上的图像,目标是确定图像是不是广告。
#从数据集表头中无法获知梅列数据的含义。其他文件有更多的信息。前三个特征分别指图像的高
#度、宽度和宽高比。最后一列是数据的类别,1表示是广告,0表示不是广告。
#抽取用于分类算法的x矩阵和y数组,x矩阵为数据框除去最后一列的所有列,y数组包含数据框的
#最后一列。
X = ads.drop(1558, axis=1).values
y = ads[1558]
# 主成分分析算法(Principal Component Analysis,PCA)的目的是找到能用较少信息描述数 据集的特征组合。
# 它意在发现彼此之间没有相关性、能够描述数据集的特征,确切说这些特征的方差跟整体方差没有多大差距,这样的特征也被称为主成分
from sklearn.decomposition import PCA
pca = PCA(n_components=5)
Xd = pca.fit_transform(X)
#返回的结果Xd矩阵只有五个特征,但是不容小觑,我们看一下每个特征的方差。
np.set_printoptions(precision=3, suppress=True)

print(Xd)
print(Xd.shape)
print(pca.components_) #:返回具有最大方差的成分。
print(pca.explained_variance_ratio_)#:返回 所保留的n个成分各自的方差百分比。
print(pca.n_components_)#:返回所保留的成分个数n。
print(pca.mean_)#:
print(pca.noise_variance_)#:
from sklearn.tree import DecisionTreeClassifier
from sklearn.cross_validation import cross_val_score
clf = DecisionTreeClassifier(random_state=14)
scores_reduced = cross_val_score(clf, Xd, y, scoring='accuracy')
print("PCA performance: {0:.3f}".format(scores_reduced.mean()))

from matplotlib import pyplot as plt
#PCA算法的另一个优点是,你可以把抽象难懂的数据集绘制成图形
#获取数据集中类别的所有取值(只有两个:是广告和不是广告)。
classes = set(y)
#指定在图形中用什么颜色表示这两个类别。
colors = ['red', 'green']
#用zip函数将这两个列表组合起来,同时遍历。
for cur_class, color in zip(classes, colors):#为属于当前类别的所有个体创建遮罩层。
    mask = (y == cur_class).values
    #使用pyplot的scatter函数显示它们的位置。图中的x和y的值为前两个特征。
    plt.scatter(Xd[mask, 0], Xd[mask, 1], marker='o', color=color, label=int(cur_class))
#创建图示,显示图像,从中就能看到分属两个类别的个体。
plt.legend()
plt.show()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档