iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
AI & Data

資料三十-那些最基本的資料處理與分析技能系列 第 23

【Day23-降維】相信你的眼睛,在訓練模型之前一定要做的事情——利用降維技巧檢視資料分群狀態:PCA, tSNE, SVD, SOM

昨天我們稍微講了一下如何透過一些基本的圖來讓在做資料分析的時候有一個初步的認識
但有的時候我們的資料維度還是實在太多了,這個時候適當的使用一些降維技巧也可以幫助我們建立起對於資料的基本理解

降維

降維是什麼,為什麼可以降維?

明明是表示10個不同資訊的維度的資料,為什麼可以降到2維或3維呢?
其實是因為通常原始資料的不同維度之間其實不是獨立的,而在降維的過程就好像是在做圖片壓縮一樣,能用比較少的維度來表示原來資料大部分的資訊內容

降維可以做什麼,什麼時候很有用?

對於維度特別高而每個維度所蘊含的資訊又沒有那麼密集的時候,就有可能會有維度災難的產生,因此適當的壓縮一下維度對解決這個現象有一定程度的幫助

降維不是什麼,使用時候要注意的事情

就好像牛奶加到紅茶裡面裡面一樣,今天既然用了比較低的維度去表示原來的資料,表示幾乎一定會有一部分的資訊被遺失,而且有些降維方式並不具備可以直接反轉換回本來維度的意義,因此要如何解釋新的維度也是一個需要思考的問題。

常見的降維方式

可以拿來降維的方式有很多,我這邊主要以比較常用的四種為例子

今天也一樣用iris來當範例

# 範例資料使用鳶尾花資料集
iris = sns.load_dataset('iris')
iris_feature = iris.iloc[:,:4]

主成分分析PCA(Principal Component Analysis)

  • 主要想法:透過線性變化的方式,儘量保留彼此之間不同的成分
    • 而且是一個可以回推每個維度代表原始維度組成比例的方式。
from sklearn.decomposition import PCA
pca = PCA(n_components=2, copy=True, whiten=False) # 建立轉換器
iris_pca = pca.fit_transform(iris_feature) # 轉換
df_tsne = pd.DataFrame({
    "Dim1":iris_pca[:,0],
    "Dim2":iris_pca[:,1],
    "Label": iris["species"]
}) # 重建DataFrame
ax = sns.scatterplot(x="Dim1", y="Dim2", hue="Label",
                  data=df_tsne) # 繪圖

輸出:

t-隨機鄰近嵌入法tSNE(t-distributed stochastic neighbor embedding)

  • 主要想法:使用條件機率和高斯分佈(低維時為t分佈)來定義高維和低維中樣本點之間的相似度
# 建立tsne轉換器
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, init='pca', random_state=0,perplexity=3) # 困惑度慎選
iris_tsne = tsne.fit_transform(iris_feature)
df_tsne = pd.DataFrame({
    "Dim1":iris_tsne[:,0],
    "Dim2":iris_tsne[:,1],
    "Label": iris["species"]
})# 重建DataFrame
ax = sns.scatterplot(x="Dim1", y="Dim2", hue="Label",
                  data=df_tsne)# 繪圖

輸出:

奇異值分解SVD(singular value decomposition)

  • 主要想法:透過奇異值分解來找到不同的特徵值
from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=2)
iris_svd = svd.fit_transform(iris_feature)
df_svd = pd.DataFrame({
    "Dim1":iris_svd[:,0],
    "Dim2":iris_svd[:,1],
    "Label": iris["species"]
})
ax = sns.scatterplot(x="Dim1", y="Dim2", hue="Label",
                  data=df_svd)

輸出:

自組織映射SOM(Self-organizing map)

哦對了這個轉換出來的會是離散的結果哦,稍微提醒一下

# 建立SOM
from minisom import MiniSom
som = MiniSom(x=20, y= 20, input_len= 4, random_seed=1)
som.train_batch(data=iris_feature.values.tolist(), num_iteration= 1000)

# 繪圖
plt.figure(figsize=(15,15))
plt.xlim(0, 10)
plt.ylim(10, 20)
for index, row in iris.iterrows():
    x,y = som.winner(list(row[:-1]))
    if row.species == "setosa":
        plt.text(x,y,"A",fontdict={'weight': 'bold', 'size': 10},color = "C1")
#         plt.plot(x,y,color = "C1")
    elif row.species == "versicolor":
        plt.text(x,y,"B",fontdict={'weight': 'bold', 'size': 10},color = "C3")
#         plt.plot(x,y,color = "C3")
    elif row.species == "virginica":
        plt.text(x,y,"C",fontdict={'weight': 'bold', 'size': 10},color = "C4")


上一篇
【Day22-圖表】文不如表,表不如圖——使用seaborn一行透過圖表觀察資料!
下一篇
【Day24-序列】時間序列型資料的基本處理——以0050股票價格為例:尋找峰值、移動平均、曲線擬合
系列文
資料三十-那些最基本的資料處理與分析技能30

尚未有邦友留言

立即登入留言