什么是逻辑回归
逻辑回归(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大战机器学习
周志华 机器学习
邹博 机器学习