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

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

作者: 美漂的武汉伢 | 来源:发表于2017-06-25 00:46 被阅读0次

    翻译/编辑/原创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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/dyhyqxtx.html