无监督学习 | PCA 主成分分析之客户分类
文章目錄
- 1. 開始
- 2. 數(shù)據(jù)探索
- 2.2 特征相關(guān)性
- 2.3 可視化特征分布
- 3. 數(shù)據(jù)預(yù)處理
- 3.1 特征縮放
- 3.2 異常值檢測
- 4. 數(shù)據(jù)轉(zhuǎn)換
- 4.1 主成分分析(PCA)
- 4.2 降維
- 4.3 雙標(biāo)圖(Biplot)可視化
- 5. 聚類
- 5.1 創(chuàng)建聚類
- 5.2 聚類可視化
- 6. 數(shù)據(jù)恢復(fù)
- 7. 利用聚類結(jié)果進(jìn)行預(yù)測
相關(guān)文章:
機(jī)器學(xué)習(xí) | 目錄
機(jī)器學(xué)習(xí) | 聚類評估指標(biāo)
無監(jiān)督學(xué)習(xí) | KMeans 之Sklearn實(shí)現(xiàn):電影評分聚類
無監(jiān)督學(xué)習(xí) | PCA 主成分分析原理及Sklearn實(shí)現(xiàn)
1. 開始
在這個項(xiàng)目中,我們將分析一個數(shù)據(jù)集的內(nèi)在結(jié)構(gòu),這個數(shù)據(jù)集包含很多客戶真對不同類型產(chǎn)品的年度采購額(用金額表示)。這個項(xiàng)目的任務(wù)之一是如何最好地描述一個批發(fā)商不同種類顧客之間的差異。這樣做將能夠使得批發(fā)商能夠更好的組織他們的物流服務(wù)以滿足每個客戶的需求。
這個項(xiàng)目的數(shù)據(jù)集能夠在UCI機(jī)器學(xué)習(xí)信息庫中找到.因?yàn)檫@個項(xiàng)目的目的,分析將不會包括 ‘Channel’ 和 ‘Region’ 這兩個特征——重點(diǎn)集中在6個記錄的客戶購買的產(chǎn)品類別上。
# 引入這個項(xiàng)目需要的庫 import numpy as np import pandas as pd import visuals as vs # 子集 from IPython.display import display # 使得我們可以對DataFrame使用display()函數(shù)# 設(shè)置以內(nèi)聯(lián)的形式顯示matplotlib繪制的圖片(在notebook中顯示更美觀) %matplotlib inline # 高分辨率顯示 %config InlineBackend.figure_format='retina'# 載入整個客戶數(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ù)探索
在這部分,我們將開始分析數(shù)據(jù),通過可視化和代碼來理解每一個特征和其他特征的聯(lián)系。我們會看到關(guān)于數(shù)據(jù)集的統(tǒng)計描述,考慮每一個屬性的相關(guān)性,然后從數(shù)據(jù)集中選擇若干個樣本數(shù)據(jù)點(diǎn),我們將在整個項(xiàng)目中一直跟蹤研究這幾個數(shù)據(jù)點(diǎn)。
運(yùn)行下面的代碼單元給出數(shù)據(jù)集的一個統(tǒng)計描述。注意這個數(shù)據(jù)集包含了6個重要的產(chǎn)品類型:‘Fresh’, ‘Milk’, ‘Grocery’, ‘Frozen’, **‘Detergents_Paper’**和 ‘Delicatessen’。想一下這里每一個類型代表你會購買什么樣的產(chǎn)品。
# 顯示數(shù)據(jù)集的一個描述 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)性
一個有趣的想法是,考慮這六個類別中的一個(或者多個)產(chǎn)品類別,是否對于理解客戶的購買行為具有實(shí)際的相關(guān)性。也就是說,當(dāng)用戶購買了一定數(shù)量的某一類產(chǎn)品,我們是否能夠確定他們必然會成比例地購買另一種類的產(chǎn)品。
有一個簡單的方法可以檢測相關(guān)性:我們用移除了某一個特征之后的數(shù)據(jù)集來構(gòu)建一個監(jiān)督學(xué)習(xí)(回歸)模型,然后用這個模型去預(yù)測那個被移除的特征,再對這個預(yù)測結(jié)果進(jìn)行評分,看看預(yù)測結(jié)果如何。
在下面的代碼單元中將實(shí)現(xiàn)以下的功能:
-
使用 DataFrame.drop 函數(shù)移除數(shù)據(jù)集中選擇的不需要的特征,并將移除后的結(jié)果賦值給 new_data 。
-
使用 sklearn.model_selection.train_test_split 將數(shù)據(jù)集分割成訓(xùn)練集和測試集。
-
導(dǎo)入一個 DecisionTreeRegressor (決策樹回歸器),然后用訓(xùn)練集訓(xùn)練它。
-
使用回歸器的 score 函數(shù)輸出模型在測試集上的預(yù)測得分。
可以看到?jīng)Q定系數(shù)為 0.6052,并不是很高,因此這個特征對與區(qū)分用戶的消費(fèi)習(xí)慣來說不是特別的重要。
2.3 可視化特征分布
為了能夠?qū)@個數(shù)據(jù)集有一個更好的理解,我們可以對數(shù)據(jù)集中的每一個產(chǎn)品特征構(gòu)建一個散布矩陣(scatter matrix)。如果在一個特征對于區(qū)分一個特定的用戶來說是必須的,那么這個特征和其它的特征可能不會在下面的散射矩陣中顯示任何關(guān)系。相反的,如果這個特征對于識別一個特定的客戶是沒有作用的,那么通過散布矩陣可以看出在這個數(shù)據(jù)特征和其它特征中有關(guān)聯(lián)性。下面創(chuàng)建一個散布矩陣。
# 對于數(shù)據(jù)中的每一對特征構(gòu)造一個散布矩陣 pd.plotting.scatter_matrix(data, alpha = 0.3, figsize = (14,8), diagonal = 'kde');由散步矩陣的對角圖像可以看出,數(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ù)處理
在這個部分,我們將通過在數(shù)據(jù)上做一個合適的縮放,并檢測異常點(diǎn),將數(shù)據(jù)預(yù)處理成一個更好的代表客戶的形式。預(yù)處理數(shù)據(jù)是保證你在分析中能夠得到顯著且有意義的結(jié)果的重要環(huán)節(jié)。
3.1 特征縮放
如果數(shù)據(jù)不是正態(tài)分布的,尤其是數(shù)據(jù)的平均數(shù)和中位數(shù)相差很大的時候(表示數(shù)據(jù)非常歪斜)。這時候通常用一個非線性的縮放是很合適的,(英文原文) ,尤其是對于金融數(shù)據(jù)。一種實(shí)現(xiàn)這個縮放的方法是使用 Box-Cox 變換,這個方法能夠計算出能夠最佳減小數(shù)據(jù)傾斜的指數(shù)變換方法。一個比較簡單的并且在大多數(shù)情況下都適用的方法是使用自然對數(shù)。
在下面的代碼單元中,我們將實(shí)現(xiàn)以下功能:
- 使用 np.log 函數(shù)在數(shù)據(jù) data 上做一個對數(shù)縮放,然后將它的副本(不改變原始data的值)賦值給 log_data。
在使用了一個自然對數(shù)的縮放之后,數(shù)據(jù)的各個特征會顯得更加的正態(tài)分布。
3.2 異常值檢測
對于任何的分析,在數(shù)據(jù)預(yù)處理的過程中檢測數(shù)據(jù)中的異常值都是非常重要的一步。異常值的出現(xiàn)會使得把這些值考慮進(jìn)去后結(jié)果出現(xiàn)傾斜。這里有很多關(guān)于怎樣定義什么是數(shù)據(jù)集中的異常值的經(jīng)驗(yàn)法則。這里我們將使用 Tukey 的定義異常值的方法:一個異常階(outlier step)被定義成1.5倍的四分位距(interquartile range,IQR)。一個數(shù)據(jù)點(diǎn)如果某個特征包含在該特征的 IQR 之外的特征,那么該數(shù)據(jù)點(diǎn)被認(rèn)定為異常點(diǎn)。
在下面的代碼單元中,我們完成下面的功能:
- 將指定特征的 25th 分位點(diǎn)的值分配給 Q1 。使用 np.percentile 來完成這個功能。
- 將指定特征的 75th 分位點(diǎn)的值分配給 Q3 。同樣的,使用 np.percentile 來完成這個功能。
- 將指定特征的異常階的計算結(jié)果賦值給 step。
- 選擇性地通過將索引添加到 outliers 列表中,以移除異常值。
- 對于出現(xiàn)兩次及以上的異常的數(shù)據(jù)點(diǎn),我們將其移除,因?yàn)樵谝粋€ feature 中被認(rèn)為是異常點(diǎn)的點(diǎn),可能在其他 feature 中有著很重要的作用,甚至可能反映新的一種類型
4. 數(shù)據(jù)轉(zhuǎn)換
在這個部分中我們將使用主成分分析(PCA)來分析批發(fā)商客戶數(shù)據(jù)的內(nèi)在結(jié)構(gòu)。由于使用PCA在一個數(shù)據(jù)集上會計算出最大化方差的維度,我們將找出哪一個特征組合能夠最好的描繪客戶。
4.1 主成分分析(PCA)
既然數(shù)據(jù)被縮放到一個更加正態(tài)分布的范圍中并且我們也移除了需要移除的異常點(diǎn),我們現(xiàn)在就能夠在 good_data 上使用 PCA 算法以發(fā)現(xiàn)數(shù)據(jù)的哪一個維度能夠最大化特征的方差。除了找到這些維度,PCA 也將報告每一個維度的解釋方差比(explained variance ratio)–這個數(shù)據(jù)有多少方差能夠用這個單獨(dú)的維度來解釋。
注意 PCA 的一個組成部分(維度)能夠被看做這個空間中的一個新的“特征”,但是它是原來數(shù)據(jù)中的特征構(gòu)成的。
在下面的代碼單元中,我們將要實(shí)現(xiàn)下面的功能:
- 導(dǎo)入 sklearn.decomposition.PCA 并且將 good_data 用 PCA 并且使用6個維度進(jìn)行擬合后的結(jié)果保存到 pca 中。
可以看見,在第一個主成分上主要體現(xiàn)的是‘Milk’、‘Grocery’和‘Detergents_Paper’的作用;而第二個主成分上主要體現(xiàn)了其余三個屬性的作用;前兩個主成分共解釋了數(shù)據(jù) 68.32% 的變化,前四個主成分總共解釋了數(shù)據(jù) 99.39% 的變化。
4.2 降維
當(dāng)使用主成分分析的時候,一個主要的目的是減少數(shù)據(jù)的維度,這實(shí)際上降低了問題的復(fù)雜度。當(dāng)然降維也是需要一定代價的:更少的維度能夠表示的數(shù)據(jù)中的總方差更少。因?yàn)檫@個,**累計解釋方差比(cumulative explained variance ratio)**對于我們確定這個問題需要多少維度非常重要。另外,如果大部分的方差都能夠通過兩個或者是三個維度進(jìn)行表示的話,降維之后的數(shù)據(jù)能夠被可視化。
在下面的代碼單元中,我們將實(shí)現(xiàn)下面的功能:
- 將 good_data 用兩個維度的PCA進(jìn)行擬合,并將結(jié)果存儲到 pca 中去。
- 使用 pca.transform 將 good_data 進(jìn)行轉(zhuǎn)換,并將結(jié)果存儲在 reduced_data 中。
4.3 雙標(biāo)圖(Biplot)可視化
雙標(biāo)圖是一個散點(diǎn)圖,每個數(shù)據(jù)點(diǎn)的位置由它所在主成分的分?jǐn)?shù)確定。坐標(biāo)系是主成分(這里是 Dimension 1 和 Dimension 2)。此外,雙標(biāo)圖還展示出初始特征在主成分上的投影。一個雙標(biāo)圖可以幫助我們理解降維后的數(shù)據(jù),發(fā)現(xiàn)主成分和初始特征之間的關(guān)系。
運(yùn)行下面的代碼來創(chuàng)建一個降維后數(shù)據(jù)的雙標(biāo)圖。
# 可視化雙標(biāo)圖 vs.biplot(good_data, reduced_data, pca) <matplotlib.axes._subplots.AxesSubplot at 0x1a1f5e3710>一旦我們有了原始特征的投影(紅色箭頭),就能更加容易的理解散點(diǎn)圖每個數(shù)據(jù)點(diǎn)的相對位置。
在這個雙標(biāo)圖中,可以看出 ‘Milk’、‘Grocery’和‘Detergents_Paper’與第一個主成分有強(qiáng)關(guān)聯(lián),其余初始特征與第二個主成分相關(guān)聯(lián),之前得到的 pca_results 圖相符。
5. 聚類
在這個部分,我們將使用 K-Means 聚類算法以發(fā)現(xiàn)數(shù)據(jù)中隱藏的客戶分類。然后,將從簇中恢復(fù)一些特定的關(guān)鍵數(shù)據(jù)點(diǎn),通過將它們轉(zhuǎn)換回原始的維度和規(guī)模,從而理解他們的含義。
5.1 創(chuàng)建聚類
針對不同情況,有些問題需要的聚類數(shù)目可能是已知的。但是在聚類數(shù)目不作為一個先驗(yàn)知道的情況下,我們并不能夠保證某個聚類的數(shù)目對這個數(shù)據(jù)是最優(yōu)的,因?yàn)槲覀儗τ跀?shù)據(jù)的結(jié)構(gòu)(如果存在的話)是不清楚的。但是,我們可以通過計算每一個簇中點(diǎn)的輪廓系數(shù)來衡量聚類的質(zhì)量。數(shù)據(jù)點(diǎn)的輪廓系數(shù)衡量了它與分配給他的簇的相似度,這個值范圍在-1(不相似)到1(相似)。平均輪廓系數(shù)為我們提供了一種簡單地度量聚類質(zhì)量的方法。
在接下來的代碼單元中,將實(shí)現(xiàn)下列功能:
- 在 reduced_data 上使用一個聚類算法,并將結(jié)果賦值到 clusterer,需要設(shè)置 random_state 使得結(jié)果可以復(fù)現(xiàn)。
- 使用 clusterer.predict 預(yù)測 reduced_data 中的每一個點(diǎn)的簇,并將結(jié)果賦值到 preds。
- 使用算法的某個屬性值找到聚類中心,并將它們賦值到 centers。
- 導(dǎo)入 sklearn.metrics.silhouette_score 包并計算 reduced_data 相對于 preds 的輪廓系數(shù)。
- 將輪廓系數(shù)賦值給 score 并輸出結(jié)果。
5.2 聚類可視化
可視化聚類結(jié)果和聚類中心:
vs.cluster_results(reduced_data, preds, centers)6. 數(shù)據(jù)恢復(fù)
上面的可視化圖像中提供的每一個聚類都有一個中心點(diǎn)。這些中心(或者叫平均點(diǎn))并不是數(shù)據(jù)中真實(shí)存在的點(diǎn),但是是所有預(yù)測在這個簇中的數(shù)據(jù)點(diǎn)的平均。對于創(chuàng)建客戶分類的問題,一個簇的中心對應(yīng)于那個分類的平均用戶。因?yàn)檫@個數(shù)據(jù)現(xiàn)在進(jìn)行了降維并縮放到一定的范圍,我們可以通過施加一個反向的轉(zhuǎn)換恢復(fù)這個點(diǎn)所代表的用戶的花費(fèi)。
在下面的代碼單元中,將實(shí)現(xiàn)下列的功能:
- 使用 pca.inverse_transform 將 centers 反向轉(zhuǎn)換,并將結(jié)果存儲在 log_centers 中。
- 使用 np.log 的反函數(shù) np.exp 反向轉(zhuǎn)換 log_centers 并將結(jié)果存儲到 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é)果與開始的特征均值可以看出:
Cluster 0 可能代表零售商用戶,因?yàn)楦黜?xiàng)支出都低于平均值,符合零售店的特征;
Cluster 1 可能代表咖啡廳類客戶,因?yàn)镸ilk、Grocery、Detergents Paper這三項(xiàng)支出遠(yuǎn)高于平均值,符合咖啡店的特征。
7. 利用聚類結(jié)果進(jìn)行預(yù)測
對選取的樣本進(jìn)行類別預(yù)測:
indices = [20,200,400]# 為選擇的樣本建立一個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 主成分分析之客户分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 小技巧
- 下一篇: Adobe illustrator 介绍