【數(shù)據(jù)挖掘】特征相關(guān)性挖掘神器-線性非線性關(guān)系一鍵挖掘!
Kaggle競(jìng)賽知識(shí)點(diǎn)--PredictivePowerScore(PPS)

很多時(shí)候,我們?cè)谟?jì)算特征之間相關(guān)性或者繪制相關(guān)性矩陣的時(shí)候習(xí)慣性地會(huì)使用Pearson相關(guān)性,這在諸多問題中確實(shí)可以為模型預(yù)測(cè)等方面帶來很多幫助,但它卻存在著下面三個(gè)比較大的問題:
考慮的是特征之間的線性關(guān)系,如果絕對(duì)值越大,那么兩個(gè)變量之間的線性相關(guān)性就越強(qiáng),反之線性關(guān)系就越低;如果兩個(gè)變量之間存在極強(qiáng)的非線性關(guān)系,也會(huì)因?yàn)榫€性關(guān)系較低,而被誤以為沒什么關(guān)系;

沒法同時(shí)適用于類別變量和數(shù)值變量的關(guān)系計(jì)算,或者計(jì)算得到的分?jǐn)?shù)價(jià)值也不大; 相關(guān)性系數(shù)矩陣是對(duì)稱的,而在許多問題中我們特征變量之間的關(guān)系并不一定是對(duì)稱的;
那么有沒有一種方法可以同時(shí)緩解上面的幾個(gè)問題呢?有的!就是本文介紹的PPS(Predictive Power Score)。

假設(shè)我們有兩個(gè)變量,想要計(jì)算變量預(yù)測(cè)的能力,我們通過下面的方式進(jìn)行計(jì)算:
將變量作為目標(biāo)變量,將作為特征; 使用決策樹進(jìn)行交叉驗(yàn)證,并依據(jù)評(píng)估指標(biāo)計(jì)算得到分?jǐn)?shù)cross_score; 當(dāng)變量為數(shù)值型,我們使用Decision Tree Regressor并計(jì)算MAE); 當(dāng)變量為類別型,我們使用Decision Tree Classifier并計(jì)算weighted F1); 計(jì)算的值作為我們最終的分?jǐn)?shù); 分類問題:final_score = (cross_score - naive_score)/(1-naive_score),這里naive_score是出現(xiàn)最多的類作為最終預(yù)測(cè)結(jié)果計(jì)算得到的分?jǐn)?shù);,使用中位數(shù)作為最終預(yù)測(cè)結(jié)果計(jì)算得到的分?jǐn)?shù); 回歸問題:final_score = 1 - (cross_score / naive_mae),這里naive_score是使用中位數(shù)作為最終預(yù)測(cè)結(jié)果計(jì)算得到的分?jǐn)?shù);

此處我們構(gòu)建一個(gè)二次關(guān)系:特征從-2到2的均勻變量,目標(biāo)是的平方加上一些誤差,perfect是的平方。

import pandas as pd
import numpy as np
# !pip install -U ppscore
import ppscore as pps
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.DataFrame()
df["x"] = np.random.uniform(-2, 2, 1_000_000)
df["error"] = np.random.uniform(-0.5, 0.5, 1_000_000)
df["y"] = df["x"] * df["x"] + df["error"]
df["y_perfect"] = df["x"] * df["x"]
plt.figure(figsize=[10,6])
sns.scatterplot(x = 'x', y ='y', data=df)
<AxesSubplot:xlabel='x', ylabel='y'>1.對(duì)稱性分析
變量的分?jǐn)?shù)是不一樣的,非對(duì)稱的;
pps.score(df, "x", "y")
{'x': 'x',
'y': 'y',
'ppscore': 0.6698987690580689,
'case': 'regression',
'is_valid_score': True,
'metric': 'mean absolute error',
'baseline_score': 1.0177846519084408,
'model_score': 0.3359719664287812,
'model': DecisionTreeRegressor()}
pps.score(df, "y", "x")
{'x': 'y',
'y': 'x',
'ppscore': 0,
'case': 'regression',
'is_valid_score': True,
'metric': 'mean absolute error',
'baseline_score': 1.0030129309668745,
'model_score': 1.0892163726367778,
'model': DecisionTreeRegressor()}
2.可視化
基于PPS的相關(guān)性矩陣

plt.figure(figsize=[10,6])
matrix_df = pps.matrix(df)[['x', 'y', 'ppscore']].pivot(columns='y', index='x', values='ppscore')
sns.heatmap(matrix_df, vmin=0, vmax=1, cmap="Blues", linewidths=0.5, annot=True)
<AxesSubplot:xlabel='y', ylabel='x'>基于Person相關(guān)系數(shù)的相關(guān)性矩陣

plt.figure(figsize=[10,6])
sns.heatmap(df.corr(), vmin=0, vmax=1, cmap="Reds", linewidths=0.5, annot=True)
<AxesSubplot:>3.小結(jié)
從上面的分析我們可以發(fā)現(xiàn):
基于Person相關(guān)系數(shù)的方法完全沒有找到與的潛在關(guān)系; 給予PPS的方法則完美的找到了與以及perfect的關(guān)系。

PPS的方法適用的問題非常多,應(yīng)用的方面也很廣,此處我們將其歸納為下面幾點(diǎn):
數(shù)據(jù)分析:PPS的方式可以表示兩個(gè)數(shù)據(jù)之間的潛在關(guān)系(線性的非線性的),PPS的相關(guān)性圖是非常好的一種可視化的解釋方式; 特征篩選,其特征篩選的方式和Pearson相關(guān)性的方式類似,如果我們變量與標(biāo)簽之間的PPS分?jǐn)?shù)很低的話,那么該特征可能和我們的目標(biāo)變量并不存在任何關(guān)系,包括線性的和非線性的關(guān)系,可以考慮直接刪除處理; 信息泄漏:使用PPS矩陣檢測(cè)變量之間的信息泄漏-信息泄漏是通過其他變量導(dǎo)致的。
當(dāng)然因?yàn)镻PS是基于模型(目前主要是決策樹相關(guān)的模型)計(jì)算得到的,所以它也帶來了一些劣勢(shì):
計(jì)算時(shí)間更高; PPS的分?jǐn)?shù)無法像相關(guān)性那樣容易解釋(線性相關(guān)性的PPS可能為1,二次關(guān)系的PPS也可能為1),所以PPS更適合于發(fā)現(xiàn)模式; 無法用嚴(yán)格的數(shù)學(xué)方法比較不同目標(biāo)變量的得分,它們是使用不同的評(píng)估指標(biāo)計(jì)算得到的; 目前的PPS是基于決策樹為主的模型進(jìn)行計(jì)算的,所以決策樹的劣勢(shì)也會(huì)在PPS計(jì)算中存在;

Predictive Power Score vs Correlation Correlation Vs Predictive Power Score RIP correlation. Introducing the Predictive Power Score https://github.com/8080labs/ppscore
往期精彩回顧
本站qq群851320808,加入微信群請(qǐng)掃碼:
評(píng)論
圖片
表情
