特徵工程之特徵關聯
- 2019 年 10 月 6 日
- 筆記
特徵工程之特徵關聯
0.說在前面
1.皮爾遜
2.pointbiserialr係數
3.Spearman's 係數
4.總結
5.作者的話
0.說在前面
昨天學習了seaborn
繪製圖形,以及單變數與多變數之間的繪圖,那麼今天從統計學角度實戰分析在處理特徵工程過程中所涉及的三個相關係數(具體的三個係數數學推導,在後續更新)。
為了更好的便於大家的交流,先建立一個微信總群,二維碼在文章最後放出!
【關鍵字】
- 相關係數
- 微信總群
1.皮爾遜
皮爾遜相關係數:Pearson correlation coefficient,通常用r或是ρ表示,是用來度量兩個變數X和Y之間的相互關係的,取值範圍在[-1,+1]之間。Pearson相關係數(相關係數的絕對值越大,相關性越強:相關係數越接近於1或-1,相關度越強,相關係數越接近於0,相關度越弱)。
下面我們來實戰一下如何求Pearson係數!
【導包】
import warnings warnings.filterwarnings('ignore')#忽略一些警告 import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # jupter內部使用 %matplotlib inline
【數據】
從網上選取如下幾行數據,每列的欄位意思如下:
- 第一列「銷售日期」(date)
- 第二列「銷售價格」(price):房屋交易價格,單位為美元,是目標預測值;
- 第三列「卧室數」(bedrooms):房屋中的卧室數目;
- 第四列「浴室數」(bathrooms):房屋中的浴室數目;
- 第五列「房屋面積」(sqft_living):房屋裡的生活面積;
- 第六列「停車面積」(sqft_lot):停車坪的面積;
- 第七列「樓層數」(floors):房屋的樓層數;
- 第八列「房屋評分」(grade):King County房屋評分系統對房屋的總體評分;
- 第九列「建築面積」(sqft_above):除了地下室之外的房屋建築面積;
- 第十列「地下室面積」(sqft_basement):地下室的面積;
- 第十一列「建築年份」(yr_built):房屋建成的年份;
- 第十二列「修復年份」(yr_renovated):房屋上次修復的年份;
- 第十三列"緯度"(lat):房屋所在緯度;
- 第十四列「經度」(long):房屋所在經度。
【讀取數據】
由於原數據沒有列欄位名,那麼我們這裡通過pandas讀取原數據,在name處設置每列的參數,那麼我們便可以對每一列方便的操作!
# 讀取數據 columns = ['date', 'price', 'bedrooms', 'bathrooms', 'sqft_living', 'sqft_lot', 'floors', 'grade', 'sqft_above', 'sqft_basement', 'yr_built', 'yr_renovated', 'lat', 'long'] kc_train = pd.read_csv('./data/kc_train.csv', names=columns)
在這裡,我們看到了每一列的數據直方分布圖,為什麼要繪製圖?
我們在這裡繪製圖形的目的是,查看數據的離散程度,判定數據是連續性,還是離散的,還是二分類等。
在這裡吧,我們可以注意到以下幾種特徵都是連續變數:
lat long sqft_above sqft_basement sqft_living sqft_lot yr_built yr_renovated
針對連續變數,我們在做特徵工程時,需要做的便是皮爾遜係數分析!
【皮爾遜係數】
- 封裝上述的連續變數為list數組
- 遍歷循環,繪製每個散點圖
continuous_cols = ['sqft_living', 'sqft_lot', 'sqft_above', 'sqft_basement', 'yr_built', 'yr_renovated', 'lat', 'long'] # alpa表示散點透明度,size表示圖的大小 for col in continuous_cols: sns.jointplot(x=col, y="price", data=kc_train, alpha=0.3, size=5)
由於運行的結果眾多,這裡拿一個說明,如上圖所示,pearsonr係數為0.7,說明與price的關聯程度很強,那麼在提取特徵時,就得著重關注!
【pearson係數排序】
首先我們來獲取關聯矩陣,從矩陣中抽取相關資訊
這裡使用corr()
方法,該方法有三個係數可以選擇,分別是'pearson』, 『kendall』, 『spearman』
。默認為pearson
plt.figure(figsize=(12,6)) # kc_train.corr()列印的是所有的列之間的一個對稱矩陣相關關係 # method : {『pearson』, 『kendall』, 『spearman』} kc_train.corr()
從大到小排序提取出上述定義的continuous_cols相關列與price的關聯程度
# 從大到小排序提取出上述定義的continuous_cols相關列與price的關聯程度 # continuous_cols前面定義了,看前面,提取與price行,特定v列的數據,並降序排序 degree_data = kc_train.corr()['price'][continuous_cols].sort_values(ascending=False) degree_data.plot.barh(figsize=(12,6),title='Variable Correlation with Price')
到這裡,連續數據關聯程度分析完畢!
2.pointbiserialr係數
我們現在回頭看一下yr_renovated,sqft_basement,發現有很多的0數據,那麼我們可以考慮將這兩列建立二分類數據,分別代表的是是否翻新,是否有地下室。
【數據轉化】
0數據不動,非0為1
kc_train['basement_present'] = kc_train['sqft_basement'].apply(lambda x: 1 if x > 0 else 0) kc_train['renovated'] = kc_train['yr_renovated'].apply(lambda x: 1 if x > 0 else 0)
對於上面構建的sqft_basement、yr_renovated都是屬於分類變數(categorical variable),我們可以使用點二列相關係數來計算兩個變數之間的關係!
【兩列相關係數】
# 二列相關係數來計算兩個變數之間的關係 from scipy.stats import pointbiserialr # 繪製箱形圖 plt.figure(figsize=(12, 4)) sns.boxplot(y='renovated', x='price', data=kc_train, orient='h') plt.show() # 計算點二列相關係數 r, p = pointbiserialr(kc_train['renovated'], kc_train['price']) print ('renovated 與 price 的點二列相關係數中 r = %s,p = %s' %(r, p)) r, p = pointbiserialr(kc_train['basement_present'], kc_train['price']) print ('basement_present 與 price 的點二列相關係數中 r = %s,p = %s' %(r, p))
可以看出來:
- 沒有翻新過的箱形圖比較窄,這表明整體而言這組房價非常接近
- 有無翻新對於房價高低沒有太大的影響,一般而言翻新後房價可能會高一點
- renovated、basement_present和price變數之間的相關性都較小
3.Spearman's 係數
各個順序變數(ordinal variable)和price之間的關係,可以用斯皮爾曼等級相關係數(Spearman's rank-order correlation)來計算相關性。
順序變數可以理解為等級變數
對於上述幾個變數分析,我們知道順序變數為bedrooms,bathrooms,grade!
plt.figure(figsize=(12, 10)) plt.subplot(311) sns.boxplot(y='bedrooms', x='price', data=kc_train, orient='h') plt.subplot(312) sns.boxplot(y='bathrooms', x='price', data=kc_train, orient='h') plt.subplot(313) sns.boxplot(y='grade', x='price', data=kc_train, orient='h') plt.show()
from scipy.stats import spearmanr r, p = spearmanr(kc_train['floors'], kc_train['price']) print ('floors 和 price 斯皮爾曼相關係數為 %s,其中 p = %s' %(r,p)) r, p = spearmanr(kc_train['bedrooms'], kc_train['price']) print ('bedrooms 和 price 斯皮爾曼相關係數為 %s,其中 p = %s' %(r,p)) r, p = spearmanr(kc_train['bathrooms'], kc_train['price']) print ('bathrooms 和 price 斯皮爾曼相關係數為 %s,其中 p = %s' %(r,p)) r, p = spearmanr(kc_train['grade'], kc_train['price']) print ('grade 和 price 斯皮爾曼相關係數為 %s,其中 p = %s' %(r,p))
輸出
floors 和 price 斯皮爾曼相關係數為 0.3127190036471108,其中 p = 9.586333125228778e-226 bedrooms 和 price 斯皮爾曼相關係數為 0.3458697748314727,其中 p = 5.6801269872902106e-279 bathrooms 和 price 斯皮爾曼相關係數為 0.5012034892956143,其中 p = 0.0 grade 和 price 斯皮爾曼相關係數為 0.6603554146361819,其中 p = 0.0
4.總結
結論1:
- 連續變數中sqft_living、sqft_above、sqft_basement與price之間存在極強的相關關係
- 二元變數basement_present、renovated與price之間存在一定的相關關係,但是關聯度較小
- 幾個順序變數(floors、bedrooms、bathrooms、grade)都與price之間存在相關關係
結論2:
首先拿到數據看看是什麼類型的數據,滿足哪種相關的條件
Pearson相關條件:
1.x y都是連續變數
2.雙變數正態分布
3.各觀測值相互獨立,並且根據因變數y和自變數x所做的散點圖要服從線性趨勢。
Spearman相關條件:
1.xy不服從雙變數正態分布
2.總體分布類型未知
3.數據本身有不確定值
4.等級資料。
Pearson Vs Spearman
1.連續數據,正態分布,線性關係,用pearson相關係數是最恰當,當然用spearman相關係數也可以,就是效率沒有pearson相關係數高。
2.上述任一條件不滿足,就用spearman相關係數,不能用pearson相關係數。
3.兩個定序測量數據之間也用spearman相關係數,不能用pearson相關係數。
pointbiserialr相關條件:
數據必須是二分類!
5.作者的話
最後,您如果覺得本公眾號對您有幫助,歡迎您多多支援,轉發,謝謝!
更多內容,請關注本公眾號機器學習系列!