多重共线性在python中的解决方法

本文将讨论多重共线性的相关概念及利用python自动化消除多重共线性的方法,以供参考,欢迎拍砖

线性模型与非线性模型

关于线性模型与非线性模型的定义,似乎并没有确切的定论,但是个人认为建模首先得清楚地认识样本,样本有线性可分与线性不可分两种,所谓是否线性可分,是指是否存在一条直线(或平面)将样本分开。

上图中y=0和y=1的样本可以由一条直线分开,如逻辑回归模型最佳的应用样本即为上图样本(线性可分);如果样本是线性不可分,决策树等模型可以更有效地将样本分开,此时选择逻辑回归分类结果可能较差。

如上图中的样本,使用逻辑回归可能取得较差的分类效果。但是如果将特征映射到更高维空间,
上式在二维直角坐标系中表现为圆,就可以将图中样本分开。
因此总结来说

  1. 选择何种模型取决于数据本身,线性可分数据使用逻辑回归等可以线性分开数据的线性模型可以取得更好的分类效果;线性不可分数据则不适合。
  2. 传统的线性模型可以通过将特征映射到高维空间中达到线性分开数据的目的,如SVM采用核技巧,逻辑回归加入原始特征的高维转换等。

多重共线性对线性回归和逻辑回归的影响

多重共线性是指在变量空间中,存在自变量可以近似地等于其他自变量的线性组合:
Y 约等于 W1X1 + W2X2 + … + Wn*Xn
此时如果将所有自变量用于线性回归或逻辑回归的建模,将导致模型系数不能准确表达自变量对Y的影响。比如:如果X1和X2近似相等,则模型Y = X1 + X2 可能被拟合成Y = 3 X1 - X2,原来 X2 与 Y 正向相关被错误拟合成负相关,导致模型没法在业务上得到解释。在评分卡建模中,可能将很多相关性很高的变量加入到建模自变量中,最终得到的模型如果用变量系数去解释自变量与目标变量的关系是不合适的。

VIF 和相关系数

相关矩阵是指由样本的相关系数组成的矩阵,自变量相关系数过大意味着存在共线性,同时会导致信息冗余,维度增加。设置相关系数的阈值,当大于threshold时,删除IV值较小的变量(IV值的定义及计算后文解释)。
VIF(variance inflation factors)VIF =1/(1-R^2) 式中,R^2是以xj为因变量时对其它自变量回归的复测定系数。VIF越大,该变量与其他的变量的关系越高,多重共线性越严重。如果所有变量最大的VIF超过10,删除最大VIF的变量。

解决方案(利用statsmodels.stats)

利用相关系数删除相关性过高的变量(df中变量先得按IV值从大到小排序)

def get_var_no_colinear(cutoff, df):corr_high = df.corr().applymap(lambda x: np.nan if x>cutoff else x).isnull()col_all = corr_high.columns.tolist()del_col = []i = 0while i < len(col_all)-1:ex_index = corr_high.iloc[:,i][i+1:].index[np.where(corr_high.iloc[:,i][i+1:])].tolist()for var in ex_index:col_all.remove(var)corr_high = corr_high.loc[col_all, col_all]i += 1return col_all

利用VIF删除导致高共线性的变量

import numpy as np
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
## 每轮循环中计算各个变量的VIF,并删除VIF>threshold 的变量
def vif(X, thres=10.0):col = list(range(X.shape[1]))dropped = Truewhile dropped:dropped = Falsevif = [variance_inflation_factor(X.iloc[:,col].values, ix)for ix in range(X.iloc[:,col].shape[1])]maxvif = max(vif)maxix = vif.index(maxvif)if maxvif > thres:del col[maxix]print('delete=',X_train.columns[col[maxix]],'  ', 'vif=',maxvif )dropped = Trueprint('Remain Variables:', list(X.columns[col]))print('VIF:', vif)return list(X.columns[col])

如果对原理和代码有问题。欢迎一起讨论哦,IV值的定义及计算后面再讲哈

多重共线性:python中利用statsmodels计算VIF和相关系数消除共线性相关推荐

  1. 「Leetcode-Python」python中利用链表计算两个非负整数之和(链表类型非列表)

    LeetCode里的一个题,没注意到输入类型是列表格式,所以用类结点形式的链表写出来了,做个记录 class ListNode:def __init__(self, x):self.val = xse ...

  2. python基础教程:Python中利用sqrt()方法进行平方根计算的教程

    这篇文章主要介绍了Python中利用sqrt()方法进行平方根计算的教程,是Python学习的基础知识,需要的朋友可以参考下 sqrt()方法返回x的平方根(x>0). 语法 以下是sqrt() ...

  3. Python中利用BBP方式和蒙卡罗特方法求出π值(以及运用函数进行选择方式解决问题)

    Python中利用BBP方式和蒙卡罗特方法求出π值 一 BBP方式 二 蒙卡罗特方法 三 要求用户可以进行选择方法,之后调用对应函数进行执行 一 BBP方式 所谓BBP方式就是利用下面所给数学计算公式 ...

  4. pythonchar中的拟合方法_在python中利用numpy求解多项式以及多项式拟合的方法

    构建一个二阶多项式:x^2 - 4x + 3 多项式求解 >>> p = np.poly1d([1,-4,3]) #二阶多项式系数 >>> p(0) #自变量为0时 ...

  5. python try else多余的设计_在python中利用try..except来代替if..else的用法

    在有些情况下,利用try-except来捕捉异常可以起到代替if-else的作用. 比如在判断一个链表是否存在环的leetcode题目中,初始代码是这样的 # Definition for singl ...

  6. Python中利用numpy将数组(矩阵)存成csv文件,将csv文件读取为数组(矩阵)

    Python中利用numpy将数组(矩阵)存成csv文件,将csv文件读取为数组(矩阵) 本博客转载自:https://blog.csdn.net/vernice/article/details/50 ...

  7. Python中的乘方计算

    [小白从小学Python.C.Java] [Python-计算机等级考试二级] [Python-数据分析] Python中的乘方计算 power()函数 选择题 以下python代码输出什么? imp ...

  8. python画抛物线_在python中利用最小二乘拟合二次抛物线函数的方法

    1.最小二乘也可以拟合二次函数 我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的.下面我们就来试试用最小二乘来拟合抛物线形状的的图像. 对于二次函数 ...

  9. python中利用re模块正则表达式匹配ip地址

    python中利用正则表达式判断ipv4地址是否合法 ip地址的范围为0.0.0.0-255.255.255.255,分成四段,则每段的范围都是0-255,因此,以一段进行分析: 在进行书写匹配规则时 ...

  10. python中translate的用法_如何在python中利用translate模块实现一个翻译功能

    如何在python中利用translate模块实现一个翻译功能 发布时间:2020-12-18 14:16:00 来源:亿速云 阅读:86 这期内容当中小编将会给大家带来有关如何在python中利用t ...

最新文章

  1. 八、H.264中的熵编码基本方法、指数哥伦布编码
  2. delphi存取图片
  3. 重写 View 的 Touch 方法,实现一个酷炫的九宫格图片
  4. Android跨进程通信一 Messenger
  5. The following module was built either with optimizations enabled or without debug information - winz
  6. mac开发配置手册(全)
  7. MySQL笔记(二)基础的增删改查
  8. Docker 安装 SQL Server教程
  9. 【读】这一次,让我们再深入一点 - TCP协议
  10. android pad刷机,平板刷机图文教程详解!小编手把手教你安卓平板电脑怎么刷机
  11. mpa和pis_psig与mpa换算(压力单位换算psi)
  12. opencv矩形轮廓查找
  13. 几种常见MOSFET栅极驱动电路
  14. python高级变量类型
  15. Filter过滤器讲解
  16. 基于Node.js的3DTiles三维倾斜摄影模型爬虫
  17. 菜鸟学习Python+Selenium遇到的第一个要崩溃的问题
  18. linux安装globalsign证书,GlobalSign 普通 OV 代码签名证书提取教程
  19. android storagemanager来获取u盘名称,StorageManager获取U盘挂载状态
  20. 智慧指间丨生态环境网格化监管系统——编织生态环保“绿网”

热门文章

  1. html和css中盒子大小,CSS大小设置实例——盒子模型
  2. Java基础面试题(史上最全基础面试题,精心整理100家互联网企业面经)
  3. 杂篇:随笔编程杂谈录--《隆中对》
  4. 隐私空间伪装计算机,隐私空间app(文件夹隐藏) 6.1.9 免root
  5. 花1分钟用Word手动绘制流程图,看完我学会了!
  6. Laravel 5.5 Eloquent ORM - 关联关系
  7. 记一次失败的git截图工具使用经历——shareX
  8. 利用Plex和Syncthing搭建媒体中心
  9. 关于Bilibili下载问题
  10. sql server返回是星期几的函数