机器学习之逻辑回归及扩展

原文出自公众号“从机器学习到深度学习那些事”

什么是逻辑回归

逻辑回归(logistic regression),虽然名字上有“回归”两字,但它实际应用的是处理分类问题(二分类、多分类)。逻辑回归的核心思想是:如果回归的结果输出是一个连续值,而值的范围是无法限定的,那么想办法把这个连续结果值映射为可以帮助我们判断的结果值,从而进行分类。所以,从本质上讲,逻辑回归是在回归的基础上,进行了特殊的改进(利用**函数),而被用于分类问题上。

 

机器学习之逻辑回归及扩展

 

逻辑回归的**函数

Sigmoid函数,因图形像S,才得名Sigmoid函数

 

机器学习之逻辑回归及扩展

 

机器学习之逻辑回归及扩展

Sigmoid 函数的求导过程如下,导数可以用原函数表示出,这是sigmoid函数的一个特点

机器学习之逻辑回归及扩展

因为个g(x)取值在0-1之间,即如果看成概率的话,p(1-p),把值域压缩到0-1之间,以概率的形式表示。这特性使得在一些机器学习过程可以用作打分排序之类。

 

机器学习之逻辑回归及扩展

 

逻辑回归模型

Sigmoid函数作为**函数,将原线性模型代入得到逻辑回归的模型

 

机器学习之逻辑回归及扩展

 

逻辑回归将y值压缩到0-1之间,可以以0.5为分界对样本进行二分类,大于0.5->1,小于0.5->0,即逻辑回归可以用于解决二分类问题。

 

机器学习之逻辑回归及扩展

 

Logistic回归的参数估计

Logistic回归的参数估计是利用最大似然估计(负对数似然)方法

假定

 

机器学习之逻辑回归及扩展

 

连到一起则:

 

机器学习之逻辑回归及扩展

 

似然函数为

机器学习之逻辑回归及扩展

两边取对数,即对数似然:

 

机器学习之逻辑回归及扩展

 

得到逻辑回归的目标函数为

 

机器学习之逻辑回归及扩展

 

 

机器学习之逻辑回归及扩展

 

目标函数参数求解

利用梯度下降法求解参数

先求梯度

机器学习之逻辑回归及扩展

Logistic回归参数的学习规则如下,迭代直到收敛,求得参数

 

机器学习之逻辑回归及扩展

 

 

机器学习之逻辑回归及扩展

 

Sofmax 回归

Sofmax 回归是逻辑回归的推广,也可以说逻辑回归是softmax回归的特例。逻辑回归是用来处理二分类问题,softmax是解决多分类问题。

先说下指数归一化

归一化是把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。

指数归一化即以指数形式做归一化,以自然底数e

参考下图(截图来自邹博课程)

机器学习之逻辑回归及扩展

扩展到θx

机器学习之逻辑回归及扩展

由此归纳得到Softmax回归概率:

机器学习之逻辑回归及扩展

类似逻辑回归求它的似然函数如下:

机器学习之逻辑回归及扩展

对数似然:

 

机器学习之逻辑回归及扩展

 

随机梯度:

机器学习之逻辑回归及扩展

根据以上使用梯度下降优化方法可以迭代求出最优参数,此处就不重复。

 

机器学习之逻辑回归及扩展

代码实战:

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection

def load_data():
   '''
   加载用于分类问题的数据集
   :return: 一个元组,用于分类问题。元组元素依次为:训练样本集、测试样本集、训练样本集对应的标记、测试样本集对应的标记
   '''
   iris = datasets.load_iris()  # 使用 scikit-learn 自带的 iris 数据集
   X_train = iris.data
   y_train = iris.target
   return model_selection.train_test_split(X_train, y_train, test_size=0.25,
                                           random_state=0, stratify=y_train) 
# 分层采样拆分成训练集和测试集,测试集大小为原始数据集大小的 1/4

def mytest_LogisticRegression(*data):
   '''
   测试 LogisticRegression 的用法
   :param data: 可变参数。它是一个元组,这里要求其元素依次为:训练样本集、测试样本集、训练样本的标记、测试样本的标记
   :return: None
   '''
   X_train, X_test, y_train, y_test = data
   regr = linear_model.LogisticRegression()
   regr.fit(X_train, y_train)
   print('Coefficients:%s, intercept %s' % (regr.coef_, regr.intercept_))
   print('Score: %.2f' % regr.score(X_test, y_test))
   """score(X, y, sample_weight=None)
   Returns the mean accuracy(平均精度) on the given test data and labels.
   In multi-label classification, this is the subset accuracy
   which is a harsh metric since you require for each sample that each label set be correctly predicted."""
   # print(regr.predict(X_test)) # 预测值
   # print(regr.predict_log_proba(X_test))
   # print(regr.predict_proba(X_test))
if __name__ == '__main__':
   X_train, X_test, y_train, y_test = load_data()  # 加载用于分类的数据集
mytest_LogisticRegression(X_train, X_test, y_train, y_test)  
# 调用  mytest_LogisticRegression

 

 

参考资料

https://blog.csdn.net/joshly/article/details/50494548

Python大战机器学习

周志华 机器学习

邹博 机器学习

 

机器学习之逻辑回归及扩展