原文链接:http://tecdat.cn/?p=23449 

本文答复了对于逻辑回归的问题:它与线性回归有什么不同,如何在R中用glm()函数拟合和评估这些模型等等?

Logistic回归是机器学习从统计学畛域的一种技术。它是用一个或多个解释变量对二项式后果进行建模的一种弱小的统计办法。它通过应用逻辑函数预计概率来掂量分类因变量和一个或多个自变量之间的关系,这就是逻辑散布。

本R教程将领导你实现逻辑回归的简略执行。

  • 你将首先摸索逻辑回归背地的实践:你将理解更多对于与线性回归的区别以及逻辑回归模型的样子。你还会发现多指标和序数逻辑回归。
  • 接下来,你将解决R中的逻辑回归问题:你不仅要摸索一个数据集,还要应用R中弱小的glm()函数拟合逻辑回归模型,评估后果并解决过拟合问题。

提醒:如果你有趣味将你的线性回归技能进步到一个新的程度,也能够思考加入咱们的R语言课程!
 

回归剖析:简介

逻辑回归是一种回归剖析技术。回归剖析是一套统计过程,你能够用它来预计变量之间的关系。更具体地说,你用这套技术来模仿和剖析一个因变量和一个或多个自变量之间的关系。回归剖析帮忙你理解当一个自变量被调整而其余变量被固定时,因变量的典型值如何变动。

正如你曾经读到的,有各种回归技术。你能够通过观察三个方面来辨别它们:自变量的数量、因变量的类型和回归线的形态。

线性回归

线性回归是最广为人知的建模技术之一。简而言之,它容许你应用线性关系来预测Y的(均匀)数值,对于X的一个给定值,用一条直线。这条线被称为 "回归线"。

因而,线性回归模型是y=ax+b。该模型假如因变量y是定量的。然而,在许多状况下,因变量是定性的,或者换句话说,是分类的。例如,性别是定性的,取值为男性或女性。

预测一个察看值的定性反馈能够被称为对该察看值进行分类,因为它波及到将察看值调配到一个类别或等级。另一方面,常常用于分类的办法首先预测定性变量的每个类别的概率,作为进行分类的根底。

线性回归不可能预测概率。例如,如果你应用线性回归为二元因变量建模,所产生的模型可能不会将预测的Y值限度在0和1之内。 这里就是逻辑回归发挥作用的中央,你能够失去一个反映事件产生概率的概率分数。

Logistic逻辑回归

逻辑回归是分类技术的一个实例,你能够用它来预测一个定性的反馈。更具体地说,逻辑回归是对性别属于某个特定类别的概率建模。

这意味着,如果你想做性别分类,其中反馈性别属于男性或女性这两个类别中的一个,你将应用逻辑回归模型来预计性别属于某个特定类别的概率。

例如,给定长头发的性别的概率能够写成:。

Pr(gender=female|longhair)(缩写为p(longhair))的值将在0和1之间。那么,对于任何给定的longhair值,能够对性别进行预测。

鉴于X是解释变量,Y是因变量,那么你应该如何建设p(X)=Pr(Y=1|X)和X之间的关系模型?线性回归模型表示这些概率为。

这种办法的问题是,任何时候对编码为0或1的二元因变量进行直线拟合,原则上咱们总是能够预测X的某些值的p(X)<0,其余值的p(X)>1。

为了防止这个问题,你能够应用logistic函数来建设p(X)的模型,对于X的所有值,它的输入在0和1之间。

对数函数总是会产生一个S型曲线,所以无论X的值是多少,咱们都会失去一个正当的预测。

上述方程也能够重构为:

数量

被称为几率比,能够在0和∞之间取任何值。靠近0和∞的几率值别离示意p(X)的概率非常低和十分高。

通过从上式中对两边取对数,你能够失去。

左手边被称为Logit。在一个逻辑回归模型中,减少一个单位的X会使对数扭转0。但无论X的价值如何,如果1是正的,那么减少X将与减少P(X)相干,如果1是负的,那么减少X将与缩小P(X)相干。

系数0和1是未知的,必须依据现有的训练数据来预计。对于逻辑回归,你能够应用最大似然,一种弱小的统计技术。让咱们再来看看你的性别分类的例子。

你寻求0和1的估计值,将这些估计值插入p(X)的模型中,对于所有的女性样本,产生一个靠近于1的数字,对于所有的非女性样本,产生一个靠近于0的数字。

能够用一个叫做似然函数的数学方程来正式化。

抉择估计值0和1是为了使这个似然函数最大化。一旦系数被预计进去,你就能够简略地计算出在任何长发的状况下是女性的概率。总的来说,最大似然法是拟合非线性模型的一个十分好的办法。

