logistic回归算法

1、数学推导

logistic回归算法是一种分类算法,主要用于二分类的实现,其数学模型为 p=h(\theta)=\frac{1}{1+e^{-\theta^Tx}}, g(z)=\frac{1}{1 + e^{-z}} , g(z)^{'} = g(z)(1-g(z)) ,

假设

p(y=1|x,\theta) = h_{0}(x)

p(y=0|x,\theta) = 1- h_{0}(x)

p(y|x,\theta) = (h_{0}(x))^y(1-(h_{0}(x))^{1-y}

根据似然函数

L(\theta)=p(y|x;\theta)=\prod_{i=1}^{m}h_{0}(x^{(i)})^{y^{(i)}}(1-h_{0}(x^{(i)})^{1-y^{(i)}}

取对数

l(\theta) = log(L(\theta))=\sum_{i=1}^{m}{(y^{(i)}logh_{0}(x^{(i)}) + (1-y^{(i)})log(1-h_{0}(x^{(i)}))}

求导数

\frac{\delta l(\theta)}{\delta \theta_{j}} = \sum_{i=1}^{m}{(\frac{y^{(i)}}{h_{0}(x^{(i)})}-\frac{1-y^{(i)}}{1-h_{0}(x^{(i)})})\frac{\delta h(x^{(i)})}{\delta \theta_j}}

 = \sum_{i=1}^{m}{(\frac{y^{(i)}}{h_{0}(x^{(i)})}-\frac{1-y^{(i)}}{1-h_{0}(x^{(i)})})\frac{\delta g(\theta^Tx^{(i)})}{\delta \theta_j}}

 = \sum_{i=1}^{m}{(y^{(i)}} - g(\theta^Tx^{(i)})x_{j}^{(i)}

logistic求解 \theta 可以使用梯度下降, \alpha 为学习率

\theta_{j} = \theta_{j} + \alpha(y^{(i)} - h_{0}(x^{i}))x_{j}^{(i)}


2、用python实现logistic回归

2.1LogisticRegression参数

在sklearn机器学习计算库中,已经实现logistic回归,LogisticRegression中有如下参数比较重要

2.1.1multi_class:

此参数决定了我们分类方式的选择,有ovr和multinomial两个参数,默认是ovr。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。

2.1.2、solver:

优化算法选择参数

liblinear

使用坐标下降法实现

lbfgs

拟牛顿法的一种,利用损失函数二阶导数及海森矩阵来迭代损失函数

newton-cg

拟牛顿法的一种,利用损失函数二阶导数及海森矩阵来迭代损失函数

sag

即随机梯度下降迭代损失函数

liblinear不需要导数的实现,可以使用L1和L2正则化。lbfgs、newton-cg、sag在求解的过程中需要用到损失函数的一阶或二阶导数,不能使用L1正则化,只能使用L2正则化。

同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化,所以当你有大量的样本,又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量,要么回到L2正则化。

2.1.3、penalty

即正则化选择参数,可选参数为'l1'和'l2'

2.1.4、tol

停止条件,默认我float,1e-4


2.2、python代码

我们通过代码实现对乳腺癌分类的应用,从Breast Cancer Wisconsin (Original) Data Set获取数据,基于病理数据,建立logistic算法模型对乳腺癌患者预测(复发4/正常2)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures

x_name = ['Clump_Thickness','Uniformity_of_Cell Size','Uniformity_of_Cell_Shape','Marginal_Adhesion','Single_Epithelial_Cell_Size','Bare_Nuclei','Bland_Chromatin','Normal_Nucleoli','Mitoses']
y_name = ['Class']
df = pd.read_table('./data/breast.txt',sep=',')
df.replace("?",np.nan,inplace=True)
df.dropna(how='any',inplace=True)
x = df[x_name]
y = df[y_name]

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0)

pip = Pipeline([('Poly',PolynomialFeatures()),('logistic',LogisticRegression(multi_class='ovr', penalty='l2', solver='lbfgs', tol=0.01))])
pip.fit(x_train,y_train)
ln_x_test = range(len(x_test))

y_predict = pip.predict(x_test)

plt.figure()
plt.plot(ln_x_test,y_test,'r.',label='R^2=' + str(pip.score(x_train,y_train)))
plt.plot(ln_x_test,y_predict,'b.',label='R^2=' + str(pip.score(x_test,y_test)))
plt.legend()
plt.show()


2.3、运行结果

文章被以下专栏收录