用sklearn 實(shí)踐PCA
原文地址:
https://towardsdatascience.com/pca-using-python-scikit-learn-e653f8989e60
對于許多機(jī)器學(xué)習(xí)應(yīng)用程序,它有助于可視化你的數(shù)據(jù).可視化2或3維數(shù)據(jù)并不具有挑戰(zhàn)性.但是,即使本教程的這一部分中使用的Iris數(shù)據(jù)集也是4維的.你可以使用PCA將4維數(shù)據(jù)縮減為2維或3維,以便你可以繪制并希望更好地理解數(shù)據(jù).
加載Iris數(shù)據(jù)集
Iris數(shù)據(jù)集是scikit-learn附帶的數(shù)據(jù)集之一,不需要從某個(gè)外部網(wǎng)站下載任何文件.下面的代碼將加載iris數(shù)據(jù)集.
#將pandas導(dǎo)入為pd
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
#load dataset into Pandas DataFrame
df = pd.read_csv(url,names = ['sepal length','sepal width','petal length','petal width','target'])
Original Pandas df (features + target)
標(biāo)準(zhǔn)化數(shù)據(jù)
PCA受比例影響,因此你需要在應(yīng)用PCA之前縮放數(shù)據(jù)中的功能.使用StandardScaler可幫助你將數(shù)據(jù)集的特征標(biāo)準(zhǔn)化為單位比例(均值= 0和方差= 1),這是許多機(jī)器學(xué)習(xí)算法的最佳性能要求.如果你希望看到不會縮放數(shù)據(jù)的負(fù)面影響,scikit-learn會有一節(jié)介紹不標(biāo)準(zhǔn)化數(shù)據(jù)的效果.
#來自sklearn.preprocessing導(dǎo)入StandardScaler
features = ['sepal length', 'sepal width', 'petal length', 'petal width']
#分離出特征
x = df.loc[:,features].values
#分離目標(biāo)
y = df.loc[:,['target']].values
#標(biāo)準(zhǔn)化特征
x = StandardScaler().fit_transform(x)
標(biāo)準(zhǔn)化之前和之后的數(shù)組x(由pandas數(shù)據(jù)幀可視化)
PCA投影到2D
原始數(shù)據(jù)有4列(萼片長度,萼片寬度,花瓣長度和花瓣寬度).在本節(jié)中,代碼將4維原始數(shù)據(jù)投影到2維.我應(yīng)該注意,在減少維數(shù)之后,通常沒有為每個(gè)主成分分配特定含義.新組件只是變體的兩個(gè)主要維度.
#來自sklearn.decomposition導(dǎo)入PCA
pca = PCA(n_components = 2)
principalComponents = pca.fit_transform(x)
principalDf = pd.DataFrame(data = principalComponents
,columns = ['principal component 1','principal component 2'])
PCA并保持前兩大主要組成部分
finalDf = pd.concat([principalDf,df [['target']]],axis = 1)
沿axis = 1連接DataFrame. finalDf是最終的DataFrame.
沿著列連接數(shù)據(jù)幀以在繪圖之前生成finalDf
可視化2D投影
本節(jié)僅繪制二維數(shù)據(jù).請注意下圖中的類似乎彼此分開.
import matplotlib.pyplot as plt
fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1)
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
colors = ['r', 'g', 'b']
for target, color in zip(targets,colors):
indicesToKeep = finalDf['target'] == target
ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']
, finalDf.loc[indicesToKeep, 'principal component 2']
, c = color
, s = 50)
ax.legend(targets)
ax.grid()
plt.show()
解釋差異
解釋的方差告訴你可以將多少信息(方差)歸因于每個(gè)主要組件.這很重要,因?yàn)楫?dāng)你可以將4維空間轉(zhuǎn)換為2維空間時(shí),在執(zhí)行此操作時(shí)會丟失一些方差(信息).通過使用屬性explained_variance_ratio_,可以看到的是,第一主成分含有方差的72.77%和第二主成分含有方差的23.03%.這兩個(gè)組件一起包含95.80%的信息.
pca.explained_variance_ratio_
array([ 0.72770452, 0.23030523])