【068】特征选择之 pearson 皮尔森系数 PimaIndiansdiabetes

内容目录

一、pearson 皮尔森系数介绍二、pearson 皮尔森应用三、对皮尔森相关系数的通俗解

一、pearson 皮尔森系数介绍

        皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。

  Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的 pearsonr 方法能够同时计算 相关系数 和p-value。

优点:可以通过数字对变量的关系进行度量,并且带有方向性,1表示正相关,-1表示负相关,可以对变量关系的强弱进行度量,越靠近0相关性越弱。

缺点:无法利用这种关系对数据进行预测,简单的说就是没有对变量间的关系进行提炼和固化,形成模型。要利用变量间的关系进行预测,需要使用到下一种相关分析方法,回归分析。

使用场景:当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:

  • 两个变量之间是线性关系,都是连续数据。

  • 两个变量的总体是正态分布,或接近正态的单峰分布。

  • 两个变量的观测值是成对的,每对观测值之间相互独立。

        相关系数也可以看成两个变量X、Y之间的协方差乘积和两者标准差乘积的比值:一种剔除了两个变量量纲影响、标准化后的特殊协方差

二、pearson 皮尔森应用

# numpy和panda用于数据操作
import numpy as np
import pandas as pd
df = pd.read_csv('.\PimaIndiansdiabetes.csv')
df.head()
   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  DiabetesPedigreeFunction  Age  Outcome
0            6      148             72             35        0  33.6                     0.627   50        1
1            1       85             66             29        0  26.6                     0.351   31        0
2            8      183             64              0        0  23.3                     0.672   32        1
3            1       89             66             23       94  28.1                     0.167   21        0
4            0      137             40             35      168  43.1                     2.288   33        1
df.describe()
       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin         BMI  DiabetesPedigreeFunction         Age     Outcome
count   768.000000  768.000000     768.000000     768.000000  768.000000  768.000000                768.000000  768.000000  768.000000
mean      3.845052  120.894531      69.105469      20.536458   79.799479   31.992578                  0.471876   33.240885    0.348958
std       3.369578   31.972618      19.355807      15.952218  115.244002    7.884160                  0.331329   11.760232    0.476951
min       0.000000    0.000000       0.000000       0.000000    0.000000    0.000000                  0.078000   21.000000    0.000000
25%       1.000000   99.000000      62.000000       0.000000    0.000000   27.300000                  0.243750   24.000000    0.000000
50%       3.000000  117.000000      72.000000      23.000000   30.500000   32.000000                  0.372500   29.000000    0.000000
75%       6.000000  140.250000      80.000000      32.000000  127.250000   36.600000                  0.626250   41.000000    1.000000
max      17.000000  199.000000     122.000000      99.000000  846.000000   67.100000                  2.420000   81.000000    1.000000


        共768例,8个特征,1个标签。最低血糖、血压、皮肤厚度、胰岛素、BMI均为0。这看起来是可疑的,因为这些物理量不可能是0(对于活人)。因此,这已经告诉我们,我们需要对这五列进行估算。其他变量的范围似乎都是合理的。

    可视化:我们可以从配对图开始,配对图中所有变量都相互对应。这对于发现变量之间的相关性和可视化分布非常有用。

import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('fivethirtyeight')
sns.pairplot(df, hue = 'Outcome', vars = df.columns[:8], diag_kind = 'kde')
plt.show()

        唯一明确的趋势似乎是,较高的血糖与1的结果相关,这意味着患者患有糖尿病。年龄似乎也与糖尿病有关:较年轻的患者患糖尿病的风险较低。

输入缺失值:在继续之前,让我们先来处理一下这些缺失的值。同样,在血糖、血压、皮肤厚度、胰岛素和BMI分类中也有0。这些值都不可能是0,所以我们假设缺失的值是由于缺少数据。为了填充这些缺失的值,我们将用列中的中值替换它们。还有其他更复杂的方法来填补缺失的值,但在实践中,中值估算通常表现良好。

df['Glucose'] = df['Glucose'].replace({0: df['Glucose'].median()})
df['BloodPressure'] = df['BloodPressure'].replace({0: df['BloodPressure'].median()})
df['SkinThickness'] = df['SkinThickness'].replace({0: df['SkinThickness'].median()})
df['Insulin'] = df['Insulin'].replace({0: df['Insulin'].median()})
df['BMI'] = df['BMI'].replace({0: df['BMI'].median()})
df.describe()
       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin         BMI  DiabetesPedigreeFunction         Age     Outcome
