去除多重共线性的5种方法,你学废了嘛?

这篇具有很好参考价值的文章主要介绍了去除多重共线性的5种方法,你学废了嘛?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是多重共线性呢?

就是回归模型多个特征之间具有很强的相关性。

多重共线性,听起来很就很严重,其实没有很大的危害,只是容易过拟合,或者导致模型无法解释。尤其是在实际项目中,我们需要解释模型的特征对目标变量的影响时,最好要消除多重共线性。

本文就说说怎么去除多重共线性,这里随手找到一份数据,是“快乐星球指数”,显示不同国家国民的幸福指数。

选取的特征有多个维度:寿命,福利,生态碳足迹,GDP,人口等,假如我们需要预测HappyPlanetIndex,而且模型需要可解释,那么怎么选择特征呢?

这里列出5种方法去除共线性特征:

本文技术工具来自技术群小伙伴的分享,想加入按照如下方式

目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式①、添加微信号:dkl88191,备注:来自CSDN+技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群+CSDN

file ='data/hpi.csv'
df = pd.read_csv(file)
feature_cols= ['AverageLifeExpectancy','AverageWellBeing','HappyLifeYears','Footprint','InequalityOfOutcomes','InequalityAdjustedLifeExpectancy','InequalityAdjustedWellbeing','GDPPerCapita','Population','HappyPlanetIndex']
num_df = df[feature_cols]

定性分析

该方法用于定性分析,画出散点图,可以直观的看到每两个特征对的相关性。

如果出现一条完美线性直线,那就保留一个特征即可。

如果相关性太强,也可以只保留一个。

g= sns.pairplot(num_df)

去除多重共线性的5种方法,你学废了嘛?

相关系数热力图

这里就是定量分析了,我们可以设定一个阈值,比如0.6。

当相关系数的绝对值大于这个阈值的时候,我们就认定为多重共线性,可以多选一。

fig, ax = plt.subplots(figsize=(10,10)) 
heatmap = sns.heatmap(num_df.corr(), vmin=-1, vmax=1, annot=True,ax=ax)

去除多重共线性的5种方法,你学废了嘛?

方差膨胀系数VIF

方差膨胀系数(variance inflation factor,VIF)是衡量多元线性回归模型中复 (多重)共线性严重程度的一种度量。它表示回归系数估计量的方差与假设自变量间不线性相关时方差相比的比值。怎么计算呢?假如我们有5个特征,我们可以用其中的4个特征,去拟合最后一个特征,如果拟合的效果越好(r方越接近100%),那么说明这4个特征里面有“近亲”。

1/(1- R2)就是VIF。

  • 经验值来看,VIF大于1小于5,一般可以人为没有多重共线性问题。

  • 如果是大于5,小于10,勉强接受。

  • 如果大于10,那就要考虑删除一些特征了。

可以直接调用statsmodels模块里面的variance_inflation_factor函数直接计算VIF.

但是这个VIF计算会有bug,因为statsmodels的线性回归算法默认不包含截距信息(intercept),从而导致VIF计算偏大。

所以建议采用修正版的计算公式,这里我写了两个版本,一个是基于sklearn的,一个是基于statsmodels的。

def variance_inflation_factor_sm_corr(exog, exog_idx):
    k_vars = exog.shape[1]
    exog = np.asarray(exog)
    x_i = exog[:, exog_idx]
    mask = np.arange(k_vars) != exog_idx
    x_noti = exog[:, mask]
    r_squared_i = OLS(x_i, sm.add_constant(x_noti)).fit().rsquared
    vif = 1. / (1. - r_squared_i)
    return vif


def variance_inflation_factor_sklearn(exog, exog_idx):
    k_vars = exog.shape[1]
    exog = np.asarray(exog)
    x_i = exog[:, exog_idx]
    mask = np.arange(k_vars) != exog_idx
    x_noti = exog[:, mask]
    r_squared_i = LinearRegression(fit_intercept=True).fit(x_noti, x_i).score(x_noti, x_i)
    vif = 1. / (1. - r_squared_i)
    return vif




def calc_vif(df,method='all'):    
    vif_data = pd.DataFrame()
    vif_data["feature"] = df.columns

    if method == 'sm_corr':
        vif_data["VIF"] = [variance_inflation_factor_sm_corr(df.values, i)
                              for i in range(len(df.columns))]
    elif method == 'sklearn':
        vif_data["VIF"] = [variance_inflation_factor_sklearn(df.values, i)
                              for i in range(len(df.columns))]
    elif method == 'sm':
        vif_data["VIF"] = [variance_inflation_factor(df.values, i)
                              for i in range(len(df.columns))]
    else:
        vif_data["VIF_sm_corr"] = [variance_inflation_factor_sm_corr(df.values, i)
                              for i in range(len(df.columns))]
        vif_data["VIF_sklearn"] = [variance_inflation_factor_sklearn(df.values, i)
                              for i in range(len(df.columns))]
        vif_data["VIF_sm"] = [variance_inflation_factor(df.values, i)
                              for i in range(len(df.columns))]

    return vif_data
calc_vif(num_df,method='all')

去除多重共线性的5种方法,你学废了嘛?

PCA分析

有一种消除多重共线性的方法是采用PCA分析,但是缺点也是明显了,PCA得到的已经不是原有的特征了,更不利于模型的解释。

pca = PCA(n_components=4)
pca.fit(sel_df)
percent_var_explained = pca.explained_variance_/(np.sum(pca.explained_variance_))
cumm_var_explained = np.cumsum(percent_var_explained)

基于相关系数的迭代法

这个思路很简单,就是基于相关系数,优先选取最小的一对特征,然后去除和它们相关的特征,直至筛选完所有的特征。这里我写了一个函数,用于迭代。

