之前学习了线性回归,本篇文章将介绍逻辑回归,逻辑回归和线性回归同样都属于有监督机器学习,那么它们有什么区别呢:
线性回归:预测一个连续的值;逻辑回归:预测一个离散的值
下面看一个例子:
良性肿瘤 or 恶性肿瘤
有一家医院希望我们能开发出一款分类器,可以通过数据分析出一块肿瘤到底是良性的,还是恶性的。
0: 负例 “Negative Class” (良性肿瘤)
1: 正例 “Positive Class” (恶性肿瘤)
这样得到下图:
当我们要做二分类的时候,我们一般只希望得到两个值 y = 0 或 1。但是, 线性回归得到的值是在一个范围内的连续值,而且可能远 > 1 或远 < 0,这样会给分类带来困难
我们希望的值域:
那么我们将模型更新:
但是这样的模型是阶跃函数,是不连续的。
我们继续更新模型:
这样就引出了连续的模型:Sigmoid函数,sigmoid函数也叫logistic函数
如果想要模型的y值坐落在[0,1]的区间上那么就需要使用sigmoid函数
那么为什么要用Sigmoid函数呢?
数学上,是根据广义线性回归的模型推导所得的结果;
直观上,
(1)输出范围有限,数据在传递中不容易发散
(2)抑制两头,对中间细微变化敏感,对分类有利
(3)性质优秀,方便使用(Sigmoid函数是平滑的,而且任意阶可到,一阶二阶导数可以直接由函数得到不用求导,这在做梯度下降的时候很实用)
熵的引入
熵的意义:
热力学上:熵是一种测量分子不稳定的指标,分子运动越不稳定,熵就越大
信息论(香农):熵是一种测量信息量的单位,信息熵,包含的信息越多,熵就越大。
机器学习:熵是一种测量不确定性的单位,不确定性越大,概率越小,熵就越大!
越不可能的事件发生了,我们获取到的信息量就越大。信息量的公式:
熵:表示所有信息量的期望。熵的公式:
交叉熵公式:
逻辑函数的损失函数-- 交叉熵(Cross-Entropy)
变换后公式如下:
那么损失函数如下:
逻辑回归的梯度下降:
重复直到收敛:
下面我们用逻辑回归处理鸢尾花数据集:
Sepal length: 花萼长度
Sepal width: 花萼宽度
Petal length: 花瓣长度
Petal width: 花瓣宽度
鸢尾花根据以上的长度和宽度的不同可以分为三类:
山鸢尾花(Setosa)
杂色鸢尾花(Versicolour)
维吉尼亚鸢尾(Virginica)
下面我们就用逻辑回归处理数据集,并做出预测,代码如下:
"""
逻辑回归(处理鸢尾花数据集)
"""
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
iris = datasets.load_iris()
# print(type(iris['data']))
# print(iris)
# print(iris.keys())
# print(iris['DESCR'])
# print(iris['feature_names'])
# 因为花瓣的相关系数比较高,所以分类效果比较好,所以我们就用花瓣宽度当作X
X = iris['data']
# print(X)
# 把分类结果拿出来
y = iris['target']
# print(y)
# 用以上的数据做逻辑回归
log_reg = LogisticRegression(multi_class='ovr', solver='sag', max_iter=10000)
log_reg.fit(X, y)
# print("w1", log_reg.coef_)
# print("w0", log_reg.intercept_)
# 创建新的数据集去预测 创建0到3的1000个等差数列,(-1,1)就是让他在不知道多少行的情况下,变成1列,
X_new = np.array([[5.1, 3.5, 1.4, 0.2]])
# np.set_printoptions(suppress=True)
# print(X_new)
# 用来预测分类的概率值,比如第一个行第一个概率最大,那么得到的y=0
y_proba = log_reg.predict_proba(X_new)
# 用来预测分类号的
y_hat = log_reg.predict(X_new)
print(y_proba)
print(y_hat)
输出结果如下: