《机器学习实战》学习笔记---Logister回归

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38215395/article/details/70136033

最近学习《机器学习实战》这本书,感觉到自己的数学知识严重不足。对于梯度上升法,大家可能都接触过,本章利用Python的实现很精炼,仅用一行代码就复现了,但里面包含了很多的数学推导,经过查找各方资料,现在终于搞明白了,也希望能帮助到对此感到困惑的朋友。


一、首先介绍一下Logistic回归算法:

  1. 算法主要思想:根据已知的数据建立分类边界线(面)的回归方程,依次进行分类。
  2. 优缺点:
    (1)优点:计算代价不高,易于理解和实现;
    (2)缺点:容易欠拟合。
  3. 分类器—Logistic函数
    截取书中的函数图像,如下图所示。很显然,当样本数量很大时,函数图像与单位阶跃函数很像。
    这里写图片描述
    函数表达式:
    h(z)=11+ez

    对于一个数据样本 x ,这里需要估计它的权重值 w ,那么估计函数可表示为:
    hw(x)=11+ewTx           (1)

    分类规则:
    resule={1      if hw(x)>0.50      if hw(x)<0.5
  4. 算法流程:
    这里写图片描述

  5. 算法实现:
    由算法流程可知,算法的关键就是寻求最优权重值 w 。那么下面将逐步推导出 w 的迭代公式。
    对于样本 x ,由(1)式可以得到它的概率分布:

    P(y=1|x,w)=hw(x); P(y=0|x,w)=1hw(x)

    将上式合并后可得到:
    P(y|x;w)=(hw(x))y(1hw(x))(1y),yϵ{0,1}      (2)

    根据式(2),对 w 进行最大似然估计:
    L(w)=P(Y|x:w)=iP(yi|xi;w)=i(hw(xi)yi)(1hw(xi)(1yi))

    为了计算方便,对上式取对数,得到:
    l(w)=log(L(w))=i=1m[yiloghw(xi)+log(1hw(xi))(1yi)]      (3)

    对上式,利用梯度上升法求解 w: ,梯度上升法公式:
    w=w+αwl(w)

    接下来计算 wl(w):
    l(w)w=i=1m[yi1hw(xi)hww(1yi)11hw(xi)hw(xi)w]=i=1m[yi(1hw(xi))(1yi)hw(xi)hw(xi)(1hw(xi))]hww=i=1myihw(xi)hw(xi)(1hw(xi))xiewTxi(1+ewTxi)2     =i=1m(yihw(xi))xi                                       

    从而得到 w 的迭代公式:
    w=w+α(yhw(x))x              (4)

    其中, α 为步长, yhw(x) 为实际值与预测值之差,即书中所说的 error ,而 x 为数据样本。
    基于以上分析,就可利用Python实现算法了。

二、Python实现

这里仅列出利用梯度上升法求最优权重值的Python程序:
'''梯度上升法寻找最优权重值'''
  def Search(dataList,labeList):
    dataMat=mat(dataList)
    labeMat=mat(labeList).transpose()
    alpha=0.001
    maxIter=500
    m,n=shape(dataMat)
    weights=ones([n,1])
    w1=zeros(maxIter);w2=zeros(maxIter);w3=zeros(maxIter)
    for k in range(maxIter):
        h=sigFunc(dataMat*weights)
        error=labeMat-h
        weights=weights+alpha*dataMat.transpose()*error
    return weights

可以注意到,程序中求 w 的迭代过程: weights=weights+alphadataMat.transpose()error
其中 weights 为初值为1的 n1 维向量, alpha 为步长, dataMat 为样本数据 mn 维矩阵,转置后乘以 m1 维的误差向量。仅用一条语句就将 w 的迭代过程表现出来了,太精炼了!^-^

三、sklearn实现Logistic回归

def sklearn_Logistic():
    '''导入必要的包'''
    from sklearn import datasets
    import numpy as np
    from sklearn.model_selection import train_test_split

    '''加载sklearn自带的iris数据集'''
    iris=datasets.load_iris()
    x=iris.data
    y=iris.target
    '''将数据集分割,分割比例为0.3'''
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)

    '''数据标准化'''
    from sklearn.preprocessing import StandardScaler
    sc=StandardScaler()
    sc.fit(x_train)
    x_train_std=sc.transform(x_train)
    x_test_std=sc.transform(x_test)

    '''建立LR模型,并计算准确率'''
    from sklearn.linear_model import LogisticRegression
    lr=LogisticRegression(C=1000.0,random_state=0)
    lr.fit(x_train_std,y_train)
    print('模型准确率为: ', np.mean(lr.predict(x_test_std)==y_test))

输出:

模型准确率为:  0.977777777778

参考:
1、《Machine Learning in Action》 译名:《机器学习实战》 作者:Peter Harrington 译者:李锐 李鹏 曲亚东 王斌
出版社:人民邮电出版社
2、这篇文章介绍的很详细:http://blog.csdn.net/dongtingzhizi/article/details/15962797

猜你喜欢

转载自blog.csdn.net/weixin_38215395/article/details/70136033