def get_best_feature_couple(df,threshold=0.8):
    corr_matrix = df.corr().abs()
    best_couple = df.corr().abs().stack().idxmin()
    best_value = df.corr().abs().min().min()
  
    if best_value <threshold:
        high_corr_col = []
        for i in best_couple:
            c = corr_matrix[i]
            high_corr_col += list(c[c>threshold].index)
    else:
        best_couple = []
        high_corr_col = []
    low_corr_col = [i for i in df.columns if i not in high_corr_col]
    return best_couple,low_corr_col

def feature_selection_by_corr(df,corr_threshold=0.4):
    mask = []
    while True:
        best_couple,low_corr_col = get_best_feature_couple(df,threshold=corr_threshold)
        if len(best_couple) > 0:
            mask += best_couple
        if len(low_corr_col) >=2:
            df = df[low_corr_col]
        elif len(low_corr_col) ==1:
            mask += low_corr_col
            break
        else:
            break
    return mask

去除多重共线性的5种方法,你学废了嘛?

feature_cols = feature_selection_by_corr(num_df,corr_threshold=0.8)
fig, ax = plt.subplots(figsize=(10,10)) 
heatmap = sns.heatmap(num_df[feature_cols].corr(), vmin=-1, vmax=1, annot=True,ax=ax)

总结

以上就是对共线性特征筛选的5种方法,学会了吗?文章来源地址https://www.toymoban.com/news/detail-481012.html

到了这里,关于去除多重共线性的5种方法,你学废了嘛?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 谈多重共线性

    本文主要讨论古典假定中无多重共线性被违反的情况,主要情况包括多重共线性的实质和产生的原因、后果、检验方法及无多重共线性假定违反后的处置方法。 讨论多元线性回归模型的估计时,强调了假定无多重共线性,即假定各解释变量之间不存在线性关系,或者说各解释

    2024年02月11日
    浏览(30)
  • 手把手教你做多重线性逐步回归

    1.1 案例背景介绍 某研究收集到美国50个州关于犯罪率的一组数据,包括人口、面积、收入、文盲率、高中毕业率、霜冻天数、犯罪率共7个指标,现在我们想考察一下州犯罪率和哪些指标有关。数据上传SPSSAU后,在 “我的数据”中查看浏览原始数据,前5行数据如下: 图1 “我

    2024年02月05日
    浏览(144)
  • 回归模型中的多重共线性 + 危害 + 原因 + 判断标准 + 解决办法,回归系数

             多重共线性 是指 线性回归模型 中的解释变量之间由于存在精确或高度 相关关系 。         例如:某个回归模型包含2个变量, 年龄 和 工作经验年数 ,常识可知年龄越大,工作经验年数越大,两个变量可能存在 高度关联 ,因此模型中可能存在 多重共线性 。

    2024年02月11日
    浏览(43)
  • 无人机影像配准并发布(共线方程)

    无人机影像 + DEM 计算四个角点坐标(刚性变换) 像空间坐标(x,y,-f) 像空间坐标畸变纠正 deltax,deltay 已知(x,y),求解(X,Y, Z)或者(Lat,Lon) 这里的Z是DEM上获取的坐标和Zs为相机坐标的高程,如果均为已知的情况下,则可以求解(X,Y),这里的(X,Y,Z)为地固地心坐标,单位为米。平地

    2024年02月15日
    浏览(41)
  • 在vue3中创建多重布局的方法

    在本文中,会通过 demo 演示来讲解几个用于创建多重布局的方式。 demo 需求:创建一个带有主页、营销页面和应用程序页面的 Web 应用程序 这是创建布局最简单的方法,但灵活性较差。 创建一个 layouts 文件夹,在其中创建 3 个包含 slot 的布局组件。 然后,只需在每个页面组

    2024年02月12日
    浏览(30)
  • 局域网共享提示不允许多重连接的解决方法

    在局域网共享的时候会提示“不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接”,是因为之前使用了其他的用户登录了但是没有推出,所以出现这个提示,我们要做的就是把连接断开,已登入账户自然就退出了 不允许一个用户使用一个以上用户名与一

    2024年02月06日
    浏览(80)
  • 引入三阶失真的非线性放大器的模拟输出及使用中值滤波器去除峰值研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 在这个

    2024年02月13日
    浏览(35)
  • Visual Studio C++找到一个或多个多重定义的符号解决方法

    1、当Visual Studio C++中一个项目下有两个及以上的源文件时,编译会产生错误 : LNK200:_main已经在if_else的学习.obj中定义 LNK116:找到一个或多个多重定义的符号 原因是: 一个项目下有两个及以上的源文件,如下图所示的if else的学习.cpp文件和learn1.cpp文件,里面都存在相同的函数

    2024年02月04日
    浏览(79)
  • 视频中的水印如何去除?教你几种简单去除视频水印方法

    视频中的水印如何去除掉呢?如果我们经常观看视频,可能会注意到一些视频上有水印。水印是在视频中嵌入的品牌标志或文字。这些水印可能会影响视频的观感,去除水印可以帮助我们在学习和研究方面更有效地使用视频资源。有时候,我们可能需要将视频插入到演示文稿

    2024年02月16日
    浏览(41)
  • 安卓系列全机型刷写原生 去除wifi打叉 去除感叹号方法解析

    很多友友不喜欢官方自带的系统。爱刷写第三方官改或者原生系统。其中原生系统的优点在于系统资源占用少。操作流畅。后台运行程序可控等等为很多玩机用户刷写体验。原生谷歌的系统对于国内用户来说一般注意的就是两个方面 1---开机向导。谷歌开机向导界面。如果前

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包