您當前的位置:首頁 > 文化

實用機器學習-隨機森林如何作科研分析及討論 EDA

作者:由 milo chena 發表于 文化時間:2019-08-14

“當模型建立後,如何解釋和分析模型,往往是科研中必不可很少的一部分。機器學習模型往往被成為黑箱子,如何在傳統領域的分析方法上進行一定解釋,是我們學者們要進一步探索的課題。我們在這裡列舉了不同的 EDA 方式,希望能夠幫助模型解釋,以及 EDA 分析的進一步建立。“

在隨機森林模型建立之後,我們的模型可以被用於更高階的模型分析,當然這個都是在信任模型的基礎上,如同科學實驗中,我們透過線性迴歸得到一些特徵關係,之後可以用來討論對這些關係的認知以及對其他現象的理解,我們同樣也能夠從隨機森林 RF 裡面得到一些洞察,用以瞭解我們的資料庫關係。

1。 One-hot coding 還是 categorical coding

One-hot coding

實用機器學習-隨機森林如何作科研分析及討論 EDA

上述就是 one hot coding 的示意圖,每個子集都會單獨的成立一列,用 1/0 來表示是不是屬於這個列,實際操作的時候,你會發現這個部分就是把原先的列刪掉之後,增加了跟 categories 數量一樣多的列數。

def transfer_dummies(df, max_dummies=6)

‘’‘ Function to transfer dataframe df into dummies, where category number is less than max_dummies。

Input: df - dataframe, max_dummies - integer

Output: dataframe after transformation

’‘’

cols = df。select_dtypes(include=‘category’)

change_col = []

for col in cols:

if len(df[col]。cat。categories) <= max_dummies: change_col。append(col)

return pd。get_dummies(df, columns=change_col)

Categorized Coding

實用機器學習-隨機森林如何作科研分析及討論 EDA

同樣的透過 A、B、C、D、E 的一列,如果我們實用 categorized coding 的方法,就是在統一列上透過數字的順序的方式來給予數字編號。這樣就是實用數字編碼的一列來替換原始的 str 列。

——-

透過上述的示例,我們可以看到 one-hot coding 會對每一個類別增加一行,因此在最終分析 feature importance 的時候,每個 feature group 的重要性都會被計算。

最終得到的結果會是所有的 category 都提供其 feature importance。

2。 Feature Importance 陷阱

我們在做 feature importance 的時候,其實是把每個 feature 去掉之後,計算最終 score 降低了多少來看這個 feature 的影響有多大。但是這裡其實只是計算了單個的 feature 的影響。

如果其中兩個 features 其實是相關的,去掉一個之後,另一個依然能夠幫助整個模型獲得比較好的 score。因此這個 fearure importance 在這個狀況下就不是十分準確的提供了單個 feature 的貢獻。我們在 feature 之間關係的時候,依然可以繼續使用傳統統計學的方式來計算各種 feature 之間的相關性,作為 feature 特徵的分析結果,而不是僅僅透過 feature importance 來判斷各個特徵的貢獻情況。

3。 Feature 相似性 - cluster

當我們認為這個 模型可靠之後,我們會希望來解譯模型裡面的 insights。因此,我們可以透過計算feature cluster 的方式來查閱其距離,在這裡我們使用 hierarchy 結構,但是你要記得你的模型可能是經過 fillna 的,這個部分是否會影響模型特徵相似性的分析,需要單獨個案的討論,當然也是會被 reviewer challenge 的地方。

def rf_feat_importance(m, df):

return pd。DataFrame({‘cols’:df。columns, ‘imp’:m。feature_importances_} )。sort_values(‘imp’, ascending=False)

fi = rf_feat_importance(model, x_train); fi[:10]

上面這個是針對模型的 feature importance 獲取,隨後我們取出其中一部分,因為如果選擇所有的 feature,會形成過於稀疏的矩陣而無法計算距離。

to_keep = fi[fi。imp>0。005]。cols; len(to_keep)

x_keep = x_train[to_keep]。copy()

——-

import scipy

from scipy。cluster import hierarchy as hc

import matplotlib。pyplot as plt

corr = np。round(scipy。stats。spearmanr(x_keep)。correlation, 4)

corr_condensed = hc。distance。squareform(1-corr)

z = hc。linkage(corr_condensed, method=‘average’)

fig = plt。figure(figsize=(16,10))

dendrogram = hc。dendrogram(z, labels=x_keep。columns, orientation=‘left’, leaf_font_size=16)

plt。show()

實用機器學習-隨機森林如何作科研分析及討論 EDA

這裡就能刻畫出哪些模型 feature 關係比較接近,距離比較相似。

同時要注意的是,我們這裡的距離計算公式是 rank distance,就是說根據順序來看,他們之間的距離是什麼樣的,而不是絕對距離。

那麼,我們就可以進一步測試,把相同的 feature 去掉,是不是會影響這個 model 的 train 精度。

4。 Partial Dependence 部分依賴

在這裡我們可以使用一個 庫 來專門作這個部分的顯示和分析。

from pdpbox import pdp

from plotnine import *

def get_sample(df,n):

idxs = sorted(np。random。permutation(len(df))[:n])

return df。iloc[idxs]。copy()

x_all = get_sample(df_cat[df_cat。YearMade>1930], 500)

ggplot(x_all, aes(‘YearMade’, ‘SalePrice’))+stat_smooth(se=True, method=‘loess’)

實用機器學習-隨機森林如何作科研分析及討論 EDA

這是 ggplot 透過真實資料的擬合效果,類似一個 polyfit 的效果,但是要知道我們的模型已經經過訓練,我需要了解當模型構建完之後,模型看到的 YearMade 和 SalePrice 之間有什麼關係,我們可以直接讓模型來幫我們作出判斷。

這裡所要作的就是利用模型來做融合資料,我們假設500 個點,每個點都在每一年(也就是每個YearMade)的SalePrice都能透過模型來計算,那麼他們的趨勢會是什麼樣的。

def plot_pdp(feat, m, x, clusters=None, feat_name=None):

feat_name = feat_name or feat

p = pdp。pdp_isolate(m, x, feat)

return pdp。pdp_plot(p, feat_name, plot_lines=True, cluster=clusters is not None, n_cluster_centers=clusters)

x = get_sample(x_train[x_train。YearMade>1930], 500)

plot_pdp(‘YearMade’, model, x)

實用機器學習-隨機森林如何作科研分析及討論 EDA

可以看到,透過模型的估算,我們的 saleprice 與 yearmade 之間有了一個比較平滑遞增關係,這是透過大量的及其學習獲得的關係,而不是 500 個數據點的 polyfit 擬合。同樣,我們可以對 500 個數據點進行 cluster 來分析一下不同的遞增關係。

plot_pdp(‘YearMade’, model, x, clusters=5)

實用機器學習-隨機森林如何作科研分析及討論 EDA

這裡可以看出我們的產品增長會大致分為 5 種不同的方式,自動幫助我們聚合分類,給出 yearmade 和 price 之間的關係。

標簽: Feature  df  模型  importance  feat