Logistic Regression

来源:互联网 发布:淘宝国际版apk 编辑:程序博客网 时间:2024/06/02 00:58

LR是机器学习的入门分类器,同时也是实际应用中十分常见的分类器,常用于二分类。LR属于广义线性回归,解决了线性回归不擅长的分类问题。

 

1.    函数模型

 

LR使用的是sigmoid函数模型:

 


假设y可以取0或1。其概率分别用P(y=0)和P(y=1)表示,则:

 

 

假设样本独立,则有似然函数:

 

 

取对数后得到对数似然函数:

 

 

对THETA求偏导后:

 

 

有了关于THETA的偏导公式后,我们就可以得到参数THETA的学习公式:

 

 

上式和线性回归的学习公式的形式一致,因为LR属于广义上的线性回归。线性回归是基于高斯分布的样本建模,而LR则是基于Bernoulli分布。而不论是高斯分布,二项分布,还是Poisson分布,都是指数族分布,均属于线性模型范畴,是general linear model。因此可以参照线性回归写出BGD以及SGD的公式。

 

事件发生的几率,被定义为事件发生的概率与不发生概率的比值。如果对于sigmoid函数求对数几率,则会发现其对数几率为线性模型:

 

 

因此LR被认为是对数线性模型。反过来看,实际上LR模型的建立,就是假设模型满足对数线性的情况下,对p求解得到的表达式。

 

2.    Loss Function

 

如果对y的类别用1与-1表示,此时似然函数为:

 

 

对数似然为:

 

 

若表示为

 

 

则有:

        

 

对似然求最大即是对其负值求最小。因此loss function可以被表示为:

 

 

3.    Soft-max

 

使用LR处理多分类问题时,可以选择做多次二分类,也可以选择直接使用soft-max进行多分类。

 

对于K分类问题,假设第k类的参数为THETAk,此时有维度为k*n的二维矩阵,则事件k发生概率为:

 

 

公式中,第k类的指数化结果与所有类指数化结果的比值即为分类为第k类的概率值。同理可求其似然函数:

 

 

对数似然:

 

 

对THETA求偏导:

 

4. Iris数据分类


数据选用的是Iris数据,数据格式为:


5.1,3.5,1.4,0.2,Iris-setosa


前面的数据分别为该花的petal和sapel的长宽值,最后一项为label,是花的类型。总数据量为150条,三种花每种50条。使用pandas读取数据,数据中的data.value被np.split()分为两份,前4列分给x,后面的分给y。之后构建LR模型,并使用x,y数据进行训练。这里将数据中的80%作为训练集,剩余20%作为测试集。代码如下:


import numpy as npimport pandas as pdfrom sklearn.pipeline import Pipelinefrom sklearn.linear_model import LogisticRegressionfrom sklearn.preprocessing import StandardScaler, PolynomialFeaturesfrom sklearn.model_selection import train_test_splitif __name__ == "__main__":    path = 'iris.data'    data = pd.read_csv(path, header=None)    # print('Data:',data)    data[4] = pd.Categorical(data[4]).codes    x, y = np.split(data.values, (4,), axis=1)    # print('X:',x)    # print('Y:',y)    x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8, random_state=1)    lr = Pipeline([                   ('sc', StandardScaler()),                   ('poly', PolynomialFeatures(degree = 2)),                   ('clf', LogisticRegression())    ])    # ravel the matrix y as 1-D matrix    lr.fit(x_train,y_train.ravel())    # result of classification    y_hat = lr.predict(x_test)    # np.set_printoptions(suppress=True)    # print('y hat =\n', y_hat)    # print('y ravel:\n', y.ravel())    print('Accuracy=',np.mean(y_hat == y_test.ravel()))


最终结果:Accuracy = 0.967