多项式Logistic回归

到目前为止,本教程只关注了二项式逻辑回归,因为你是将实例分类为男性或女性。多项式Logistic回归模型是二项式Logistic回归模型的一个简略扩大,当探索性变量有两个以上的名义(无序)类别时,你能够应用该模型。

在多项式逻辑回归中,探索性变量被虚构编码为多个1/0变量。除了一个类别外,所有类别都有一个变量,所以如果有M个类别,就会有M-1M-1个虚构变量。每个类别的虚构变量在其类别中的值为1,在所有其余类别中的值为0。有一个类别,即参考类别,不须要它本人的虚构变量,因为它是由所有其余变量都是0来惟一辨认的。

而后,多叉逻辑回归为每个虚构变量预计一个独自的二元逻辑回归模型。后果是M-1M-1二元逻辑回归模型。每个模型都传播了预测因素对该类别胜利概率的影响,与参考类别相比拟。

有序logistic逻辑回归

除了多叉逻辑回归,你还有有序逻辑回归,它是二叉逻辑回归的另一个延长。有序回归是用来预测具备 "有序 "的多个类别和自变量的因变量。你曾经在这种类型的逻辑回归的名称中看到了这一点,因为 "有序 "意味着 "类别的程序"。

换句话说,它被用来剖析因变量(有多个有序档次)与一个或多个自变量的关系。

例如,你正在进行客户访谈,评估他们对咱们新公布产品的满意度。你的工作是向受访者提出一个问题,他们的答案介于称心-称心或不称心-十分不称心之间。为了很好地概括答案,你在答复中退出了一些等级,如十分不称心,不称心,中立,称心,十分称心。这有助于你察看类别中的天然秩序。

用glm进行R语言的Logistic回归

在本节中,你将钻研一个二元逻辑回归的例子,你将用ISLR包解决这个问题,它将为你提供数据集,glm()函数个别用于拟合狭义线性模型,将用于拟合逻辑回归模型。

加载数据

首先要做的是装置和加载ISLR包,它有你要应用的所有数据集。

在本教程中,你将应用股市数据集。该数据集显示了2001年至2005年间规范普尔500股票指数的每日收益率。

摸索数据

让咱们来摸索一下。names()对于查看数据框上的内容很有用,head()是对前几行的一瞥,而summary()也很有用。

 

summary()函数为你提供了数据框架上每个变量的简略总结。你能够看到有成交量,收盘价,和涨跌方向。你将应用 "涨跌方向 "作为因变量,因为它显示了自前一天以来市场是上涨还是上涨。

数据的可视化

数据可视化兴许是总结和理解你的数据的最快和最有用的办法。你将从独自摸索数字变量开始。

直方图提供了一个数字变量的柱状图,它被分成若干个局部,其高度显示了属于每个局部的实例的数量。它们对于取得一个属性的散布特色是很有用的。

for(i in 1:8)hist(Smarket\[,i\]

这是极难看到的,但大多数变量显示出高斯或双高斯的散布。

你能够用盒状图和盒须图以不同的形式来察看数据的散布。盒子包含了数据的两头50%,线显示了中位数,图中的须线显示了数据的正当范畴。任何在须线之外的点都是离群值。

for(i in 1:8) boxplot(Smarket\[,i\]

你能够看到,Lags和Today都有一个相似的范畴。除此之外,没有任何离群值的迹象。

缺失数据对建模有很大影响。因而,你能够应用缺失图来疾速理解数据集中的缺失数据量。X轴显示属性,Y轴显示实例。水平线示意一个实例的缺失数据,垂直块示意一个属性的缺失数据。

mis( col=c("blue", "red")

在这个数据集中没有缺失数据!

让咱们开始计算每一对数字变量之间的相关性。这些成对的相干关系能够绘制在相关矩阵图中,理解哪些变量在一起变动。

corrplot(correlations, method="circle")

应用点表示法,蓝色代表正相干,红色代表负相关。点越大,相关度越大。你能够看到矩阵是对称的,对角线是齐全正相干的,因为它显示了每个变量与本身的相关性。然而,没有一个变量是互相关联的。

咱们来做一个数据图。有一个pair()函数能够将Smarket中的变量绘制成一个散点图矩阵。在这种状况下,"涨跌方向",你的二元因变量,是色彩指标。

看起来这里没有什么关联性。该类变量来自于变量今日收益,所以涨和跌做了划分。

让咱们来看看按方向值细分的每个变量的密度散布。像下面的散点图矩阵一样,按方向绘制的密度图能够帮忙看到涨和跌的方向。它还能够帮忙理解一个变量的方向的重叠状况。

Plot(x=x, y=y, plot="density", scales=scales)

你能够看到,所有这些变量的方向值都是重叠的,这意味着仅凭一两个变量很难预测上涨或上涨。

建设Logistic回归模型

当初你调用glm.fit()函数。你传递给这个函数的第一个参数是一个R公式。在这种状况下,该公式表明方向是因变量,而滞后和成交量变量是预测因素。正如你在介绍中看到的,glm通常用于拟合狭义线性模型。

然而,在这种状况下,你须要明确示意你想拟合一个逻辑回归模型。你通过将族参数设置为二项式来解决这个问题。这样,你就通知glm()把拟合一个逻辑回归模型,而不是能够拟合glm的许多其余模型中的一个。

接下来,你能够做一个summary(),它通知你一些对于拟合的信息。

正如你所看到的,summary()返回每个系数的估计值、标准误差、z-score和p值。看上去没有一个系数是显著的。它还给出了有效偏差(仅指平均值的偏差)和残差偏差(蕴含所有预测因素的模型的偏差)。两者之间的差别十分小,而且有6个自由度。

你把glm.fit()的预测后果调配给glm.probs,类型等于因变量。这将对你用来拟合模型的训练数据进行预测,并给我一个拟合概率的向量。

你看一下前5个概率,它们十分靠近50%。

probs\[1:5\]

当初我将依据滞后期和其余预测因素对市场是上涨还是上涨做出预测。特地是,我将通过0.5的阈值将概率变成分类。为了做到这一点,我应用ifelse()命令。

 ifelse(probs > 0.5, "Up", "Down")

glm.pred是一个真和假的向量。如果glm.probs大于0.5,glm.pred调用 "Up";否则,调用 "False"。

在这里,你附上数据框架Smarket,并制作一个glm.pred的表格,这是上一个方向的上涨和上涨。你还能够取其中的平均值。

从表中看,对角线上的实例是你取得正确分类的中央,而对角线外的实例是你分类谬误的中央。看起来你犯了很多谬误。平均值给出的比例是0.52。

创立训练样本和测试样本

你怎么能做得更好呢?把数据分成训练集和测试集是一个好的策略。

#  生成训练和测试集train = Year<2005predict(glm.fit,                    newdata = Smarket\[!train,\],                    type = "response")

让咱们具体看看这个代码块。

  • train等于比2005年少的那一年。对于所有小于2005年的年份,你会失去一个true;否则,我会失去一个false。
  • 而后你用glm.fit()从新拟合模型,只是子集等于'train',这意味着它只拟合小于2005年的数据。
  • 而后你再次对glm.probs应用predict()函数来预测大于或等于2005年的残余数据。对于新的数据,你给了它Smarket,用!"train "作为索引(如果年份大于或等于2005,train为真)。你将类型设置为 "因变量 "以预测概率。
  • 最初,你对glm.pred再次应用ifelse()函数来生成上涨和上涨变量。

你当初做一个新的变量来存储测试数据的新子集,并把它叫做Direction.2005。因变量依然是方向。你制作一个表格并计算这个新测试集的平均值。

Direction.2005 = Direction\[!train\]

比以前的状况还蹩脚。怎么会呈现这种状况?

解决适度拟合的问题

好吧,你可能对数据进行了适度拟合。为了解决这个问题,你要拟合一个较小的模型,应用Lag1、Lag2、Lag3作为预测因子,从而撇开所有其余变量。代码的其余部分是一样的。

#拟合一个较小的模型glm(family = binomial, subset = train)

好吧,你失去了59%的分类率,不算太差。应用较小的模型仿佛体现得更好。

最初,你对glm.fit做一个summary(),看看是否有任何显著的变动。

没有什么变得很重要,至多P值更好了,表明对性能的预测有所提高。

结语

所以,这个对于应用glm()函数和设置族为二项式建设逻辑回归模型的R教程就完结了。glm()并不假如因变量和自变量之间的线性关系。然而,它假设logit模型中的链接函数和自变量之间存在线性关系,我心愿你能学到有价值的货色。


最受欢迎的见解

1.R语言多元Logistic逻辑回归 利用案例

2.面板平滑转移回归(PSTR)剖析案例实现

3.matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)

4.R语言泊松Poisson回归模型剖析案例

5.R语言混合效应逻辑回归Logistic模型剖析肺癌

6.r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现

7.R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病

8.python用线性回归预测股票价格

9.R语言用逻辑回归、决策树和随机森林对信贷数据集进行分类预测