数值型数据的分析通常采用相关分析和回归分析。
一、相关分析
相关分析检验两个变量是否存在线性关系。通过散点图可以初步判断两者关系,然后计算相关系数,并检验相关系数的显著性。可参考
xls:Pearson, Spearman, Kendall 三大相关系数简单介绍zhuanlan.zhihu.com二、简单线性回归
线性回归是研究数值型自变量对数值型因变量的影响,并得到回归模型。
前提假设
- 自变量与因变量存在线性关系;
- 自变量是固定的;
- 误差项服从正态分布,均值为0,不同自变量的对应的误差项方差相等;
- 因变量服从正态分布,方差等于误差项方差;
- 所有样本独立。
计算
目标损失函数
均方误差
选择相对较好的模型的顺序:方差小,偏差小 > 方差小,偏差大 > 方差大,偏差小 > 方差大,偏差大。
方差小,偏差大 之所以在实际中排位相对靠前,是因为它比较稳定。尤其当样本量与总体量相差较大,为了在预测新数据的稳定,更追求方差小的模型。
模型检验
- F检验确定模型的显著性
- t检验确定系数的显著性,一元回归中t检验等同F检验
- 残差图或残差概率图检验残差是否方差相等且正态。残差-x 的散点图应该在水平带之间,且标准化残差在-2~2之间
- 用VIF检验多重共线性,VIF>10 严重共线性
- dubin_watson 检验残差自相关性,异方差。d=2则基本没有自相关关系,d靠近0存在正的相关关系,d靠近4则有负的相关关系。
判定系数
from sklearn.metrics import mean_squared_error as MSE
# 线性回归
model_LR = linear_model.LinearRegression()
model_LR.fit(x, y)
ypred = model_LR.predict(x)
model_LR.summary()
model_LR.score(x, y) # 返回判定系数R^2,拟合程度
MSE(y, ypred)
# 判断多重共线性,直接计算相关系数或求方差膨胀系数VIF
coef = np.corrcoef(x)
from statsmodels.stats.outliers_influence import variance_inflation_factor
x1=np.column_stack((x,np.ones(x.shape[0])))
vif = [variance_inflation_factor(x.values,i) for i in x.shape[1]]
三、广义线性回归
回归一般是预测样本的值,通常情况下样本值是连续的。而广义线性回归是对简单线性回归的拓展,能预测连续值也能进行分类,比如逻辑回归。而且经典的线性回归假设比较严格,广义线性回归针对不满足的假设有匹配的方法。比如多重共线性、异方差等。
在广义线性模型中,要求Y和X满足指数分布簇。即
其中
模型损失函数即负的最大似然函数。通过对数似然函数对各参数求梯度,并利用梯度下降法求得模型参数。
a. 伯努利分布-->逻辑回归
model_LOGIT = linear_model.LogisticRegression()
model_LOGIT.fit(x, y)
model_LOGIT.summary()
ypred = model_LOGIT.predict(x) # 返回label
yprob = model_LOGIT.predict_proba(x) # 返回概率
model_LOGIT.score(x, y) # 返回平均准确度
MSE(y, ypred)
b. 多项分布-->softmax 回归
多项分布是二项分布的推广,状态是两个或两个以上,可理解为多分类问题。
将因变量类别向量化,假设为k类,则每一类可以为k维0-1向量。
因此
c. 岭回归
正则化项(Regularization)相当于对模型参数施加惩罚,压缩了参数的范围,限制了模型的复杂度,从而有助于缓解模型过拟合问题。正则项一般采用一,二范数,使得模型更具有泛化性,同时可以解决线性回归中自变量共线性问题
岭回归是在线性回归的基础上对损失函数进行L2正则,
则
前提
将可能存在共线性的变量特征尽量转换到一个范围,可进行中心化和标准化处理。
建模步骤:输入不同的α值,对比岭迹图,寻找最合适的α。标准化回归系数趋于稳定时的最小α值。K值越小则偏差越小,但方差越大。
# 岭回归
alphas=np.linspace(-10,-2,100)
coefs = []
for a in alphas:
model_RR = linear_model.Ridge(alpha=a, fit_intercept=True, normalize=False)
model_RR.fit(x, y)
coefs.append(model_RR.coef_)
model_RR.score(x, y)
ypred = model_RR.predict(x)
MSE(y, ypred)
# 画岭迹图
ax = plt.gca()
ax.plot(alphas, coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1]) # reverse axis
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
d.Lasso回归
提高线性回归模型的精度, L1正则导致惩罚(或等于约束估计的绝对值之和)值使一些参数估计结果等于零,即当α越大,对参数压缩越大,参数就可能为0。这样可选择特征变量,同时虽然增加了模型偏差,但是大大降低了方差。
通常用模型的BIC, AIC来选择正则化权重α。
由于目标函数不可导,无法用梯度下降或牛顿法求解,而是采用最小角回归或坐标下降法。
# Lasso回归
model_Lasso = linear_model.Lasso(alpha=1, fit_intercept=True, normalize=False)
model_Lasso.fit(x,y)
y_pred = model_Lasso.predict(x)
model_Lasso.score(x, y)
MSE(y, y_pred)
e.Elastic回归
ElasticNet是Lasso和Ridge回归技术的混合体。它使用L1来训练并且L2优先作为正则化矩阵。当有多个相关的特征时,Lasso 会随机挑选他们其中的一个,而ElasticNet则会选择两个,继承循环状态下Ridge的一些稳定性。但在高度相关变量的情况下,它会产生群体效应。
# ElasticNet回归
model_Elastic = linear_model.ElasticNet(alpha=1, l1_ratio=0.5,fit_intercept=True, normalize=False)
model_Elastic.fit(x,y)
y_pred = model_Elastic.predict(x)
model_Elastic.score(x, y)
MSE(y, y_pred)
四、非线性回归
a.对数线性回归
很多情况下,自变量和因变量没有直接的线性关系,而变量通过某种转化,比如对数变化后,二者就存在线性关系,那么就可以用线性回归进行计算。
# 对数回归
model_ln = linear_model.LinearRegression()
model_ln.fit(np.log(x), y)
ypred = model_ln.predict(np.exp(x))
model_ln.score(np.exp(x), y)
b.指数回归
将自变量进行指数化,相当于新的自变量
# 指数回归
model_exp = linear_model.LinearRegression()
model_exp.fit(np.exp(x), y)
ypred = model_exp.predict(np.exp(x))
model_exp.score(np.exp(x), y)
c.倒数回归
# 倒数回归
model_d = linear_model.LinearRegression()
model_d.fit(1/x, 1/y)
d.S曲线回归
==>
# S曲线回归
model_s = linear_model.LinearRegression()
model_s.fit(np.exp(-x), 1/y)
e.多项式回归
多项式回归是指因变量不止与一次幂自变量相关,还与多次幂自变量相关,甚至还有自变量之间的交互作用相关。一般不采用三次以上幂的形式。相当于升维。在实际操作中,通常先把数据归一化,然后升维,再线性分析。
# 多项式回归
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
def PolynomialRegression(degree):
# degree 是最高次幂,将所有变量做1,2,...,degree次排列升维度
return Pipeline([
('poly', PolynomialFeatures(degree=degree)),
('std_scale', StandardScaler()),
('lin_reg', linear_model.LinearRegression())
])
model_poly = PolynomialRegression(degree=2)
model_poly.fit(x, y)
ypred = model_poly.predict(x)
MSE(y, ypred)
五、协方差分析
协方差分析也称“共变量(数)分析”,是方差分析的引申和扩大。协变量是指与因变量有回归关系,对分类自变量的影响有干扰作用的自变量。比如说两组数据基线有差别,在进行对照实验后,实验后的结果需要考虑基线差别的这个因素。
协方差分析基本原理是将线性回归与方差分析结合起来,调整各组平均数和 F 检验的实验误差项,检验两个或多个调整平均数有无显著差异。
协方差分析本质还是用最小二乘法计算,因此在python中只要修改公式
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
model = ols('y~x1+x2',data=df).fit() # 其中x1是分类变量且表示为string格式,x2是数值变量;若x1是整数格式,修改为C(x1)
model.params
model.summary()