机器学习算法介绍(附上R和python程序)-第二期

翻译/编辑/原创Vivian Ouyang

这个介绍主要是方便刚入行的数据科学家。通过这个指导,使你直接解决机器学习的问题以及从中获得经验。而且我会尽量用简单易懂的方式来介绍每一个算法,不会涉及很多数学,而是帮助你从原理上理解每个算法,每一个算法都附上R和Python的程序来帮助你直接去应用程序解决问题。一般经常使用的机器学习算法有以下11种

1.线性回归Linear Regression

2.逻辑回归Logistic Regression

3. 决策树Decision Tree

4.随机森林Random Forest

5.支持向量机SVM

6.朴素贝叶斯Naive Bayes

7.最近邻居法KNN

8.K平均算法K-Means

9.神经网络Neural Networks

10.降维算法Dimensionality Reduction    Algorithms

11.梯度提升Gradient Boost & Adaboost

第二期我们介绍逻辑回归(2)。逻辑回归和线性回归其实都属于广义线性模型的一种,而在决策制定等领域,逻辑回归的应用更加广泛。所以在第一期学习了线性回归之后很自然的就是学习逻辑回归了。 


什么是逻辑回归?

逻辑回归是一种分类的算法,它用给定的输入变量(X)来预测二元的结果(Y)(1/0,是/不是,真/假)。我们一般用虚拟变量来表示二元/类别结果。你可以把逻辑回归看成一种特殊的线性回归,只是因为最后的结果是类别变量,所以我们需要用胜算比取对数来作为因变量(Dependent Variable)。简单来说,逻辑回归是利用logit 函数拟合数据来预测某一个事件发生的概率的。

逻辑回归的起源

逻辑回归其实是属于广义线性模型(Generalized Linear Model)的一部分。1972年 Nelder和Wedderburn发明了这种方法来处理那些用线性回归没法处理的问题。因为如果你用线性回归去处理逻辑回归的二元或类别输出变量时候,最后的结果就是你会得到极低的校正R平方。当然广义线性模型是一个统计上用的非常广的模型,它包含了不止线性回归,逻辑回归,还有泊松回归,ANOVA等等,感兴趣的可以继续进行这方面的阅读。

广义线性回归的基本公式是

g(E(y)) = α + βx1 + γx2

这里,g()是联系函数(link function),E(y) 是目标输出变量Y的期望值,而α + βx1 + γx2 是输入变量的线性组合(α,β,γ 都是需要用数据估计的参数)。联系函数的作用是将输出变量Y的期望值和输入变量X的线性组合可以连接起来,起到一个桥的作用。

主要备注:

I.广义线性模型(简称GLM)因为有联系函数的存在,所以不需要输出变量和输入变量一定有线性关系。但是它假设输出变量Y的期望值算出来的联系函数的值必须和输入变量有线性关系。

II. GLM并不使用回归分析中经常使用的最小二乘法来估计模型参数的值,而是使用最大似然法则来估计参数的值(Maximum Likelihood Estimation,简称MLE)。MLE是统计学中只要涉及到参数模型一定都要搞清楚的重要基础概念。大部分的参数模型都会假设随机变量的分布,有了分布之后能写出模型的似然函数,而模型中的参数就可以用最大似然函数来估计。

III.因为有联系函数的存在,所以输出变量Y也不需要一定是正态分布的。

IV.模型中的误差项必须要是独立分布的但是也不需要假设正态分布。而在线性回归中,误差项是要假设独立分布加正态分布的。

逻辑回归的定义与表示

为了便于没有太多统计背景的朋友们理解,下面会用一个简单的例子来说明。我们提供一个1000个顾客的样本。我们需要预测是否一个顾客会买杂志,这个是我们的类别结果(买/不买)。对于这个问题,我们会使用逻辑回归如下

g(y) = βo + β(Age)        ---- (a)

这里的输入变量是年龄(Age)。g()是联系函数。这个函数包含两个东西,买杂志的概率(p)和不买杂志的概率(1-p)。概率p需要满足下列标准:

1.概率p大于0

2.概率p小于等于1

