了解 PCA 并导入数据集
了解 PCA 并导入数据集
主成分分析(PCA)是一种常用的降维技术,通过减少数据集的维度来简化分析过程。本文将从理论到实践,详细介绍PCA的核心概念,并通过一个实际数据集(美国农业部国家营养标准参考数据库)来演示PCA的应用过程。
理论上的 PCA
减少必须处理的维度数的一种方法是减少分析中考虑的特征数。 PCA 提供了另一种方法:通过将特征空间投影到低维空间中来减少我们必须处理的维度数。 我们可以这样做,因为在大多数现实问题中,数据点并不是在所有维度上均匀分布的。 虽然有些特征可能几乎是恒定的,但其他特征却是高度相关。 高度相关的数据点位于低维子空间附近。
在下图中,数据点并未分布在整个平面上,而是大致呈椭圆形聚集。 由于群集(或任何群集)大致是椭圆形的,因此在数学上,它可以通过以下两个值进行描述:它的主(长)轴和次(短)轴。 这些轴构成了群集的主要成分。
我们可以围绕此群集构建一个全新的特征空间,它由两个特征向量定义:$c_{1}$ 和 $c_{2}$。 特征向量是定义指向这一新特征空间的线性转换的矢量。
更好的是,我们不必考虑这一新空间的所有维度。 直观地说,我们可以看到大多数点位于或靠近贯穿 $c_{1}$ 的直线上。 如果将群集从两个维度向下投影到单一维度,我们就可以在简化分析的同时捕获关于此数据集的大部分信息。 只考虑一小部分的确定性特征向量,而从数据集中提取大部分信息 - 这种能力构成了 PCA 的核心。
导入模块和数据集
必须先清理并准备好数据,才能对其执行 PCA,因此 Pandas 是必不可少的。 你还需要 NumPy、一些 scikit-learn 和 pyplot。
若要添加这些库,请运行此代码:
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
%matplotlib inline
要在此处使用的数据集就是你在上一个模块中准备的、从美国农业部国家营养标准参考数据库中提取的同一数据集。
请记住将编码设置为 latin1:
df = pd.read_csv('Data/USDA-nndb-combined.csv', encoding='latin1')
可通过对 DataFrame 使用 info() 方法来检查列数和行数:
df.info()
输出为:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8989 entries, 0 to 8988
Data columns (total 54 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 NDB_No 8989 non-null int64
1 FoodGroup 8618 non-null object
2 Shrt_Desc 8790 non-null object
3 Water_(g) 8789 non-null float64
4 Energ_Kcal 8790 non-null float64
5 Protein_(g) 8790 non-null float64
6 Lipid_Tot_(g) 8790 non-null float64
7 Ash_(g) 8465 non-null float64
8 Carbohydrt_(g) 8790 non-null float64
9 Fiber_TD_(g) 8196 non-null float64
10 Sugar_Tot_(g) 6958 non-null float64
11 Calcium_(mg) 8442 non-null float64
12 Iron_(mg) 8646 non-null float64
13 Magnesium_(mg) 8051 non-null float64
14 Phosphorus_(mg) 8211 non-null float64
15 Potassium_(mg) 8364 non-null float64
16 Sodium_(mg) 8707 non-null float64
17 Zinc_(mg) 8084 non-null float64
18 Copper_mg) 7533 non-null float64
19 Manganese_(mg) 6630 non-null float64
20 Selenium_(µg) 7090 non-null float64
21 Vit_C_(mg) 7972 non-null float64
22 Thiamin_(mg) 8156 non-null float64
23 Riboflavin_(mg) 8174 non-null float64
24 Niacin_(mg) 8153 non-null float64
25 Panto_Acid_mg) 6548 non-null float64
26 Vit_B6_(mg) 7885 non-null float64
27 Folate_Tot_(µg) 7529 non-null float64
28 Folic_Acid_(µg) 6751 non-null float64
29 Food_Folate_(µg) 7022 non-null float64
30 Folate_DFE_(µg) 6733 non-null float64
31 Choline_Tot_ (mg) 4774 non-null float64
32 Vit_B12_(µg) 7597 non-null float64
33 Vit_A_IU 8079 non-null float64
34 Vit_A_RAE 7255 non-null float64
35 Retinol_(µg) 6984 non-null float64
36 Alpha_Carot_(µg) 5532 non-null float64
37 Beta_Carot_(µg) 5628 non-null float64
38 Beta_Crypt_(µg) 5520 non-null float64
39 Lycopene_(µg) 5498 non-null float64
40 Lut+Zea_ (µg) 5475 non-null float64
41 Vit_E_(mg) 5901 non-null float64
42 Vit_D_µg 5528 non-null float64
43 Vit_D_IU 5579 non-null float64
44 Vit_K_(µg) 5227 non-null float64
45 FA_Sat_(g) 8441 non-null float64
46 FA_Mono_(g) 8124 non-null float64
47 FA_Poly_(g) 8125 non-null float64
48 Cholestrl_(mg) 8380 non-null float64
49 GmWt_1 8490 non-null float64
50 GmWt_Desc1 8491 non-null object
51 GmWt_2 4825 non-null float64
52 GmWt_Desc2 4825 non-null object
53 Refuse_Pct 8740 non-null float64
dtypes: float64(49), int64(1), object(4)
memory usage: 3.7+ MB
亲自试一试
你能想出一个更简洁的方法来检查 DataFrame 中的行数和列数吗?
使用 DataFrame 的一个属性。
下面是可能的解决方案:
df.count(axis='columns')
输出为:
0 54
1 54
2 54
3 54
4 54
..
8984 49
8985 50
8986 53
8987 48
8988 49
Length: 8989, dtype: int64