我們是光大科技公司的追光算法實驗室團隊,將不定期推出數據挖掘和算法相關的數據科學原創文章。團隊定位打造基於知識驅動的機器學習算法實驗室,由實踐經驗豐富的數據分析挖掘工程師和專注算法的數據科學家精心準備相關作品,志在分享結合實際業務的理論應用和算法創新,以及其中的心得體會。
文 | 光大科技大數據部 李琨
1 評分卡建模中的變量聚類與變量選擇2 變量聚類VARCLUS模塊使用的聚類算法詳解2.1 cluster component怎麼取?2.2 具體怎麼分群(簇)?2.3 基於計算代價的考量3 沒有SAS VARCLUS時怎麼辦?4 總結
1 評分卡建模中的變量聚類與變量選擇
基於邏輯回歸的評分卡建模是金融業中最常見的建模方案之一,由於良好的業務可解釋性,在風控、運營和營銷等業務場景中都有廣泛應用。
評分卡建模有成熟的一套數據預處理過程。最近看到的這篇總結《從信用管理角度識別高價值客戶》中,變量聚類被突出強調了出來。
文章的作者在在線分享[1] 時,還特別還強調了SAS中變量聚類VARCLUS模塊的實用性。那麼
這一步變量聚類在做什麼?評分卡建模流程中常見的變量選擇和這步什麼關係?具體怎麼實現的?根據SAS/STAT User's Guide[2] 中VARCLUS模塊的說明
The VARCLUS procedure divides a set of numeric variables into either disjoint or hierarchical clusters.
VARCLUS將數值型變量分成互不相交(或有分層)的群(簇)
PROC VARCLUS tries to maximize the sum across clusters of the variance of the original variables that is explained by the cluster components. Either the correlation or the covariance matrix can be analyzed.
VARCLUS試圖最大化由每一個群簇的簇成分解釋的簇中原始變量的方差之和。這個過程由對相應相關係數矩陣或者協方差矩陣的分析實現。
The VARCLUS procedure can be used as a variable-reduction method. A large set of variables can often be replaced by the set of cluster components with little loss of information.
VARCLUS可以用作一種變量壓縮的方法。變量可以用它所在的群簇的簇成分代替,而並只損失少量信息。
VARCLUS的輸出包括
Variation Explained by the cluster component. This statistic is based only on the variables in the cluster rather than on all variables.Total variation explained, the sum across clusters of the variation explained by each cluster還有
R-squared with Own Cluster, the squared correlation of the variable with its own cluster component; and R-squared with Next Closest, the next highestsquared correlation of the variable with a cluster component. Next Closest shouldbe a low value if the clusters are well separated. Ratio, the ratio of one minus the value in the Own Cluster column to one minus the value in the Next Closest column. The occurrence of low ratios indicates well-separated clusters通過這些我們可以知道一下信息
VARCLUS可以將連續性變量分群(簇),每個群簇中有若干元素。建立這樣分群(簇)的依據是以各群簇的簇成分表徵的方差之和最大化。利用這些簇和簇成分可以用來壓縮變量。注意: 後續建模如果需要對模型的可解釋性要求高,壓縮時並不會使用主成分之類的簇成分。而是結合對變量的業務理解和 ratio結果從低到高(和自己所屬的類相關性高,和其他類相關性低),直接從類中選取原始變量作為這類變量的代表,實現變量篩選。這樣選取的變量就滿足可解釋性要求,又可以避免變量相關性給建模帶來的困難。
2 變量聚類VARCLUS模塊使用的聚類算法詳解
2.1 cluster component怎麼取?
下面首先來了解一下這裡涉及的cluster component簇成分是怎麼取的。
This linear combination can be either the first principal component (the default) or the centroid component (if you specify the CENTROID option).
預設使用第一主成分,可選用中心化(質心)成分(通過CENTROID選項設置)主成分是主成分分析(PCA)裡的基本概念。主成分分析是常用變量壓縮方法,主要思想是要求經過中心化後原始變量 (n維,即n列)正交投影到 維空間後的 ( 為 , 且 , 其中 是 維單位陣)的方差最大。主成分分析告訴我們: 的最大的若干個特徵值及其對應的特徵向量可以幫助我們構造這樣的投影。最大特徵值的單位特徵向量對原始變量的線性組合,對應了第一主成分,最大特徵值對應這個成分(能解釋)的方差。
而中心化成分就是用變量的平均,預設分析相關係數矩陣時,使用標準化後的變量的無權重平均;通過COVARIANCE選項設置分析協方差矩陣時,相當於使用原始未做標準的變量的平均。
2.2 具體怎麼分群(簇)?
這是一種自上而下的分群方法,首先把所有變量放入一個群中。然後重複以下步驟:
1. 選取一個群(簇)進行分裂
PROPORTION選項打開的話,選簇成分能解釋的方差佔簇方差比例最低的。MAXEIGEN選項打開的話,選簇的第二主成分對應的特徵值(也就是這個簇的相關係數或協方差矩陣的第二大特徵值)最大的簇。2. 初始化分成2個新群(簇)
預設的方式是根據要分裂的群(簇)的第一和第二主成分,然後用一種正交斜交旋轉orthoblique rotation(用的raw quartimax rotation,具體可參考因子分析Factor Analysis中的因子旋轉,1960年代的方法),最後根據簇中原始變量和旋轉後第一和第二成分的相關係數平方的大小,分成新的兩群(簇)。還有其他初始化方法可選用,比如隨機隨機分配。3. 初始分配後,還會迭代變量,調整分群,嘗試最大化分簇帶來的簇成分對總可解釋方差的提升。一般包括兩個過程:
Nearest component sorting (NCS) phase. 每輪迭代,計算所有群的簇成分,把所有的變量劃入和簇成分的相關係數平方最大的群(簇)。然後不斷迭代,達到一定條件(群簇結構不變)停止。Search phase 就是挨個搜索嘗試,如果改變一個變量到計劃分裂出的其他簇,能否增大新的分群(簇)結構的簇成分能解釋的總方差。每一次考察都要重算兩個矩陣的最大特徵值,這一步的計算代價要大的多。停止這三步的重複迭代的準則是
Every cluster satisfies the stopping criteria specified by the PROPORTION= option (percentage of variation explained) or the MAXEIGEN= option (second eigenvalue) or both.
當然一個群裡只有一個變量時就不能再被分裂了。VARCLUS模塊的預設設置是每個群(簇)只有一個簇第一主成分大於1(相當於MIXEIGEN=1)。另外還可以指定關於群(簇)個數上限的終止條件。顯然MAXEIGEN這種簇第二主成分對應特徵值型的終止條件,必須配合使用主成分作為簇成分時使用,而不能使用中心化成分做簇成分。
這種自上而下的分群算法,如果限制每次分裂時第3步調整必須只能調整到同一個原始群(簇)計劃分出的其他群(簇),這個分群算法的分群就有分層的樹結構。如下圖。
2.3 基於計算代價的考量
顯然分群過程中,每次分裂時最耗時就是第3步調整劃分改變群簇結構。
NCS phase比Search phase快的多,但對於最大化簇成分可解釋總方差這個目標,容易陷入局部最優。
用簇第一主成分做簇成分時,NCS phase是一種交替最小二乘方法,能快速收斂。Search phase會非常耗時,特別當變量數量多的時候。當第2步使用預設的初始化方法(根據和旋轉後簇第一和第二主成分的相關性)時,Search phase對NCS phase的結果沒有明顯提升,可以限制Search phase只進行少量嘗試(預設設置是直接跳過這步)。當第2步使用隨機分配初始化方法,NCS phase很可能會落入局部最優,Search phase能幫助從局部最優出來。用中心化成分時,NCS phase不是一種交替最小二乘方法,並不能保證增加總的簇成分解釋的方差。所以預設設置時,NCS phase中的迭代只進行一次。節約計算代價的主要方式:
限制調整時必須保持層次結構,只考慮原計劃分出的同來源的群簇,顯然可以大大降低搜索空間,節約計算量。限制Search phase的搜索次數3 沒有SAS VARCLUS時怎麼辦?
SAS作為以統計分析起家的有半個世紀歷史的商業智能軟體,無疑是功能強大的。其穩定性和服務的完善性,更是讓其成為金融業,特別是銀行業數據挖掘建模的不二之選。
當然這樣偉大而優秀的商業軟體,對機構來說是有使用成本的。如果沒有SAS,又想用SAS VARCLUS模塊功能怎麼辦呢?
根據SAS USER』S GUIDE的介紹,以及我們對算法的解讀,自己實現一下也是可以的。不過SAS VARCLUS模塊對一般用戶來說還是個黑盒,想做的一模一樣,還是有點難度。
使用python語言的,可以參考一下github的這個項目 variable-clustering[3]https://github.com/jingmin1987/variable-clustering
這個項目的作者實現了用基於第一主成分做簇成分,限制必須保留層次結構的分群方法。分裂一個群簇時的初始化,考察和未做旋轉的前n個主成分相關係數平方大小(和SAS VARCLUS中還加了因子旋轉的方式略有不同),可以一次把一個群簇分成n個。
此工具包提供了分群層次結構的輸出。
沒有直接提供如SAS VARCLUS那樣的輸出,不過根據前面的介紹,自行計算一下即可。
stat_res=[]clus_pca=[]for cluster in demo5.cluster.return_all_leaves(): cluster.run_pca() my_pca=cluster._pca_features[0] clus_pca.append(my_pca)for i,cluster in enumerate(demo5.cluster.return_all_leaves()):for feature in cluster.features: r2_list=[np.corrcoef(cluster.dataframe[feature],cpa)[0,1]**2for cpa in clus_pca] ownr2=r2_list[i] r2_list.pop(i) nr2=max(r2_list) stat_res.append([i,feature,ownr2,nr2,(1-ownr2)/(1-nr2)])stat_res=pd.DataFrame(stat_res,columns=['cluster','feature','R2 with own cluster','R2 with nearest cluster','1-R2 ratio'])print(stat_res)
4 總結
SAS VARCLUS是一種針對數值型變量的無監督變量分群算法,以最大化各群的群簇成分能解釋的總方差為優化目標,以解釋的總方差比例或者每個群簇第二主特徵對應特徵向量的為終止條件。輸出每個變量和本群以及其他群簇成分的相關性信息。SAS VARCLUS採用的算法,計算量隨變量數量的增加,增長較快。當變量較少或者計算時間可接受的情況下,可以使用。如變量特別多(成百上千過萬)的時候,不建議採用,考慮採取其他方法實現變量分群,或者結合其他信息過濾(比如有監督學習建模場景利用結合目標變量信息的過濾)。可以利用分群的結果和輸出,進行變量壓縮(變量選擇)。對變量可解釋性要求高的場景,可以根據 ratio 選取原始變量,同時降低變量相關性對建模的影響。群簇中元素較多時,可以考慮不止一個原始變量。(這種做變量選擇的思路,更多的是依賴分群後相應的統計信息,對分群方法並不特別依賴。)github有開源的python實現variable clustering項目可供參考。參考資料
[1]從信用管理角度識別高價值客戶: https://v.qq.com/x/page/m0940yz6ckx.html
[2]Overview: VARCLUS Procedure: https://documentation.sas.com/?docsetId=statug&docsetTarget=statug_varclus_overview.htm&docsetVersion=15.1&locale=en
[3]variable-clustering: https://github.com/jingmin1987/variable-clustering