有了概率的这两个条件,下面我们来写出概率p的函数。首先因为概率是总是大于0的,逻辑回归里面使用一个指数函数的形式表示概率p,因为对于任何输入变量,它的指数函数形式永远不会是负值。这个就满足了条件1

p = exp(βo + β(Age)) = e^(βo + β(Age))    ------- (b)

由条件2,概率p不能大于1,所以我们需要对p做下面的变换

p  =  exp(βo + β(Age)) / exp(βo + β(Age)) + 1  

   =  e^(βo + β(Age)) / e^(βo + β(Age)) + 1    ----- (c)

由(a),(b),(c)可以得到,概率p可以写成

p = e^y/ 1 + e^y --- (d)

而(d)就是我们常说的logit函数。然后我们继续做以下变换

我们对这个等式两边同时去对数的话,可以得到

log(p/(1-p))就是所谓的联系函数(link function),对于输出变量取对数的变换有利于我们对于非线性的关联性用线性模型去拟合。所以我们新的输出变量是Y而不是原来的p。Y可以写成

上面这个式子就是逻辑回归使用的方程式。这里(p/1-p)是所谓的比值比,或者叫机会比(odds ratio),当比值比取对数之后是正值的话,那么意味着(p/1-p)>1,那么事件发生的概率p是大于50%的。我用一个用的很多逻辑回归的概率图来说明逻辑回归的函数永远是在0和1 之间(因为是为了拟合概率)


怎么评估逻辑回归模型的的表现

在你建立好逻辑回归模型之后,很自然的我们需要去评估这个模型的表现好不好,不管你用的是什么软件(SAS,R,Python),你总是需要看

1.AIC (Akaike Information Criteria) AIC准则

AIC其实是和校准R平方很类似的一个测量量,校正R平方可以理解为,给进入模型的输入变量一个惩罚机制,你加入的输入变量X越多,我的惩罚越大。因此校正R平方可以理解为计算真正和Y有关的输入变量X可以解释的Y的百分比。AIC同样会给出这样的一个惩罚机制,你加入的输入变量个数越多,惩罚越大。AIC可以简单表示为

其中k是你模型的参数的个数(可以简单理解为你的输入变量X1,X2,。。。Xk的个数),而L是你的似然函数(likelihood),一般似然函数越大说明模型拟合的越好。 AIC越小,说明你的模型越好。

2.只有常数项的模型的偏差值(Null Deviance)/所拟合的模型的偏差值(Residual Deviance)

只有常数项的模型偏差值是指我们只用常数项去拟合输出变量Y的值与实际输出变量Y的偏差,这个偏差越小,模型拟合的越小。而所拟合的模型的偏差值是指用含有输入变量X的模型拟合的输出变量Y与实际输出变量Y的偏差,这个值也是越小,模型越好。

3.混淆矩阵 (confusion matrix)

混淆矩阵实际上就是帮助我们判别预测值和实际值相比到底预测对了多少。一个完美的分类模型就是,如果一个样本实际上(Actual)属于good,也预测成(Predicted)good,处于类别bad,也就预测成bad。但在实际的应用中,一些实际上是good的,根据我们的模型,却预测他为bad,对一些原本是bad的,却预测他为good。我们需要知道,这个模型到底预测对了多少,预测错了多少,混淆矩阵就是把所有这些信息都归到一个表里如下

从上表我们可以得出几个常用的判别量:

准确(分类)率(accuracy)=正确预测的正反例数/总数

=(a+d)/(a+b+c+d)

误分类率(Error rate)=错误预测的正反例数/总数

=(b+c)/(a+b+c+d)

覆盖率或者灵敏度(Recall, True Positive Rate or Sensitivity)=正确预测到的正例数/实际正例总数

=d/(c+d)

命中率(precision or Positive Predicted Value or PV+)=正确预测到的正例数/预测正例总数

=d/(b+d)

负例的覆盖率或特异度(Specificity or True Negative Rate)=正确预测到的负例个数/实际负例总数

=a/(a+b)

负例的命中率(Negative predicted value or PV-)=正确预测到的负例个数/预测负例总数

=a/(a+c)

4. ROC 曲线

