第六节–逻辑斯谛回归与最大熵模型
逻辑斯谛回归(logistic regression)是统计学习中的经典分类方法.最大熵是概率模型学习的一个准则.将其推广到分类问题得到最大熵模型(maximum entropy model).逻辑斯谛回归模型与最大熵模型都属于对数线性模型
一.逻辑斯谛回归模型
1.逻辑斯谛分布
首先介绍逻辑斯谛分布(logistic distribution)
逻辑斯谛分布:设是连续随机变量,服从逻辑斯谛分布是指具有下列分布函数和密度函数:
式中,为位置参数,为形状参数
逻辑斯谛分布的密度函数和分布函数的图形如下图所示.分布函数属于逻辑斯谛函数,其图形是一条S形曲线(sigmoid curve).该曲线以点为中心对称,即满足:
from IPython.display import Image
Image(filename="./data/6_1.png",width=500)
曲线在中心附近增长速度较快,在两端增长速度较慢.形状参数的值越小,曲线在中心附近增长得越快
2.二项逻辑斯谛回归模型
二项逻辑斯谛回归模型(binomial logistic regression model)是一种分类模型,由条件概率分布表示,形式为参数化的逻辑斯谛分布.这里随机变量X取值为实数,随机变量Y取值为1或0.我们通过监督学习的方法来估计模型参数
逻辑斯谛回归模型:二项逻辑斯谛回归模型是如下的条件概率分布:
这里,是输入,是输出,和是参数,w称为权值向量,b称为偏置,为w和x的内积
对于给定的输入实例x,按照公式可以求得和.逻辑斯谛回归比较两个条件概率值的大小,将实例x分到概率值较大的那一类
有时为了方便,将权值向量和输入下来给你加以扩充,仍记作w,x.即w=,.这时逻辑斯谛回归模型如下:
现在考查逻辑斯谛回归模型的特点,一个事件的几率(odds)是指该事件发生的概率与该事件不发生的概率的比值.如果事件发生的概率是p,那么该事件的几率是,该事件的对数几率(log odds)或logit函数是:
对逻辑斯谛回归而言得:
这就是说,在逻辑斯谛回归模型中,输出的对数几率是输入x的线性函数,或者说,输出的对数几率是由输入x的线性函数表示的模型,即逻辑斯谛回归模型
换一个角度看,考虑对输入x进行分类的线性函数w,x,其值域为实数域.注意这里.通过逻辑斯谛回归模型将线性函数w,x转换为概率:
这时,线性函数的值越接近正无穷,概率值就越接近1;线性函数的值越接近负无穷,概率值就越接近0.这样的模型就是逻辑斯谛回归模型
3.多项逻辑斯谛回归
上面介绍的逻辑斯谛回归模型是二项分类模型,用于二类分类.可以将其推广为多项逻辑斯谛回归模型(multi-nominal logistic regression model),用于多类分类.假设离散型随机变量的取值集合是,那么多项逻辑斯谛high模型是:
这里,
二项逻辑斯谛回归的参数估计法也可以推广到多项逻辑斯谛回归
二.最大熵模型
最大熵模型(maximum entropy model)有最大熵原理推导实现
最大熵原理是概率模型学习的一个准则.最大熵原理认为,学习概率模型时,在所有可能的概率模型(分布)中,熵最大的模型是最好的模型.通常用约束条件来确定概率模型的集合,所以最大熵原理也可以表述为在满足约束条件的模型集合中选取最大的模型
假设离散随机变量X的概率分布是,则其熵是:
熵满足下列不等式:
式中,是X的取值个数,当且仅当X的分布是均匀分布时右边的等号成立.这就是说,当X服从均匀分布时,熵最大
实例:假设随机变量X有5个取值,要估计取各个值的概率
Image(filename="./data/6_2.png",width=500)
可以继续按照满足约束条件下求等概率的方法估计概率分布.这里不再继续讨论.以上概率模型学习的方法正是遵循了最大熵原理
下图提供了用最大熵原理进行概率模型选择的几何解释.概率模型集合可由欧式空间中的单纯形表示.左图的三角形,一个点代表一个模型,整个单纯形代表模型集合.右图上的一条直线对应于一个约束条件,直线的交集相应于满足约束条件的模型集合.一般地这样的模型仍有无穷多个.学习的目的是在可能的模型集合中选择最优模型,而最大熵原理则给出最优模型选择的一个准则
Image(filename="./data/6_3.png",width=500)
2.最大熵模型的定义
假设分类模型是一个条件概率分布,表示输入,表示输出,和分别是输入和输出的集合,这个模型的是对于给定的输入,以条件概率输出
给定一个训练数据集:
学习的目标是用最大熵原理选择最好的分类模型
最大熵模型:假设满足所有约束条件的模型集合为
定义在条件概率分布上的条件熵为:
则模型集合中条件熵最大的模型称为最大熵模型,式中的对数为自然对数
三.代码实现
LR是经典的分类方法.回归模型:
其中wx线性函数:
1.数据加载
%matplotlib inline
from math import exp
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# data
def load_data():
iris=load_iris()
df=pd.DataFrame(iris.data,columns=iris.feature_names)
df["label"]=iris.target
df.columns=["sepal length","sepal width","petal length","petal width","label"]
data=np.array(df.iloc[:100,[0,1,-1]])
return data[:,:2],data[:,-1]
X,y=load_data()
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
2.自定义 LR
class LogisticRegressionClassifier(object):
def __init__(self,max_iter=200,learning_rate=0.01):
self.max_iter=max_iter
self.learning_rate=learning_rate
def sigmoid(self,x):
return 1/(1+exp(-x))
def data_matrix(self,X):
data_mat=[]
for d in X:
data_mat.append([1.0,*d])
return data_mat
def fit(self,X,y):
# label=np.mat(y)
data_mat=self.data_matrix(X)
self.weights=np.zeros((len(data_mat[0]),1),dtype=np.float32)
for iter_ in range(self.max_iter):
for i in range(len(X)):
result=self.sigmoid(np.dot(data_mat[i],self.weights))
error=y[i]-result
self.weights+=self.learning_rate*error*np.transpose([data_mat[i]])
print("LR Model(learning_rate={},max_iter={})".format(self.learning_rate,self.max_iter))
def score(self,X_test,y_test):
right=0
X_test=self.data_matrix(X_test)
for x,y in zip(X_test,y_test):
result=np.dot(x,self.weights)
if (result>0 and y==1) or (result<0 and y==0):
right+=1
return right/len(X_test)
lr_clf=LogisticRegressionClassifier()
lr_clf.fit(X_train,y_train)
LR Model(learning_rate=0.01,max_iter=200)
lr_clf.score(X_test,y_test)
1.0
x_points=np.arange(4,8)
y_=-(lr_clf.weights[1]*x_points+lr_clf.weights[0])/lr_clf.weights[2]
plt.plot(x_points,y_)
plt.scatter(X[:50,0],X[:50,1],label="0")
plt.scatter(X[50:,0],X[50:,1],label="1")
plt.legend()
<matplotlib.legend.Legend at 0x1178a9bc860>
3.sklearn实现LR
sklearn.linear_model.LogisticRegression
的参数solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择(sag与saga相似).分别是:
- newton-cg:牛顿法家族的一种.利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数
- lbfgs:拟牛顿法的一种.利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数
- liblinear:使用了开源的liblinear库实现.内部使用了坐标轴下降法来迭代优化损失函数
- sag:随随机平均梯度下降,是梯度下降法的变种,和普通下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据集多的时候
Image(filename="./data/6_4.png",width=500)
from sklearn.linear_model import LogisticRegression
clf=LogisticRegression(max_iter=200)
clf.fit(X_train,y_train)
E:Anacondaenvsmytensorflowlibsite-packagessklearnlinear_modellogistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
FutureWarning)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=200, multi_class='warn',
n_jobs=None, penalty='l2', random_state=None, solver='warn',
tol=0.0001, verbose=0, warm_start=False)
clf.score(X_test,y_test)
1.0
x_points=np.arange(4,8)
y_=-(clf.coef_[0][0]*x_points+clf.intercept_)/clf.coef_[0][1]
plt.plot(x_points,y_)
plt.plot(X[:50,0],X[:50,1],"bo",color="blue",label="0")
plt.plot(X[50:,0],X[50:,1],"bo",color="orange",label="1")
plt.xlabel("sepal length")
plt.ylabel("sepal width")
plt.legend()
<matplotlib.legend.Legend at 0x1178aca8b00>