无监督学习 | PCA 主成分分析之客户分类
文章目錄
- 1. 開(kāi)始
- 2. 數(shù)據(jù)探索
- 2.2 特征相關(guān)性
- 2.3 可視化特征分布
- 3. 數(shù)據(jù)預(yù)處理
- 3.1 特征縮放
- 3.2 異常值檢測(cè)
- 4. 數(shù)據(jù)轉(zhuǎn)換
- 4.1 主成分分析(PCA)
- 4.2 降維
- 4.3 雙標(biāo)圖(Biplot)可視化
- 5. 聚類(lèi)
- 5.1 創(chuàng)建聚類(lèi)
- 5.2 聚類(lèi)可視化
- 6. 數(shù)據(jù)恢復(fù)
- 7. 利用聚類(lèi)結(jié)果進(jìn)行預(yù)測(cè)
相關(guān)文章:
機(jī)器學(xué)習(xí) | 目錄
機(jī)器學(xué)習(xí) | 聚類(lèi)評(píng)估指標(biāo)
無(wú)監(jiān)督學(xué)習(xí) | KMeans 之Sklearn實(shí)現(xiàn):電影評(píng)分聚類(lèi)
無(wú)監(jiān)督學(xué)習(xí) | PCA 主成分分析原理及Sklearn實(shí)現(xiàn)
1. 開(kāi)始
在這個(gè)項(xiàng)目中,我們將分析一個(gè)數(shù)據(jù)集的內(nèi)在結(jié)構(gòu),這個(gè)數(shù)據(jù)集包含很多客戶真對(duì)不同類(lèi)型產(chǎn)品的年度采購(gòu)額(用金額表示)。這個(gè)項(xiàng)目的任務(wù)之一是如何最好地描述一個(gè)批發(fā)商不同種類(lèi)顧客之間的差異。這樣做將能夠使得批發(fā)商能夠更好的組織他們的物流服務(wù)以滿足每個(gè)客戶的需求。
這個(gè)項(xiàng)目的數(shù)據(jù)集能夠在UCI機(jī)器學(xué)習(xí)信息庫(kù)中找到.因?yàn)檫@個(gè)項(xiàng)目的目的,分析將不會(huì)包括 ‘Channel’ 和 ‘Region’ 這兩個(gè)特征——重點(diǎn)集中在6個(gè)記錄的客戶購(gòu)買(mǎi)的產(chǎn)品類(lèi)別上。
# 引入這個(gè)項(xiàng)目需要的庫(kù) import numpy as np import pandas as pd import visuals as vs # 子集 from IPython.display import display # 使得我們可以對(duì)DataFrame使用display()函數(shù)# 設(shè)置以內(nèi)聯(lián)的形式顯示matplotlib繪制的圖片(在notebook中顯示更美觀) %matplotlib inline # 高分辨率顯示 %config InlineBackend.figure_format='retina'# 載入整個(gè)客戶數(shù)據(jù)集 try:data = pd.read_csv("customers.csv")data.drop(['Region', 'Channel'], axis = 1, inplace = True)print("Wholesale customers dataset has {} samples with {} features each.".format(*data.shape)) except:print("Dataset could not be loaded. Is the dataset missing?") Wholesale customers dataset has 440 samples with 6 features each. data.head()| 12669 | 9656 | 7561 | 214 | 2674 | 1338 |
| 7057 | 9810 | 9568 | 1762 | 3293 | 1776 |
| 6353 | 8808 | 7684 | 2405 | 3516 | 7844 |
| 13265 | 1196 | 4221 | 6404 | 507 | 1788 |
| 22615 | 5410 | 7198 | 3915 | 1777 | 5185 |
2. 數(shù)據(jù)探索
在這部分,我們將開(kāi)始分析數(shù)據(jù),通過(guò)可視化和代碼來(lái)理解每一個(gè)特征和其他特征的聯(lián)系。我們會(huì)看到關(guān)于數(shù)據(jù)集的統(tǒng)計(jì)描述,考慮每一個(gè)屬性的相關(guān)性,然后從數(shù)據(jù)集中選擇若干個(gè)樣本數(shù)據(jù)點(diǎn),我們將在整個(gè)項(xiàng)目中一直跟蹤研究這幾個(gè)數(shù)據(jù)點(diǎn)。
運(yùn)行下面的代碼單元給出數(shù)據(jù)集的一個(gè)統(tǒng)計(jì)描述。注意這個(gè)數(shù)據(jù)集包含了6個(gè)重要的產(chǎn)品類(lèi)型:‘Fresh’, ‘Milk’, ‘Grocery’, ‘Frozen’, **‘Detergents_Paper’**和 ‘Delicatessen’。想一下這里每一個(gè)類(lèi)型代表你會(huì)購(gòu)買(mǎi)什么樣的產(chǎn)品。
# 顯示數(shù)據(jù)集的一個(gè)描述 display(data.describe())| 440.000000 | 440.000000 | 440.000000 | 440.000000 | 440.000000 | 440.000000 |
| 12000.297727 | 5796.265909 | 7951.277273 | 3071.931818 | 2881.493182 | 1524.870455 |
| 12647.328865 | 7380.377175 | 9503.162829 | 4854.673333 | 4767.854448 | 2820.105937 |
| 3.000000 | 55.000000 | 3.000000 | 25.000000 | 3.000000 | 3.000000 |
| 3127.750000 | 1533.000000 | 2153.000000 | 742.250000 | 256.750000 | 408.250000 |
| 8504.000000 | 3627.000000 | 4755.500000 | 1526.000000 | 816.500000 | 965.500000 |
| 16933.750000 | 7190.250000 | 10655.750000 | 3554.250000 | 3922.000000 | 1820.250000 |
| 112151.000000 | 73498.000000 | 92780.000000 | 60869.000000 | 40827.000000 | 47943.000000 |
2.2 特征相關(guān)性
一個(gè)有趣的想法是,考慮這六個(gè)類(lèi)別中的一個(gè)(或者多個(gè))產(chǎn)品類(lèi)別,是否對(duì)于理解客戶的購(gòu)買(mǎi)行為具有實(shí)際的相關(guān)性。也就是說(shuō),當(dāng)用戶購(gòu)買(mǎi)了一定數(shù)量的某一類(lèi)產(chǎn)品,我們是否能夠確定他們必然會(huì)成比例地購(gòu)買(mǎi)另一種類(lèi)的產(chǎn)品。
有一個(gè)簡(jiǎn)單的方法可以檢測(cè)相關(guān)性:我們用移除了某一個(gè)特征之后的數(shù)據(jù)集來(lái)構(gòu)建一個(gè)監(jiān)督學(xué)習(xí)(回歸)模型,然后用這個(gè)模型去預(yù)測(cè)那個(gè)被移除的特征,再對(duì)這個(gè)預(yù)測(cè)結(jié)果進(jìn)行評(píng)分,看看預(yù)測(cè)結(jié)果如何。
在下面的代碼單元中將實(shí)現(xiàn)以下的功能:
-
使用 DataFrame.drop 函數(shù)移除數(shù)據(jù)集中選擇的不需要的特征,并將移除后的結(jié)果賦值給 new_data 。
-
使用 sklearn.model_selection.train_test_split 將數(shù)據(jù)集分割成訓(xùn)練集和測(cè)試集。
-
導(dǎo)入一個(gè) DecisionTreeRegressor (決策樹(shù)回歸器),然后用訓(xùn)練集訓(xùn)練它。
-
使用回歸器的 score 函數(shù)輸出模型在測(cè)試集上的預(yù)測(cè)得分。
可以看到?jīng)Q定系數(shù)為 0.6052,并不是很高,因此這個(gè)特征對(duì)與區(qū)分用戶的消費(fèi)習(xí)慣來(lái)說(shuō)不是特別的重要。
2.3 可視化特征分布
為了能夠?qū)@個(gè)數(shù)據(jù)集有一個(gè)更好的理解,我們可以對(duì)數(shù)據(jù)集中的每一個(gè)產(chǎn)品特征構(gòu)建一個(gè)散布矩陣(scatter matrix)。如果在一個(gè)特征對(duì)于區(qū)分一個(gè)特定的用戶來(lái)說(shuō)是必須的,那么這個(gè)特征和其它的特征可能不會(huì)在下面的散射矩陣中顯示任何關(guān)系。相反的,如果這個(gè)特征對(duì)于識(shí)別一個(gè)特定的客戶是沒(méi)有作用的,那么通過(guò)散布矩陣可以看出在這個(gè)數(shù)據(jù)特征和其它特征中有關(guān)聯(lián)性。下面創(chuàng)建一個(gè)散布矩陣。
# 對(duì)于數(shù)據(jù)中的每一對(duì)特征構(gòu)造一個(gè)散布矩陣 pd.plotting.scatter_matrix(data, alpha = 0.3, figsize = (14,8), diagonal = 'kde');由散步矩陣的對(duì)角圖像可以看出,數(shù)據(jù)并不是正態(tài),而是右偏的。
再看看相關(guān)系數(shù)矩陣以及熱力圖:
data.corr()| 1.000000 | 0.100510 | -0.011854 | 0.345881 | -0.101953 | 0.244690 |
| 0.100510 | 1.000000 | 0.728335 | 0.123994 | 0.661816 | 0.406368 |
| -0.011854 | 0.728335 | 1.000000 | -0.040193 | 0.924641 | 0.205497 |
| 0.345881 | 0.123994 | -0.040193 | 1.000000 | -0.131525 | 0.390947 |
| -0.101953 | 0.661816 | 0.924641 | -0.131525 | 1.000000 | 0.069291 |
| 0.244690 | 0.406368 | 0.205497 | 0.390947 | 0.069291 | 1.000000 |
Grocery 與 Detergents_Paper 相關(guān)系數(shù)為0.924641,可以看出存在著明顯的相關(guān)關(guān)系。
3. 數(shù)據(jù)預(yù)處理
在這個(gè)部分,我們將通過(guò)在數(shù)據(jù)上做一個(gè)合適的縮放,并檢測(cè)異常點(diǎn),將數(shù)據(jù)預(yù)處理成一個(gè)更好的代表客戶的形式。預(yù)處理數(shù)據(jù)是保證你在分析中能夠得到顯著且有意義的結(jié)果的重要環(huán)節(jié)。
3.1 特征縮放
如果數(shù)據(jù)不是正態(tài)分布的,尤其是數(shù)據(jù)的平均數(shù)和中位數(shù)相差很大的時(shí)候(表示數(shù)據(jù)非常歪斜)。這時(shí)候通常用一個(gè)非線性的縮放是很合適的,(英文原文) ,尤其是對(duì)于金融數(shù)據(jù)。一種實(shí)現(xiàn)這個(gè)縮放的方法是使用 Box-Cox 變換,這個(gè)方法能夠計(jì)算出能夠最佳減小數(shù)據(jù)傾斜的指數(shù)變換方法。一個(gè)比較簡(jiǎn)單的并且在大多數(shù)情況下都適用的方法是使用自然對(duì)數(shù)。
在下面的代碼單元中,我們將實(shí)現(xiàn)以下功能:
- 使用 np.log 函數(shù)在數(shù)據(jù) data 上做一個(gè)對(duì)數(shù)縮放,然后將它的副本(不改變?cè)糳ata的值)賦值給 log_data。
在使用了一個(gè)自然對(duì)數(shù)的縮放之后,數(shù)據(jù)的各個(gè)特征會(huì)顯得更加的正態(tài)分布。
3.2 異常值檢測(cè)
對(duì)于任何的分析,在數(shù)據(jù)預(yù)處理的過(guò)程中檢測(cè)數(shù)據(jù)中的異常值都是非常重要的一步。異常值的出現(xiàn)會(huì)使得把這些值考慮進(jìn)去后結(jié)果出現(xiàn)傾斜。這里有很多關(guān)于怎樣定義什么是數(shù)據(jù)集中的異常值的經(jīng)驗(yàn)法則。這里我們將使用 Tukey 的定義異常值的方法:一個(gè)異常階(outlier step)被定義成1.5倍的四分位距(interquartile range,IQR)。一個(gè)數(shù)據(jù)點(diǎn)如果某個(gè)特征包含在該特征的 IQR 之外的特征,那么該數(shù)據(jù)點(diǎn)被認(rèn)定為異常點(diǎn)。
在下面的代碼單元中,我們完成下面的功能:
- 將指定特征的 25th 分位點(diǎn)的值分配給 Q1 。使用 np.percentile 來(lái)完成這個(gè)功能。
- 將指定特征的 75th 分位點(diǎn)的值分配給 Q3 。同樣的,使用 np.percentile 來(lái)完成這個(gè)功能。
- 將指定特征的異常階的計(jì)算結(jié)果賦值給 step。
- 選擇性地通過(guò)將索引添加到 outliers 列表中,以移除異常值。
- 對(duì)于出現(xiàn)兩次及以上的異常的數(shù)據(jù)點(diǎn),我們將其移除,因?yàn)樵谝粋€(gè) feature 中被認(rèn)為是異常點(diǎn)的點(diǎn),可能在其他 feature 中有著很重要的作用,甚至可能反映新的一種類(lèi)型
4. 數(shù)據(jù)轉(zhuǎn)換
在這個(gè)部分中我們將使用主成分分析(PCA)來(lái)分析批發(fā)商客戶數(shù)據(jù)的內(nèi)在結(jié)構(gòu)。由于使用PCA在一個(gè)數(shù)據(jù)集上會(huì)計(jì)算出最大化方差的維度,我們將找出哪一個(gè)特征組合能夠最好的描繪客戶。
4.1 主成分分析(PCA)
既然數(shù)據(jù)被縮放到一個(gè)更加正態(tài)分布的范圍中并且我們也移除了需要移除的異常點(diǎn),我們現(xiàn)在就能夠在 good_data 上使用 PCA 算法以發(fā)現(xiàn)數(shù)據(jù)的哪一個(gè)維度能夠最大化特征的方差。除了找到這些維度,PCA 也將報(bào)告每一個(gè)維度的解釋方差比(explained variance ratio)–這個(gè)數(shù)據(jù)有多少方差能夠用這個(gè)單獨(dú)的維度來(lái)解釋。
注意 PCA 的一個(gè)組成部分(維度)能夠被看做這個(gè)空間中的一個(gè)新的“特征”,但是它是原來(lái)數(shù)據(jù)中的特征構(gòu)成的。
在下面的代碼單元中,我們將要實(shí)現(xiàn)下面的功能:
- 導(dǎo)入 sklearn.decomposition.PCA 并且將 good_data 用 PCA 并且使用6個(gè)維度進(jìn)行擬合后的結(jié)果保存到 pca 中。
可以看見(jiàn),在第一個(gè)主成分上主要體現(xiàn)的是‘Milk’、‘Grocery’和‘Detergents_Paper’的作用;而第二個(gè)主成分上主要體現(xiàn)了其余三個(gè)屬性的作用;前兩個(gè)主成分共解釋了數(shù)據(jù) 68.32% 的變化,前四個(gè)主成分總共解釋了數(shù)據(jù) 99.39% 的變化。
4.2 降維
當(dāng)使用主成分分析的時(shí)候,一個(gè)主要的目的是減少數(shù)據(jù)的維度,這實(shí)際上降低了問(wèn)題的復(fù)雜度。當(dāng)然降維也是需要一定代價(jià)的:更少的維度能夠表示的數(shù)據(jù)中的總方差更少。因?yàn)檫@個(gè),**累計(jì)解釋方差比(cumulative explained variance ratio)**對(duì)于我們確定這個(gè)問(wèn)題需要多少維度非常重要。另外,如果大部分的方差都能夠通過(guò)兩個(gè)或者是三個(gè)維度進(jìn)行表示的話,降維之后的數(shù)據(jù)能夠被可視化。
在下面的代碼單元中,我們將實(shí)現(xiàn)下面的功能:
- 將 good_data 用兩個(gè)維度的PCA進(jìn)行擬合,并將結(jié)果存儲(chǔ)到 pca 中去。
- 使用 pca.transform 將 good_data 進(jìn)行轉(zhuǎn)換,并將結(jié)果存儲(chǔ)在 reduced_data 中。
4.3 雙標(biāo)圖(Biplot)可視化
雙標(biāo)圖是一個(gè)散點(diǎn)圖,每個(gè)數(shù)據(jù)點(diǎn)的位置由它所在主成分的分?jǐn)?shù)確定。坐標(biāo)系是主成分(這里是 Dimension 1 和 Dimension 2)。此外,雙標(biāo)圖還展示出初始特征在主成分上的投影。一個(gè)雙標(biāo)圖可以幫助我們理解降維后的數(shù)據(jù),發(fā)現(xiàn)主成分和初始特征之間的關(guān)系。
運(yùn)行下面的代碼來(lái)創(chuàng)建一個(gè)降維后數(shù)據(jù)的雙標(biāo)圖。
# 可視化雙標(biāo)圖 vs.biplot(good_data, reduced_data, pca) <matplotlib.axes._subplots.AxesSubplot at 0x1a1f5e3710>一旦我們有了原始特征的投影(紅色箭頭),就能更加容易的理解散點(diǎn)圖每個(gè)數(shù)據(jù)點(diǎn)的相對(duì)位置。
在這個(gè)雙標(biāo)圖中,可以看出 ‘Milk’、‘Grocery’和‘Detergents_Paper’與第一個(gè)主成分有強(qiáng)關(guān)聯(lián),其余初始特征與第二個(gè)主成分相關(guān)聯(lián),之前得到的 pca_results 圖相符。
5. 聚類(lèi)
在這個(gè)部分,我們將使用 K-Means 聚類(lèi)算法以發(fā)現(xiàn)數(shù)據(jù)中隱藏的客戶分類(lèi)。然后,將從簇中恢復(fù)一些特定的關(guān)鍵數(shù)據(jù)點(diǎn),通過(guò)將它們轉(zhuǎn)換回原始的維度和規(guī)模,從而理解他們的含義。
5.1 創(chuàng)建聚類(lèi)
針對(duì)不同情況,有些問(wèn)題需要的聚類(lèi)數(shù)目可能是已知的。但是在聚類(lèi)數(shù)目不作為一個(gè)先驗(yàn)知道的情況下,我們并不能夠保證某個(gè)聚類(lèi)的數(shù)目對(duì)這個(gè)數(shù)據(jù)是最優(yōu)的,因?yàn)槲覀儗?duì)于數(shù)據(jù)的結(jié)構(gòu)(如果存在的話)是不清楚的。但是,我們可以通過(guò)計(jì)算每一個(gè)簇中點(diǎn)的輪廓系數(shù)來(lái)衡量聚類(lèi)的質(zhì)量。數(shù)據(jù)點(diǎn)的輪廓系數(shù)衡量了它與分配給他的簇的相似度,這個(gè)值范圍在-1(不相似)到1(相似)。平均輪廓系數(shù)為我們提供了一種簡(jiǎn)單地度量聚類(lèi)質(zhì)量的方法。
在接下來(lái)的代碼單元中,將實(shí)現(xiàn)下列功能:
- 在 reduced_data 上使用一個(gè)聚類(lèi)算法,并將結(jié)果賦值到 clusterer,需要設(shè)置 random_state 使得結(jié)果可以復(fù)現(xiàn)。
- 使用 clusterer.predict 預(yù)測(cè) reduced_data 中的每一個(gè)點(diǎn)的簇,并將結(jié)果賦值到 preds。
- 使用算法的某個(gè)屬性值找到聚類(lèi)中心,并將它們賦值到 centers。
- 導(dǎo)入 sklearn.metrics.silhouette_score 包并計(jì)算 reduced_data 相對(duì)于 preds 的輪廓系數(shù)。
- 將輪廓系數(shù)賦值給 score 并輸出結(jié)果。
5.2 聚類(lèi)可視化
可視化聚類(lèi)結(jié)果和聚類(lèi)中心:
vs.cluster_results(reduced_data, preds, centers)6. 數(shù)據(jù)恢復(fù)
上面的可視化圖像中提供的每一個(gè)聚類(lèi)都有一個(gè)中心點(diǎn)。這些中心(或者叫平均點(diǎn))并不是數(shù)據(jù)中真實(shí)存在的點(diǎn),但是是所有預(yù)測(cè)在這個(gè)簇中的數(shù)據(jù)點(diǎn)的平均。對(duì)于創(chuàng)建客戶分類(lèi)的問(wèn)題,一個(gè)簇的中心對(duì)應(yīng)于那個(gè)分類(lèi)的平均用戶。因?yàn)檫@個(gè)數(shù)據(jù)現(xiàn)在進(jìn)行了降維并縮放到一定的范圍,我們可以通過(guò)施加一個(gè)反向的轉(zhuǎn)換恢復(fù)這個(gè)點(diǎn)所代表的用戶的花費(fèi)。
在下面的代碼單元中,將實(shí)現(xiàn)下列的功能:
- 使用 pca.inverse_transform 將 centers 反向轉(zhuǎn)換,并將結(jié)果存儲(chǔ)在 log_centers 中。
- 使用 np.log 的反函數(shù) np.exp 反向轉(zhuǎn)換 log_centers 并將結(jié)果存儲(chǔ)到 true_centers 中。
| 9564.0 | 2051.0 | 2609.0 | 2172.0 | 325.0 | 717.0 |
| 3854.0 | 7662.0 | 11498.0 | 914.0 | 4448.0 | 1021.0 |
將恢復(fù)結(jié)果與開(kāi)始的特征均值可以看出:
Cluster 0 可能代表零售商用戶,因?yàn)楦黜?xiàng)支出都低于平均值,符合零售店的特征;
Cluster 1 可能代表咖啡廳類(lèi)客戶,因?yàn)镸ilk、Grocery、Detergents Paper這三項(xiàng)支出遠(yuǎn)高于平均值,符合咖啡店的特征。
7. 利用聚類(lèi)結(jié)果進(jìn)行預(yù)測(cè)
對(duì)選取的樣本進(jìn)行類(lèi)別預(yù)測(cè):
indices = [20,200,400]# 為選擇的樣本建立一個(gè)DataFrame samples = pd.DataFrame(data.loc[indices], columns = data.keys()).reset_index(drop = True) print("Chosen samples of wholesale customers dataset:") display(samples)log_samples = np.log(samples) pca_samples = pca.transform(log_samples) sample_preds = clusterer.predict(pca_samples)for i, pred in enumerate(sample_preds):print("Sample point", i, "predicted to be in Cluster", pred) Chosen samples of wholesale customers dataset:| 17546 | 4519 | 4602 | 1066 | 2259 | 2124 |
| 3067 | 13240 | 23127 | 3941 | 9959 | 731 |
| 4446 | 906 | 1238 | 3576 | 153 | 1014 |
總結(jié)
以上是生活随笔為你收集整理的无监督学习 | PCA 主成分分析之客户分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab 小技巧
- 下一篇: Adobe illustrator 介绍