接收者操作特征曲線(receiver operating characteristic curve or ROC)是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。如下是一个ROC曲线

ROC曲线以下的面积大小(Area under curve 或者 AUC)可以表示模型的是否表现好,面积越大说明模型的预测表现越好。最完美的预测模型是覆盖率或者灵敏度或者真阳性率为1而假的阳性率(1-特异度)为0.那么ROC曲线就会是一条垂直上去的线。当然一般的模型是没法到达这样的表现的。

备注:虽然ROC是很好的衡量模型表现的方法,但是它也有自己局限性,尤其是在阳率很稀少的样本中,如果你画ROC也可能得到很高的AUC,但是不代表你的模型预测的好。

下面我就介绍怎么用python和R来玩转线性回归。

python 程序

#加载需要的包

from sklearn.linear_model import LogisticRegression

#假设在训练样本中你有输入变量X还有输出变量Y,在检验样本中你有输入变量x_test

#创建逻辑回归的目标模型

model=LogisticRegression()

# 用训练样本来生成你的模型与相应的参数

model.fit(X,y)

model.score(X,y)

#显示参数和截距

print('Coefficient:\n',model.coef_)

print('Intercept:\n',model.intercept_)

##用训练的模型来预测模型中的输出变量Y#

predicted= model.predict(x_test)


R code

#训练样本

x <- cbind(x_train,y_train)

# 用训练样本来生成你的模型与相应的参数

logistic<-glm(y_train~.,data= x,family='binomial')

# 显示逻辑回归的结果

summary(logistic)

#用训练的模型来预测模型中的输出变量Y#

predicted=predict(logistic,x_test)

下面我将使用Kaggle上的很有名的泰坦尼克号数据来演示一个多元逻辑回归的学习案例。每一行代表一个乘客,我们需要用提供的这些变量来预测最终游客的生还率。这个数据集我会附在文章的最后,可以下载。一些变量的解释如下

survival:生存  0 = 死, 1 = 生

pclass: 几等仓的票,有1,2,3等仓  class1 = 1st, 2 = 2nd, 3 = 3rd

sex:性别

Age:年龄

sibsp:有多少兄弟姐妹/配偶在船上

parch:有多少父母/孩子在船上

ticket: 船票号码

fare:乘客票价

cabin:船号码

embarked: 启航港口 C = Cherbourg, Q = Queenstown, S = Southampton

下面是运行的R程序

#加载需要的包

library(glmulti)

#载入需要的数据集,test是预测数据集,而train是训练数据集

train<-read.csv("../input/train.csv")

test<-read.csv("../input/test.csv")

#查看训练数据集

head(train)

#对训练集和测试集的变量做变换

train$Pclass<-factor(train$Pclass)

train$Sex<-factor(train$Sex)

train$Embarked<-factor(train$Embarked)

train$Survived<-factor(train$Survived)

test$Pclass<-factor(test$Pclass)

test$Sex<-factor(test$Sex)

test$Embarked<-factor(test$Embarked)

#把缺失的年龄变为-1##

train$Age[is.na(train$Age)]<--1

#用中位数来补上船票价格的缺失值

train$Fare[is.na(train$Fare)]<-median(train$Fare,na.rm=TRUE)

train$Embarked[train$Embarked==""]="S"

test$Age[is.na(test$Age)]<--1

test$Fare[is.na(test$Fare)]<-median(test$Fare,na.rm=TRUE)

test$Embarked[test$Embarked==""]="S"

#逻辑回归

model<-glm(Survived ~ Sex + Pclass + Age + SibSp + Parch + Fare + Embarked, data = train, family = "binomial")

#在预测数据集中预测乘客的生还,概率大于0.5,生还,概率小于0.5,不生还

test$Survived <- ifelse(predict(model, test, type="response")>0.5,1,0)

前几行的结果如下

泰坦尼克的数据可以在本文下载,衔接如下

链接: https://pan.baidu.com/s/1hsKex3u 密码: kewn

下一期内容是决策树和随机森林。Continued~

来源:

1.https://www.analyticsvidhya.com/

2.Wiki

3.Kaggle

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容