机器学习(10)——假设检验和回归分析

目录

 

1 假设检验

1.1 数据分布检验

1.2 t检验

1.3 方差分析

2 一元回归

2.1 一元线性回归

2.2 一元非线性回归

3 多元回归

3.1 多元线性回归

3.2 逐步回归

3.3 多元自适应回归样条

4 正则化回归分析

4.1 Ridge 回归分析

4.2 LASSO归分析

4.3 弹性网络回归

5 Logistic 回归分析

5.1 数据准备与可视化

5.2 逻辑回归分类


假设检验是统计推断中的一个重要内容,它是利用样本数据对某个事先做出的统计假设,按照某种设计好的方法进行检验,判断此假设是否正确假设检验的基本思想为概率性质的反证法。为了推断总体,首先对总体的未知参数或分布做出某种假设HO(原假设),然后在HO成立的条件下若通过抽样分析发现“小概率事件”竟然在一次实验中发生了,则表明HO很可能不成立,从而拒绝HO;相反,若没有导致上述“不合理”现象的发生,则没有理由拒绝HO,从而接受HO。
要求“小概率事件”发生的概率小于等于某一给定的临界概率a,称a为检验的显著性水平,通常a的取值为较小的数 0.05、0.01、0.001等。值得注意的是,即使接受了原假设,也不能确定这个原假设100%正确。在判断检验结果是否显著上,通常采用计算P值的方法来判断。所谓P值, 就是在假定原假设HO为真时,拒绝原假设HO所犯错误的可能性。当P值<a(通常取0.05)时, 表示拒绝原假设HO犯错误的可能性很小,即可以认为原假设HO是错误的,从而拒绝HO;否则, 应接受原假设HO。
回归分析是一种针对连续型数据进行预测的方法,目的在于分析两个或多个变量之间是否相关, 以及相关方向和强度的关系。可以通过建立数学模型观察特定的变量,或者预测研究者感兴趣的变量。更具体一点来说,回归分析可以帮助人们了解,在只有一个自变量变化时引起的因变量的变化情况。
大数据分析任务中,回归分析是一种预测性的建模技术,也是统计理论中重要的方法之一,它主要解决目标特征为连续性的预测问题。例如,根据房屋的相关信息预测房屋的价格;根据销售情况预测销售额;根据运动员的各项指标预测运动员的水平等。在回归分析中,通常将需要预测的变量称为因变量(或被解释变量),如房屋价格,而用来预测因变量的变量称为自变量(或者解释变量)如房子的大小、占地面积等信息。
回归分析按照涉及变量的多少,分为一元回归分析和多元回归分析;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。针对分类变量,可以使用Logistic回归,在解决多元回归的多重共线性问题时,提出了逐步回归、LASSO 回归、Ridge回归、弹性网回归等广义线性回归。
本章会结合实际的数据集,使用Python来完成数据进行假设检验和回归分析等任务。首先导入该章节用到的库和相关模块,程序如下:

## 图像显示中文的问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False

import seaborn as sns
sns.set(font= "Kaiti",style="ticks",font_scale=1.4)

## 导入会使用到的相关库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import statsmodels.api as sm
import statsmodels.formula.api as smf
from statsmodels.stats.multicomp import pairwise_tukeyhsd

from scipy import stats
from scipy.optimize import curve_fit

from sklearn.preprocessing import QuantileTransformer,StandardScaler
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error,classification_report
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.linear_model import  Ridge,Lasso,LassoLars,ElasticNetCV,LogisticRegression,LogisticRegressionCV

from itertools import combinations
#from pyearth import Earth #该包未安装成功,不在演示

## 忽略提醒
import warnings
warnings.filterwarnings("ignore")

假设检验任务主要由SciPystatsmodels库完成,回归分析任务主要由statsmodelssklearn库完成。

1 假设检验

假设检验贯穿于绝大多数的统计分析方法中,其主要内容包括单个或多个总体参数的假设检验, 以及非参数的假设检验(比如总体分布的假设检验)等。针对数据的假设检验,本节主要介绍如何使用Python完成数据分布检验、样本t检验和数据方差分析。

1.1 数据分布检验

