Python 回归,python中回归分析的算法

  Python 回归,python中回归分析的算法

  为什么不是普通的线性回归?

  使用普通的线性回归技术,必须保证回归技术对研究问题的适用性,才能相信回归结果是可靠的。为了确定回归技术的适用性,我们需要对回归分析进行诊断。诊断内容是线性回归的六个最基本假设是否成立,即

  误差项是预期为0的随机变量;

  对于解释变量的所有观测值,随机误差项具有相同的方差;

  随机误差项互不相关;

  解释变量是确定性变量,不是随机变量,与随机误差项无关。

  解释变量之间没有精确(完全)的线性关系,即解释变量的样本观测矩阵是满秩矩阵;

  随机误差项服从正态分布。

  那么,当我们遇到被解释变量为分类变量的特殊情况时,如果可以使用普通的线性回归技术,就必须满足上面提到的六个基本假设。我们来做一个简单的模拟。

  我使用火箭发射成功或失败的数据集进行下一次测试。首先,我们读取数据集。

  将numpy作为np导入

  进口熊猫作为pd

  data=PD . read _ CSV( challenger . CSV )

  data . drop(columns=[ Unnamed:0 ],inplace=True)

  数据集如下:

  num _ at _ riskdisstresslaunch _ temple AK _ check _ pressure order

  06170502

  16069503

  26068504

  36067505

  46072506

  560731007

  660701008

  761572009

  8616320010

  9617020011

  10607820012

  11606720013

  13606720015

  14607520016

  15607020017

  16608120018

  17607620019

  18607920020

  19607520021

  20607620022

  21615820023

  我们使用statsmodels提供的线性回归分析API来完成回归,然后进行简单的可视化。

  将statsmodels.formula.api作为smf导入

  model=smf . ols( distress ~ num _ at _ risk launch _ temp leak _ check _ pressure order ,data=data)

  result=model.fit()

  #结果.摘要()

  将matplotlib.pyplot作为plt导入

  plt.figure(figsize=(10,8),dpi=80)

  PLT . scatter(result . fitted values,result.resid)

  plt.plot([-0.3,1.3],[0,0],color=black )

  plt.show()

  通过观察图像,我们可以很容易地看到,当使用普通的线性回归技术来完成离散变量的回归时,上面提到的第一个和第二个假设已经被打破,即

  误差项的预期值不是0;

  随机误差项的方差随着对解释变量的观察而变化。

  因此,在分类变量回归的情况下,使用普通的线性回归似乎不再是一种非常合适的方法,所以我们使用链接函数来构造一种适合分类变量的回归技术。

  链接功能是什么?

  考虑最简单的二元分类问题。如果我们用普通的线性回归技术来回归一个二元分类问题,结果会如上图。预测值不是类别标签,而是一条线上的任意一点,这显然不是我们想要的结果。

  为了解决这个问题,我们引入了链接函数的概念。什么是链接功能?实际上是普通线性回归结果的非线性变化,目的是将现象回归的结果缩放到0到1之间的值。有了这个变化,回归后的拟合值就有意义了,因为这个数可以看作是被分到指定类别的概率,可以支持我们对类别预测的判断。

  有两个最流行的链接函数,一个是Probit,另一个是Logit(逻辑回归),它们的函数表达式是:

  probit(z)=(z)=z122exp(z22)probit\left( z \ right)=\ phi \ left(z \ right)=\int^{z}_{-\infty } \ frac { 1 } exp \ left(-\ frac{z^{2}}{2} \ right)probit(z)=(z)=z 22 1 exp(2z 2)

  logit(z)=exp(z)1 exp(z)logit\left( z \右)=\ frac { \ exp(z)} { 1 \ exp \ left(z \ right)} logit(z)=1 exp(z)exp(z)

  对应的图像是:

  其实两者差别不大,Probit相对更陡,Logit的变换更软。

  如何实现(statsmodelssklearn)?

  接下来我将介绍Python中分类变量回归的两种技术,首先介绍必要的工具和数据。

  进口熊猫作为pd

  将numpy作为np导入

  从实例导入支撑向量机

  从sklearn.metrics导入roc曲线,auc

  将matplotlib.pyplot作为血小板计数导入

  将海生的作为社交网站(Social Network Site的缩写)导入

  来自sklearn。预处理导入标签_二进制化

  来自sklearn.metrics导入混淆_矩阵,分类_报告

  从sklearn.neural_network导入MLP分类器

  从sklearn.model_selection导入训练_测试_拆分

  来自sklearn。预处理导入标准缩放器

  来自sklearn.linear_model导入逻辑回归

  将statsmodels.api作为钐导入

  从统计模型。离散的。离散模型导入逻辑,概率,逻辑

  从皮拉布导入数学编程语言(Mathematical Programming Language)

  导入plotly.graph_objects as go

  导入警告

  将绘制精美的图表作为数学编程语言(Mathematical Programming Language)导入

  警告.过滤器警告("忽略")

  #设置风格、尺度

  sns.set_style(whitegrid )

  sns.set_context(paper )

  酒=PD。read _ CSV(酒质-红色。CSV’)

  数据可在下方链接下载:

  红酒质量数据集下载

  统计模型(统计学分析场景推荐)

  先把问题简化为一个二分类问题

  X=wine.iloc[:-1]

  Y=葡萄酒[质量]

  binary_Y=[]

  对于范围内的我(len(Y)):

  如果Y[i]=5:

  binary_Y.append(0)

  否则:

  binary_Y.append(1)

  概率单位

  概率单位模型=概率单位(二进制y,sm.add常数(十))

  结果=probit_model.fit()

  结果。摘要()

  分对数

  logi _ model=Logit(binary _ Y,sm.add_constant(X))

  result=logist _ model.fit()

  结果。摘要()

  多法线

  MNLogit就是当分类变量非二分类,而是多分类时的符号逻辑的回归方法,具体实现很简单。(输出表很长,就不展示了)

  mnLogit_model=MNLogit(Y,sm.add_constant(X))

  result=mnLogit_model.fit()

  结果。摘要()

  sklearn(机器学习场景推荐)

  实例也封装有符号逻辑的回归的方法,也可以实现统计模型类似的功能,但是可视化表格却非常的差劲,因此在统计学分析(推论)里面我们一般不太使用sklearn。但是如果把回归技术用于预测目的的话,我们也是可以选择实例的。以下展示使用实例进行多变量符号逻辑的回归的模型训练效果。

  logit _ model=逻辑回归(multi _ class=多项式,惩罚=l2 )

  logit_model.fit(X,Y)

  predict=logit_model.predict(X)

  Y _ one _ hot=label _ binary ize(Y,np.arange(3,9))

  predict _ proba=logit _ model。预测_ proba(X)

  fpr,tpr,threshold=roc _ curve(y _ one _ hot。ravel()、predict_proba.ravel()) ###计算真正率和假正率

  roc_auc=auc(fpr,tpr) ###计算皇家对空观察队曲线下的面积的值

  mpl。RC params[ font。family ]=无衬线

  mpl。RC params[ font。sans-serif ]= NSimSun,Times New Roman

  font={family :无衬线,

  颜色: k ,

  重量:粗体,

   size: 20,}

  图表()

  plt.figure(figsize=(12,10),dpi=80)

  plt.plot(fpr,tpr,color=darkorange ,

  lw=5,label=ROC曲线(面积=% 0.3f)% ROC _ AUC)# # #假正率为横坐标,真正率为纵坐标做曲线

  plt.plot([0,1],[0,1],color=navy ,lw=3,linestyle= -)

  plt.xlim([-0.01,1.01])

  plt.ylim([-0.01,1.01])

  plt.xticks(fontsize=12)

  plt.yticks(fontsize=12)

  plt.xlabel(假阳性率,fontsize=15)

  plt.ylabel(真阳性率,fontsize=15)

   Sklearn计算的皇家对空观察队曲线,fontsize=18)

  plt.legend(loc=右下角,fontsize=15)

  plt.show()

  原文链接:https://博客。csdn。net/weixin _ 41677876/文章/详情/106686250

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: