机器学习EDA探索性数据分析(三)-目标预测值初探

在数据的探索性分析中,首先是查看数据的概览情况, 对整体有个了解,如数据的缺失比例,重复数据数量,异常值等,然后重点分析每个特征变量的分布,以及变量之间的相关性等,这些是EDA的常规操作。还有一种数据探索是在机器学习的预测和一些数据分析活动中需要针对预测值,即目标变量进行针对性的分析,来事先了解预测值的特点,分布情况等以此作为参考来设计后续的特征工程,选择合适的预测模型等,甚至需要针对预测值的分布特点进行数据的变换以改变其分布情况来适应特定的预测模型。

探索性数据分析的几种类型

◾ 数据概览,数据预处理

◾ 探索分析每个变量分布和特点

探索每个自变量和因变量的关系

◾ 探索每个自变量之间的相关性

◾ 从不同的维度分析数据

实战案例

汽车交易价格预测

下面以此案例探索预测值的变量分析。

目标预测值 price

1.预测值的分布

总体分布(当试验次数无限增大时,试验结果的频率值就成为相应的概率,除了抽样造成的误差,精确地反映了总体取值的概率分布规律,这种整体取值的概率分布规律通常称为总体分布。):

import scipy.stats as st
y = Train_data['price']
plt.figure(1); plt.title('price')
sns.distplot(y, kde=False)


用几种概率类型进行拟合:

指数分布(st.expon):

plt.figure(1); plt.title('expon')
sns.distplot(y, kde=False, fit=st.expon)


正态分布(st.norm):


beta分布(st.beta):


无界约翰逊分布(st.johnsonsu):


观察上面几种拟合图像,可以看出指数分布、beta分布、无界约翰逊分布的拟合很出色,其中无界约翰逊分布的拟合最好。

预测值的正态转化:

大部分数据分析都希望原始数据是满足正态分布的定距变量,所以在回归之前我们最好对不满足正态分布的price进行转换,使得price尽量拟合上面的正态分布。

正态转化有四个步骤:

1.计算数据的分布状况及两个参数:偏度(Skewness)和峰度(Kurtosis)。

2.根据变量的分布形状和参数,决定是否转换

3.如果需要做正态转换,根据变量的分布形状,确定相应的转换公式

4.再次检验转换后的变量的分布形状,如果没有解决问题,或者甚至恶化,就需要再从第二步或第三步做起,然后再回到第一步的检验,直到拿到令人满意的结果。

对正态分布的观察包括两个指标: 偏度和峰度

skewness(偏态/偏峰)

正偏态分布(positive skewness distribution)是指频数分布的高峰偏于左侧,偏态系数为正值的频数分布形态。偏态分布分为正偏态和负偏态。**当均值大于众数时称为正偏态;当均值小于众数时称为负偏态。**偏态衡量的是数据的不对称程度。

kurtosis(峰度)

峰度(peakedness;kurtosis)又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度。样本的峰度是和正态分布相比较而言统计量,如果峰度大于三,峰的形状比较尖,比正态分布峰要陡峭。反之亦然. 峰度衡量的是数据的尖锐程度。

一般地:正态分布的峰度(系数)为常数3,均匀分布的峰度(系数)为常数1.8(也有说法kurtosis>0 表示与正态分布相比的尖峰, 经验证标准正态分布(0,1)峰度接近0)。

print("Skewness: %f" % Train_data['price'].skew())
print("Kurtosis: %f" % Train_data['price'].kurt())
# 标准正态分布峰值验证
a = np.random.normal(0, 1, 1000)
ans = pd.Series(a)
ans.kurt()

预测值分布(适用于分类和回归问题), 如果预测值不服从正态分布, 一般取对数:

import scipy.stats as st
y = Train_data['price']
plt.figure(1); plt.title('Johnson SU')
sns.distplot(y, kde=False, fit=st.johnsonsu)  # 界约翰逊分布
plt.figure(2); plt.title('Normal')
sns.distplot(y, kde=False, fit=st.norm)
plt.figure(3); plt.title('Log Normal')
sns.distplot(y, kde=False, fit=st.lognorm)

查看price的频数

plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()


可以看到大于20000的值极少,可以作为不正常值忽略。

log变换price之后的分布较均匀,可以进行log变换进行预测,这也是预测问题常用的trick

plt.hist(np.log(Train_data['price']), orientation = 'vertical',histtype = 'bar', color ='red') 
plt.show()


2.相关性分析

首先分离预测值:

Y_train = Train_data['price']

分离出数字特征和类型特征:

numeric_features = ['power', 'kilometer', 'bore', 'stroke', 'peak-rpm', 'horsepower', 'num-of-doors','compression-ratio','city-mpg','highway-mpg']
categorical_features = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionCode',]

相关性计算:

cormatrix = data.corr()
# cormatrix #查看结果

#不同的展现格式
cormatrix *= np.tri(*cormatrix.values.shape, k=-1).T  #返回函数的上三角矩阵,把对角线上的置0,让他们不是最高的。
cormatrix = cormatrix.stack() #某一指标与其他指标的关系

# 找出前十个最相关的特征
cormatrix = cormatrix.reindex(cormatrix.abs().sort_values(ascending=False).index).reset_index()
cormatrix.columns = ["FirstVariable", "SecondVariable", "Correlation"]
cormatrix.head(10)  

data['volume'] = data.length * data.width * data.height

data.drop(['width', 'length', 'height', 
           'curb-weight', 'city-mpg'], 
          axis = 1, # 1 for columns
          inplace = True) 

热力图

# Compute the correlation matrix 
corr_all = data.corr()

# Generate a mask for the upper triangle
mask = np.zeros_like(corr_all, dtype = np.bool)
mask[np.triu_indices_from(mask)] = True

# Set up the matplotlib figure
f, ax = plt.subplots(figsize = (11, 9))

# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr_all, mask = mask,
            square = True, linewidths = .5, ax = ax, cmap = "BuPu")      
plt.show()

看起来 price 跟这几个的相关程度比较大 wheel-base,enginine-size, bore,horsepower.

3.展示相关变量的具体指标情况

固定 fuel-type列,画散点图,分类观测所有变量间的相关性。

# 绘制矩阵图
sns.pairplot(data, hue='fuel-type', palette='husl')
# sns.pairplot(data, hue = 'fuel-type', palette = 'plasma')

对数值型字段,分别和price目标字段进行绘图详细分析

for col in df.columns: 
    if df[col].dtypes != 'object':
        sns.lmplot(data = df, x = col, y = 'price')

我们把一些与价格相关性低(r<0.15)的字段删除掉:

df.drop(['car_ID'], axis = 1, inplace = True) 
to_drop = ['peak-rpm', 'compression-ratio', 'stroke', 'symboling']
df.drop(df[to_drop], axis = 1, inplace = True)

4.针对性的回归分析

从上面热力图中,得出价格price和另外几个变量之间相关性很大。因此,接下来使用IMplot 进一步查看两个因素之间的关系。 lmplot对所选数据集进行了一元线性回归,拟合出了一条最佳的直线。

print('fuel_type:', data['fuel-type'].unique(), '
doors:', data['num-of-doors'].unique())

fuel_type:['gas','diesel']

doors:['two','four']

sns.lmplot('price', 'horsepower', data, 
           hue = 'fuel-type', col = 'fuel-type',  row = 'num-of-doors', 
           palette = 'plasma', 
           fit_reg = True);

5.类别特征和预测值price的分布

通过类别特征箱形图可视化

categorical_features = [
 'brand',
 'bodyType',
 'fuelType',
 'gearbox']
for c in categorical_features:
    Train_data[c] = Train_data[c].astype('category')
    if Train_data[c].isnull().any():
        Train_data[c] = Train_data[c].cat.add_categories(['MISSING'])
        Train_data[c] = Train_data[c].fillna('MISSING')

def boxplot(x, y, **kwargs):
    sns.boxplot(x=x, y=y)
    x=plt.xticks(rotation=90)

f = pd.melt(Train_data, id_vars=['price'], value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False, size=5)
g = g.map(boxplot, "value", "price")

后记

到这里,对于探索性数据分析的三块简要介绍就结束了。后续我们会针对具体的模块再进行讲解和介绍,如假设检验,方差分析再到销量预测的其它环节等。对于任意基于数据的项目,最重要的第一步都是查看数据,这正是探索性数据分析的关键理念所在。通过总结并可视化数据,我们可以对项目获得有价值的洞悉和理解。从数据概览和单变量分析,到探索多个变量之间的关系,再到探索变量和目标预测值之间的关系,我们可以借助各种技术和工具并结合python这样的语言强大的表达能力来建立丰富多样的数据探索和分析方式。

在最后,希望本文能够帮助到阅读的各位,也请大家多多关注,后续会介绍更多有关数据科学和机器学习预测的内容以及使用python等语言进行数据分析的方法。

展开阅读全文

页面更新:2024-04-24

标签:约翰逊   正态分布   数据   相关性   系数   概率   变量   特征   机器   目标   两个   关系

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top