数据分布的假设检验是重要的非参数检验,它不是针对具体的参数,而是根据样本值来判断总体是否服从某种指定的分布。即在给定的显著性水平a下,对假设HO:总体服从某特定分布F(x);
H1:总体不服从某特定分布F(x)作显著性检验,其中F(x)为推测出的具有明确表达式的分布函数。
数据分布检验中最常见的情况是检验数据是否服从正态分布。可以使用多种方法进行数据的正态性检验。本小节主要介绍使用Python,完成使用Q-Q图检验数据是否符合正态分布,以及利用 K-S (Kolmogorov-Smirnov)拟合优度检验来检验数据是否符合正态分布。
首先生成3个随机数变量,X1为标准正态分布数据,X2 为正态分布数据,X3为非正态分布数据,生成随机数变量并使用直方图对其进行可视化的程序如下,程序运行后的结果如图5-1所示。

## 数据准备
np.random.seed(123)
## 生成标准正态分布随机数X1
X1 = stats.norm.rvs(loc = 0,scale = 1,size = 500)
## 生成正态分布随机数X2
X2 = stats.norm.rvs(loc = 0,scale = 5,size = 500)
## 生成F分布随机数X3
X3 = stats.f.rvs(15,30,size = 500)
## 利用直方图可视化两组数据的分布情况
plt.figure(figsize=(15,6))
plt.subplot(1,3,1)
plt.hist(X1,bins=50,density=True)
plt.grid()
plt.ylabel("频率")
plt.title("标准正态分布")
plt.subplot(1,3,2)
plt.hist(X2,bins=50,density=True)
plt.grid()
plt.ylabel("频率")
plt.title("正态分布")
plt.subplot(1,3,3)
plt.hist(X3,bins=50,density=True)
plt.grid()
plt.ylabel("频率")
plt.title("F分布")
plt.tight_layout()
plt.show()

运行结果如下:

图5-1 数据直方图分布

利用Q-Q图检验数据是否符合正态分布,可以使用sm.qqplot()函数可视化出结果,并且使用参数line="45" line="q"可视化出倾斜45°的参考线,用于判断数据是否符合正态分布。在Q-Q 图中,若散点图落在该参考线上,或者均匀分布在线的附近,则接受数据来自正态总体的假设,否则拒绝原假设。进行检验的程序如下,运行程序后的结果如图5-2所示。

## 利用Q-Q图对两组数据进行正态性检验

fig = plt.figure(figsize=(15,5))
ax = fig.add_subplot(1,3,1)
## 默认检验标准正态分布,loc=0,scale=1
sm.qqplot(X1,line="45",ax = ax)
plt.grid()
plt.title("X2正态检验Q-Q图")

ax = fig.add_subplot(1,3,2)
## 指定正态分布的均值和标准差
sm.qqplot(X2,loc=0,scale=5,line="45",ax = ax)
plt.grid()
plt.title("X2正态检验Q-Q图")

ax = fig.add_subplot(1,3,3)
## 对F分布进行正态性检验
sm.qqplot(X3,line="q",ax = ax)
plt.grid()
plt.title("X3正态检验Q-Q图")
fig.tight_layout()
plt.show()


## 可发现,第一个图的散点图在图像的对角线上,表示数据X1是所标准正态分布
## 第二个图的散点图在图像的对角线上,表示数据X2是所指定的正态分布
## 第三个图的散点图不在图像的对角线上,表示数据X3不是正态分布

 运行结果如下:

 图5-2 正态检验Q-Q图

从图5-2中可以发现,前两个图的散点图在图像的参考线上,表示数据X1和X2是正态分布第三个图的散点图不在图像的参考线上,表示数据X3不是正态分布。
K-S 检验可以使用 stats.kstest()函数完成,默认情况下会验证数据是否符合标准正态分布同时还可以指定参数cdf所要验证的分布情况,并且还可以利用参数args指定符合参数的特定分布。

下面针对前面生成的3个随机变量,使用K-S检验进行相关的检验操作,程序如下:

## K-S检验,可以指定所检验的数据分布类型
print("X1标准正态分布检验:\n",stats.kstest(X1,cdf = "norm"))
print("X2标准正态分布检验:\n",stats.kstest(X2,cdf = "norm"))
print("X2正态分布检验:\n",stats.kstest(X2,cdf = "norm",args = (0,5)))
print("X3标准正态分布检验:\n",stats.kstest(X3,cdf = "norm"))
print("X3 F(15,30)分布检验:\n",stats.kstest(X3,cdf = "f",args = (15,30)))

运行结果如下:

X1标准正态分布检验:
 KstestResult(statistic=0.030903709790884082, pvalue=0.714038602403839)
