赞
踩
所谓共线性(又称多重共线性)问题指的是输入的自变量之间存在较高的先行相关度。共线性问题会导致回归模型的文档行和准确性大大降低,另外,过多无关的维度参与计算也会浪费计算资源和时间。
共线性问题是否常见取决于具体业务场景,常见的具有明显的共线性的维度或变量包括如下:
导致出现变量间共线性的原因可能包括:
共线性一般通过容忍度,方差膨胀因子,特征值这几个特征数据来判断。
除此之外,还可以使用相关系数辅助判断,当相关系数R>0.8时就表示可能存在较强的相关性。
解决共线性的5种常用方法如下:
增大样本量:通过增加样本量,来消除由于数据量补足而出现的偶然共线性现象,在可行的前提下,这种方法是需要考虑的;但即使增加了样本量,也可能无法解决共线性问题,原因是很可能变量间确实存在这个问题。
岭回归法(Ridge Regression):岭回归分析是一种专用于共线性问题的有偏估计回归方法,实质上是一种改良的最小二乘估计法。它通过放弃最小二乘法的无偏性,以损失部分信息,降低精度为代价来获得更实际和可靠性更强的回归系数。因此岭回归在存在较强共线性的回归应用中较为常用。
逐步回归法(Stepwise Regression):逐步回归法是 每次引入一个自变量并进行统计检验,然后逐步引入其他变量,同时对所有变量的回归系数进行检验。如果原来引入的变量由于后面变量的引入而变得不再显著,那么就将其剔除,逐步得到最优回归方程。
主成分回归(Principal Components Regression):通过主成分分析,将原始参与建模的变量转换为少数几个主成分,每个主成分是原变量的共线性组合,然后基于主成分做回归分析,这样也可以在不丢失重要数据特征的前提下避开共线性问题。
人工去重:直接结合人工经验,对参与回归模型计算的自变量进行删减,也是一个较为常用的方法,但这种方法需要操作者对于业务,模型和数据都有相对深入的立即。
import numpy as np from sklearn.linear_model import Ridge import pandas as pd #读取数据 # data = np.loadtxt('/Users/nxcjh/learn/python-yunying/python_book/chapter3/data5.txt', delimiter='\t') data = pd.read_table('/Users/nxcjh/learn/python-yunying/python_book/chapter3/data5.txt', delimiter='\t') x = data.iloc[:, :-1] # 切分变量 y = data.iloc[:, -1] # 切分预测变量 # 使用岭回归算法进行回归分析 model_ridge = Ridge(alpha=1.0) # 建立岭回归模型对象 model_ridge.fit(x, y) # 输入x/y训练模型 print("输出自变量的系数:") print(model_ridge.coef_) # 打印输出自变量的系数 print("输出截距:") print(model_ridge.intercept_) # 打印输出截距
输出自变量的系数:
[ 8.49478788e+01 -1.06717591e-03 9.71111938e-04 -9.75225980e-04
2.12686655e-05 2.22421692e-04 -3.02339279e-06 -8.85519635e-06
5.47707940e-07]
输出截距:
-7436.9872186787
from sklearn.decomposition import PCA from sklearn.linear_model import LinearRegression model_pca = PCA() # 建立PCA模型对象 data_pca = model_pca.fit_transform(x) # 将x进行主成分分析 ratio_cumsm = np.cumsum(model_pca.explained_variance_ratio_) # 得到所有主成分方差占比的累积数据 print("所有主成分方差占比的累积数据:") print(ratio_cumsm) rule_index = np.where(ratio_cumsm > 0.8) # 获取方差占比超过0.8 的所有索引值 min_index = rule_index[0][0] # 获取方差最小索引值 data_pca_result = data_pca[:, :min_index + 1] # 根据最小索引值提取主成分 model_liner = LinearRegression() # 建立回归模型对象 model_liner.fit(data_pca_result, y) # 输入主成分数据和预测变量y 并训练模型 print("输出自变量的系数:") print(model_liner.coef_) # 打印输出自变量的系数 print("输出截距:") print(model_liner.intercept_) # 打印输出截距
所有主成分方差占比的累积数据:
[0.90407972 0.98566955 0.99957336 0.99995927 0.99999562 0.99999939
0.99999999 1. 1. ]
输出自变量的系数:
[1.24317745e-05]
输出截距:
1058.7735735735737
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。