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

今日锦囊

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

今天我们用的是一个新的数据集,也是在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)

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

往 期 锦 囊

特征锦囊:特征无量纲化的常见操作方法

特征锦囊:怎么进行多项式or对数的数据变换?

特征锦囊:常用的统计图在Python里怎么画?

特征锦囊:怎么去除DataFrame里的缺失值?

特征锦囊:怎么把被错误填充的缺失值还原?

特征锦囊:怎么定义一个方法去填充分类变量的空值?

特征锦囊:怎么定义一个方法去填充数值变量的空值?

特征锦囊:怎么把几个图表一起在同一张图上显示?

特征锦囊:怎么把画出堆积图来看占比关系?

特征锦囊:怎么对满足某种条件的变量修改其变量值?

特征锦囊:怎么通过正则提取字符串里的指定内容?

特征锦囊:如何利用字典批量修改变量值?

特征锦囊:如何对类别变量进行独热编码?

特征锦囊:如何把“年龄”字段按照我们的阈值分段?

特征锦囊:如何使用sklearn的多项式来衍生更多的变量?

特征锦囊:如何根据变量相关性画出热力图?

特征锦囊:如何把分布修正为类正态分布?

原创不易,如果觉得这种学习方式有用,希望可以帮忙随手转发or点下“在看”,这是对我的极大鼓励!阿里嘎多!????

发布了160 篇原创文章 · 获赞 5 · 访问量 9631
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览