count   768.000000  768.000000     768.000000     768.000000  768.000000  768.000000                768.000000  768.000000  768.000000
mean      3.845052  121.656250      72.386719      27.334635   94.652344   32.450911                  0.471876   33.240885    0.348958
std       3.369578   30.438286      12.096642       9.229014  105.547598    6.875366                  0.331329   11.760232    0.476951
min       0.000000   44.000000      24.000000       7.000000   14.000000   18.200000                  0.078000   21.000000    0.000000
25%       1.000000   99.750000      64.000000      23.000000   30.500000   27.500000                  0.243750   24.000000    0.000000
50%       3.000000  117.000000      72.000000      23.000000   31.250000   32.000000                  0.372500   29.000000    0.000000
75%       6.000000  140.250000      80.000000      32.000000  127.250000   36.600000                  0.626250   41.000000    1.000000
max      17.000000  199.000000     122.000000      99.000000  846.000000   67.100000                  2.420000   81.000000    1.000000


    既然没有缺失值,我们就可以计算相关值来查看特性与结果之间的关系。当然,相关性并不意味着因果关系,但因为我们正在建立一个线性模型,相关特征可能对学习患者信息与他们是否患有糖尿病之间的映射很有用。在具有大量特征的问题中,我们可以使用相关阈值来删除变量。在这种情况下,我们可能希望保留所有的变量,让模型来决定哪些是相关的。

  • 皮尔森(pearson)相关系数和斯皮尔曼(spearman)相关系数肯德尔(kendall)相关系数,这三大相关系数中,spearman和kendall属于等级相关系数亦称为“秩相关系数”,是反映等级相关程度的统计分析指标。

  • 公式定义为:两个连续变量(X,Y)的pearson相关性系数(Px,y)等于它们之间的协方差cov(X,Y)除以它们各自标准差的乘积(σX,σY)。

  • 系数的取值总是在-1.0到1.0之间,接近0的变量被成为无相关性,接近1或者-1被称为具有强相关性。

  • 皮尔森相关系数是衡量线性关联性的程度,p的一个几何解释是其代表两个变量的取值根据均值集中后构成的向量之间夹角的余弦。

df.corr()['Outcome']
Pregnancies                 0.221898
Glucose                     0.492782
BloodPressure               0.165723
SkinThickness               0.189065
Insulin                     0.148457
BMI                         0.312249
DiabetesPedigreeFunction    0.173844
Age                         0.238356
Outcome                     1.000000
Name: Outcome, dtype: float64


        我们对这些图的最初解释是正确的:葡萄糖是与结果相关的最高值。没有一个特征与结果有很强的相关性,也没有负相关。

    在这个简短的探索性数据分析中,我们了解了关于数据集可以用于建模的两个主要方面。首先,我们需要在几个列中输入缺失的值,因为这些值在物理上是不可能的。我们可以使用中值法作为一种简单而有效的填充0值的方法。我们还了解到,特征和响应之间存在相关性,尽管相关性不强。此外,所有的特征至少与结果有轻微的正相关(无论患者是否患有糖尿病)。没有明显的特性工程步骤,也没有必要减少维度的数量,因为只有8个特性。此外,像主成分分析这样的技术模糊了特性的物理相关性,因此我们不能解释模型。总的来说,我想让模型从所有的数据中学习,从而保留所有的特性。通过这种方式,我们可以让数据说话并解释建模结果。

from scipy.stats import pearsonr
import numpy as np
np.set_printoptions(suppress=False)

a = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']
b = {}
for i in a:
    # c,d  = pearsonr(df['Age'],df['Outcome'])
    b[i] = pearsonr(df[i],df['Outcome'])
print(b)
{'Pregnancies': (0.22189815303398652, 5.065127298051825e-10), 
'Glucose': (0.49278240391502626, 3.1287190418421105e-48), 
'BloodPressure': (0.16572291308057635, 3.890835490646442e-06), 
'SkinThickness': (0.18906541957539405, 1.3011814339566044e-07), 
'Insulin': (0.14845723810682138, 3.6217221617810545e-05), 
'BMI': (0.3122490266732709, 7.8791476215668415e-19), 
'DiabetesPedigreeFunction': (0.1738440656529598, 1.2546070101484021e-06), 
'Age': (0.2383559830271976, 2.2099754606646917e-11), 
'Outcome': (0.9999999999999978, 0.0)}
  • 一般来说皮尔森相关系数越大,p_value越小,线性相关性就越大。但是,p_value不是完全的可靠,当数据量大于500的时候,可能是合理的。

  • 相关系数矩阵,即给出任意两特征之间的相关系数

  • Pearson相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性数据便会有误差。 

三、对皮尔森相关系数的通俗解释

对皮尔森相关系数的通俗解释

  • 对于协方差,可以通俗的理解为:两个变量在变化过程中是同方向变化?还是反方向变化?同向或反向程度如何?

  • 你变大,同时我也变大,说明两个变量是同向变化的,这时协方差就是正的。

  • 你变大,同时我变小,说明两个变量是反向变化的,这时协方差就是负的。

  • 从数值来看,协方差的数值越大,两个变量同向程度也就越大。反之亦然。

About Me:小婷儿

● 本文作者:小婷儿,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:https://blog.csdn.net/u010986753

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 微信:tinghai87605025 联系我加微信群

● QQ:87605025

● QQ交流群py_data :483766429

● 公众号:python宝 或 DB宝

● 提供OCP、OCM和高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

如果你觉得到文章对您有帮助,欢迎赞赏哦!有您的支持,小婷儿一定会越来越好!

  • 10
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值