X2标准正态分布检验:
 KstestResult(statistic=0.3266532275656769, pvalue=5.2306133517677304e-48)
X2正态分布检验:
 KstestResult(statistic=0.03500755169583336, pvalue=0.5603023447098723)
X3标准正态分布检验:
 KstestResult(statistic=0.6369433974371657, pvalue=1.609080928303521e-197)
X3 F(15,30)分布检验:
 KstestResult(statistic=0.028179536785067155, pvalue=0.8112803981442576)

从上面程序的输出结果可以知道: (1)在对随机变量X1是否为标准正态分布的检验中,P值大于0.05,可以接受其是标准正态分布的原假设。(2)在对随机变量X2 是否为标准正态分布的检验中,P值小于0.05,需要拒绝接受其是标准正态分布的原假设。(3)在对随机变量X2是否为M(0,5)正态分布的检验中,P值大于0.05,可以接受其是M(0,5)的正态分布原假设。(4)在对随机变量X3是否为标准正态分布的检验中,P值小于0.05,需要拒绝接受其是标准正态分布的原假设。(5)在对随机变量X3是否为F(15,30)的F分布的检验中,P值大于0.05,可以接受其是 R15,30)的F分布原假设。
K-S检验还可以检验两个随机变量的分布是否相同,因此可以使用下面的程序检验3个随机变中,两两之间是否有相同的数据分布。

## K-S检验,检验两个数据之间的分布是否相同
print("X1和X2分布是否相同的检验:\n",stats.ks_2samp(X1,X2))
print("X1和X3分布是否相同的检验:\n",stats.ks_2samp(X1,X3))
print("X2和X3分布是否相同的检验:\n",stats.ks_2samp(X2,X3))

运行结果如下:

X1和X2分布是否相同的检验:
 KstestResult(statistic=0.328, pvalue=3.3583913478618886e-24)
X1和X3分布是否相同的检验:
 KstestResult(statistic=0.658, pvalue=1.175107982448385e-102)
X2和X3分布是否相同的检验:
 KstestResult(statistic=0.546, pvalue=9.273032713380692e-69)

从输出结果可知,3组检验结果的P值均小于0.05,所以可以认为,在3个随机变量中,两两之间具有不同的数据分布。


1.2 t检验


t检验分为单样本t检验两独立样本t检验,前者常用来检验来自正态分布的样本的期望值(均值)是否为某一实数,后者常作为判断两个来自正态分布(方差相同)的独立样本的期望值(均值) 之差是否为某一实数。
单样本t检验中,HO:样本的均值等于指定值;H1:样本的均值不等于指定值。
两独立样本t检验中,HO:两样本的均值差等于指定值;H1:两样本的均值差不等于指定值。

Python 中可以使用 stats.ttest_1samp()完成单样本t检验,下面生成3组随机变量,然后使用stats.ttest_1samp()函数完成相应的单样本t检验,程序如下:

## 数据准备
np.random.seed(123)
## 生成标准正态分布随机数X1
X1 = stats.norm.rvs(loc = 0,scale = 1,size = 500)
## 生成正态分布随机数X2
X2 = stats.norm.rvs(loc = 0,scale = 5,size = 500)
## 生成正态分布随机数X3
X3 = stats.norm.rvs(loc = 5,scale = 5,size = 500)

## 检验一个样本的均值是否为指定值
print("X1的均值是否等于0:\n",stats.ttest_1samp(X1,0))
print("X2的均值是否等于5:\n",stats.ttest_1samp(X2,5))
print("X3的均值是否等于5:\n",stats.ttest_1samp(X3,5))

## pvalue<0.05的检验表示可以拒绝均值等于指定值的原假设,表示均值不等于指定值

运行结果如下:

X1的均值是否等于0:
 Ttest_1sampResult(statistic=-0.8604849693780614, pvalue=0.3899350058490936)
X2的均值是否等于5:
 Ttest_1sampResult(statistic=-23.28071031299755, pvalue=1.0390149821456911e-81)
X3的均值是否等于5:
 Ttest_1sampResult(statistic=1.4552229249137607, pvalue=0.14623633901254982)

从3组t检验的结果中可以发现,X1的均值是否等于0的检验中,P值大于0.05,因此不可以拒绝均值等于0的原假设,即随机变量X1的均值为0; X2的均值是否等于5的检验中,P值小 于0.05,因此可以拒绝均值等于5的原假设,即随机变量X2的均值不等于5;X3的均值是否等于 5的检验中,P值小于0.05,不可以拒绝均值等于5的原假设,即随机变量X3的均值为5。
针对两独立样本的t检验,可以使用Python 中的stats.ttest_ind()来完成,下面使用其检验 X1、X2和X3中,两两之间的差值是否等于0,可以使用下面的程序:

## 检验2个样本的均值是否为相等
print("X1和X2的均值是否相等:\n",stats.ttest_ind(X1,X2))
print("X1和X3的均值是否相等:\n",stats.ttest_ind(X1,X3))
print("X2和X3的均值是否相等:\n",stats.ttest_ind(X2,X3))

## pvalue<0.05的检验表示可以拒绝两样本均值相等的原假设,表示两个变量的平均值不项等

运行结果如下:

X1和X2的均值是否相等:
 Ttest_indResult(statistic=0.7185337922699782, pvalue=0.4725964034128529)
X1和X3的均值是否相等:
 Ttest_indResult(statistic=-25.450068546371313, pvalue=1.623506730435016e-110)
X2和X3的均值是否相等:
 Ttest_indResult(statistic=-18.145330653700995, pvalue=8.23954776165081e-64)

从检验结果可以知道,X1和X2的均值相等,X1和X3的均值不相等,X2和X3的均值不相等。

1.3 方差分析

方差分析是分析实验数据的一种方法,它是由英国统计学家费希尔在进行实验设计时,为解释实验数据而提出的。对于抽样测得的实验数据,一方面,由于观测条件不同会引起实验结果有所不同,该差异是系统的;另一方面,由于各种随机因素的干扰,实验结果也会有所不同,该差异是偶 然的。方差分析的目的在于从实验数据中分析出各个因素的影响,以及各个因素间的交互影响,以确定各个因素作用的大小,从而把由于观测条件不同引起实验结果的不同与由于随机因素引起实验结果的差异用数量形式区别开来,以确定在实验中有没有系统的因素在起作用。方差分析根据所感兴趣的因素数量,可分为单因素方差分析、双因素方差分析等内容。
比较因素A的r个水平的差异,归结为比较这r个总体X_{i}的均值是否相等,即检验假设HO: \mu _{1}=\mu _{2}=\cdots =\mu _{r}; H1: \mu _{1},\mu _{2},\cdots ,\mu _{r}至少有两个不等,若HO被拒绝,则说明因素A的各水平的效应之间有显著差异。
Python 中可以使用 sm.stats.anova_Im()函数完成方差分析,并利用 pairwise_tukeyhsd() 函数,对数据方差分析结果进行多重检验。下面在介绍方差分析时,以鸢尾花数据为例,用来演示单因素方差分析,查看数据的程序如下:

## 单因素方差分析
## 使用鸢尾花数据来演示
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
print(Iris.head())

运行结果如下:

   Id  SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm Species
0   1            5.1           3.5            1.4           0.2  setosa
1   2            4.9           3.0            1.4           0.2  setosa
2   3            4.7           3.2            1.3           0.2  setosa
3   4            4.6           3.1            1.5           0.2  setosa
4   5            5.0           3.6            1.4           0.2  setosa

针对鸢尾花数据,若比较不同种类的花下SepalLengthCm特征的均值是否相等,可使用以下程序:

## 比较不同种类的花下SepalLengthCm特征的均值是否相等
model = smf.ols("SepalLengthCm ~ Species", data=Iris).fit()
aov_table = sm.stats.anova_lm(model, typ=2)
print(aov_table)

## P值远小于0.05,说明不同种类花的均值不完全相等,使用多重比较对比哪些花之间的均值不同

运行结果如下:

             sum_sq     df           F        PR(>F)
Species   63.212133    2.0  119.264502  1.669669e-31
Residual  38.956200  147.0         NaN           NaN

从程序的输出结果可以发现,P值远小于0.05,说明不同种类花的SepalLengthCm特征均值不完全相等,可以使用多重比较对比哪些花之间的均值不同,程序如下:

iris_hsd = pairwise_tukeyhsd(endog=Iris.SepalLengthCm,  #数据
                             groups=Iris.Species,       #分组
                             alpha = 0.05)              #显著性水平
print(iris_hsd)

运行结果如下:

   Multiple Comparison of Means - Tukey HSD, FWER=0.05   
=========================================================
  group1     group2   meandiff p-adj lower  upper  reject
---------------------------------------------------------
    setosa versicolor     0.93   0.0 0.6862 1.1738   True
    setosa  virginica    1.582   0.0 1.3382 1.8258   True
