特徵錦囊:怎麼找出數據集中有數據傾斜的特徵?
- 2020 年 2 月 17 日
- 筆記
今日錦囊
特徵錦囊:怎麼找出數據集中有數據傾斜的特徵?
今天我們用的是一個新的數據集,也是在kaggle上的一個比賽,大家可以先去下載一下:

下載地址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data
import pandas as pd import numpy as np # Plots import seaborn as sns import matplotlib.pyplot as plt # 讀取數據集 train = pd.read_csv('./data/house-prices-advanced-regression-techniques/train.csv') train.head() 
我們對數據集進行分析,首先我們可以先看看特徵的分布情況,看下哪些特徵明顯就是有數據傾斜的,然後可以找辦法解決,因此,第一步就是要有辦法找到這些特徵。
首先可以通過可視化的方式,畫箱體圖,然後觀察箱體情況,理論知識是:
在箱線圖中,箱子的中間有一條線,代表了數據的中位數。箱子的上下底,分別是數據的上四分位數(Q3)和下四分位數(Q1),這意味著箱體包含了50%的數據。因此,箱子的高度在一定程度上反映了數據的波動程度。上下邊緣則代表了該組數據的最大值和最小值。有時候箱子外部會有一些點,可以理解為數據中的「異常值」。 而對於數據傾斜的,我們叫做「偏態」,與正態分布相對,指的是非對稱分布的偏斜狀態。在統計學上,眾數和平均數之差可作為分配偏態的指標之一:如平均數大於眾數,稱為正偏態(或右偏態);相反,則稱為負偏態(或左偏態)。
# 丟棄y值 all_features = train.drop(['SalePrice'], axis=1) # 找出所有的數值型變數 numeric_dtypes = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64'] numeric = [] for i in all_features.columns: if all_features[i].dtype in numeric_dtypes: numeric.append(i) # 對所有的數值型變數繪製箱體圖 sns.set_style("white") f, ax = plt.subplots(figsize=(8, 7)) ax.set_xscale("log") ax = sns.boxplot(data=all_features[numeric] , orient="h", palette="Set1") ax.xaxis.grid(False) ax.set(ylabel="Feature names") ax.set(xlabel="Numeric values") ax.set(title="Numeric Distribution of Features") sns.despine(trim=True, left=True) 
可以看出有一些特徵,有一些數據會偏離箱體外,因此屬於數據傾斜。但是,我們從上面的可視化中雖然看出來了,但是想要選出來還是比較麻煩,所以這裡引入一個偏態的概念,相對應的有一個指標skew,這個就是代表偏態的係數。
Skewness:描述數據分布形態的統計量,其描述的是某總體取值分布的對稱性,簡單來說就是數據的不對稱程度。 偏度是三階中心距計算出來的。 (1)Skewness = 0 ,分布形態與正態分布偏度相同。 (2)Skewness > 0 ,正偏差數值較大,為正偏或右偏。長尾巴拖在右邊,數據右端有較多的極端值。 (3)Skewness < 0 ,負偏差數值較大,為負偏或左偏。長尾巴拖在左邊,數據左端有較多的極端值。 (4)數值的絕對值越大,表明數據分布越不對稱,偏斜程度大。
那麼在Python里可以怎麼實現呢?
# 找出明顯偏態的數值型變數 skew_features = all_features[numeric].apply(lambda x: skew(x)).sort_values(ascending=False) high_skew = skew_features[skew_features > 0.5] skew_index = high_skew.index print("本數據集中有 {} 個數值型變數的 Skew > 0.5 :".format(high_skew.shape[0])) skewness = pd.DataFrame({'Skew' :high_skew}) skew_features.head(10) 
好了,今天的內容就這樣子吧!有什麼疑問的可以留言諮詢哈。

