特征锦囊:怎么找出数据集中有数据倾斜的特征?

  • 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)  

好了,今天的内容就这样子吧!有什么疑问的可以留言咨询哈。