versicolor  virginica    0.652   0.0 0.4082 0.8958   True
---------------------------------------------------------

从输出结果可以发现,3种花对应特征的均值,两两之间均是不相等的,针对 pairwise_tukeyhsd()函数获得的多重比较结果,可以使用其 plot_simultaneous()方法,可视化出多重比较的图像,运行下面的程序后,结果如图5-3所示。

## 可视化出对比图像
iris_hsd.plot_simultaneous()
plt.grid()
plt.show()

运行结果如下:

 图5-3 单因素多重比较结果可视化

从图5-3中可以发现,3种花之间的均值不仅不相同,而且setosa的均值最小, virginica的均值最大。
双因素方差分析就是考虑两个因素对结果的影响,其基本思想是通过分析不同来源的变异对总变异的贡献大小,确定可控因素对研究结果影响的大小。双因素方差分析分两种情况:一种是不考虑交互作用,即假定因素A和因素B的效应之间是相互独立的;另一种是考虑交互作用,即假定因素A和因素B的结合会产生一种新的效应。
针对双因素方差分析结果可以使用下面的程序来完成。在程序中,首先利用随机数对鸢尾花数据生成新的分类因素Group,在进行双因素方差分析的检验表达式中,使用

"SepalLengthCm~Species * Group",表示不仅要考虑两个因素的单独作用,还要考虑两个因素的交互作用。

##  多因素方差分析(2因素方差分析)
## 为鸢尾花生成一个新的随机分组变量
np.random.seed(123)
Iris["Group"] = np.random.choice(["A","B"],size = 150)
## 比较不同种类的花下SepalLengthCm特征的均值是否相等
model = smf.ols("SepalLengthCm ~ Species * Group", data=Iris).fit()
aov_table = sm.stats.anova_lm(model, typ=2)
print(aov_table)

## 从结果中可发现,Species下差异是显著的;Group和Species:Group下差异是不显著的

运行结果如下:

                  sum_sq     df           F        PR(>F)
Species        60.182055    2.0  113.784895  2.286604e-30
Group           0.687846    1.0    2.600992  1.089863e-01
Species:Group   0.186779    2.0    0.353139  7.030862e-01
Residual       38.081575  144.0         NaN           NaN

运行程序后,从结果中可以发现, Species因素下差异是显著的; Group因素和Species:Group (Species 和 Group的交互作用)因素下差异是不显著的。
针对双因素影响的数据,可以使用sns.catplot()函数,对比不同分组之间的均值差异,程序如下,程序运行后的结果如图5-4所示。

## 使用pointplot可视化不同分组数据之间均值的差异
sns.catplot(x="Species", y="SepalLengthCm",hue="Group",
            markers=["s", "o"], linestyles=["-", "--"],
            kind="point", data=Iris,
            height=5,aspect=1.4)  # 调整图像大小
plt.grid()
plt.title("多因素方差分析")
plt.show()

运行结果如下:

图5-4 多因素方差分析结果可视化

可以发现花的类别变量对数据的均值有明显的影响,但是Group变量对均值的影响没有表现出明显的差异。 

2 一元回归

一元回归主要研究一个自变量和一个因变量之间的关系,其中一元线性回归分析两个变量之间的线性关系,一元非线性回归分析因变量和自变量的非线性关系,如指数关系、对数关系等。本节将使用实际的数据介绍如何使用Python,完成数据的一元线性回归分析和一元非线性回归分析。

2.1 一元线性回归

针对一元线性回归,可以使用smf.ols()来完成,下面使用鸢尾花数据中的PetalWidthCm和 PetalLengthCm 两个变量,建立一元线性回归模型,程序如下,在程序中使用"PetalWidthCm~PetalLengthCm"定义了回归模型的形式,并使用smf.ols()建立了回归模型,用fit方法拟合了数据集Iris,最后使用 print(Im1.summary())输出模型的结果,只使用很简单的两行代码就完成了模型 的建立和求解。

数据提取文件:

链接:https://pan.baidu.com/s/17yd_aZ4TO3m9B4j-uqsbUA 
提取码:whj6

## 读取数据
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
## 建立一元线性回归模型
lm1 = smf.ols("PetalWidthCm ~ PetalLengthCm",data=Iris).fit()
print(lm1.summary())

## 方差分析结果显示模型是显著的,t检验表明变量的系数是显著的

运行结果如下:


                
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值