逻辑斯蒂回归

逻辑斯蒂回归

假如有一个罐子,里面有黑白两种颜色的球,数目多少不知,两种颜色的比例也不知。我 们想知道罐中白球和黑球的比例,但我们不能把罐中的球全部拿出来数。现在我们可以每次任意从已经摇匀的罐中拿一个球出来,记录球的颜色,然后把拿出来的球 再放回罐中。这个过程可以重复,我们可以用记录的球的颜色来估计罐中黑白球的比例。假如在前面的一百次重复记录中,有七十次是白球,请问罐中白球所占的比例最有可能是多少?很多人马上就有答案了:70%。而其后的理论支撑是什么呢?

我们假设罐中白球的比例是p,那么黑球的比例就是1-p。因为每抽一个球出来,在记录颜色之后,我们把抽出的球放回了罐中并摇匀,所以每次抽出来的球的颜色服从同一独立分布。这里我们把一次抽出来球的颜色称为一次抽样。题目中在一百次抽样中,七十次是白球的概率是P(Data | M),这里Data是所有的数据,M是所给出的模型,表示每次抽出来的球是白色的概率为p。如果第一抽样的结果记为x1,第二抽样的结果记为x2… 那么Data = (x1,x2,…,x100)。这样,

    P(Data | M)

     = P(x1,x2,…,x100|M)

     = P(x1|M)P(x2|M)…P(x100|M)

     = p^70(1-p)^30.

【关键词】Logistics函数,最大似然估计,梯度下降法

1、Logistics回归的原理

利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。

训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理

Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:

(1)找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程是非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有梯度下降法(Gradient Descent)。

1) 构造预测函数

Logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,用于两分类问题(即输出只有两种)。首先需要先找到一个预测函数(h),显然,该函数的输出必须是两类值(分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:

这里写图片描述

2)构造损失函数

Cost函数和J(θ)函数是基于最大似然估计推导得到的。

每个样本属于其真实标记的概率,即似然函数,可以写成:

这里写图片描述

最大似然估计就是要求得使l(θ)取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求的最佳参数

3) 梯度下降法求J(θ)的最小值

求J(θ)的最小值可以使用梯度下降法,根据梯度下降法可得θ的更新过程:

7.jpg

式中为α学习步长,下面来求偏导:

8.jpg

上式求解过程中用到如下的公式:

9.jpg

因此,θ的更新过程可以写成:

10.jpg

因为式中α本来为一常量,所以1/m一般将省略,所以最终的θ更新过程为:

11.jpg

2、实战


sklearn.linear_model.LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)

solver参数的选择:
- “liblinear”:小数量级的数据集
- “lbfgs”, “sag” or “newton-cg”:大数量级的数据集以及多分类问题
- “sag”:极大的数据集

1) 手写数字数据集的分类

使用KNN与Logistic回归两种方法

import numpy as np
import matplotlib.pyplot as plt
# 从本质上来说,逻辑斯蒂属于线性回归
from sklearn.linear_model import LogisticRegression
# 导入一个数字集
import sklearn.datasets as datasets

导入数据load_digits()

digits = datasets.load_digits()
data = digits['data']
target = digits['target']

data.shape
  • 输出

    (1797, 64)

# 随机数代表下标

index = np.random.randint(0, 1797, size=1)[0]

digit_image = data[index].reshape((8,8))
plt.figure(figsize=(0.5, 0.5))
plt.imshow(digit_image, cmap='gray')
<matplotlib.image.AxesImage at 0xb70fbe0>

这里写图片描述

# 分割数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.01)

创建模型,训练和预测

# 实例化逻辑斯蒂
lr = LogisticRegression()
lr.fit(X_train, y_train)
  • 输出

    LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
    intercept_scaling=1, max_iter=100, multi_class=’ovr’, n_jobs=1,
    penalty=’l2’, random_state=None, solver=’liblinear’, tol=0.0001,
    verbose=0, warm_start=False)

lr.predict(X_test)
  • 输出

    array([6, 2, 9, 2, 1, 1, 8, 6, 1, 1, 5, 3, 4, 5, 5, 1, 4, 5])

y_test
  • 输出

    array([6, 2, 9, 2, 1, 1, 8, 6, 8, 1, 5, 3, 4, 5, 5, 1, 4, 5])

lr.score(data,target)
  • 输出

    0.9927657206455203

2) 使用make_blobs产生数据集进行分类

导包使用datasets.make_blobs创建一系列点

# n_samples=100 样本的默认数量
# n_features=2 默认属性数量
# centers=3 默认的类别数量
data, target = datasets.make_blobs()
data.shape
  • 输出

    (100, 2)

设置三个中心点,随机创建100个点

plt.scatter(data[:,0], data[:,1], c=target)
<matplotlib.collections.PathCollection at 0xce097b8>

这里写图片描述

创建机器学习模型,训练数据

# 先机器学习
lr = LogisticRegression()
lr.fit(data, target)
  • 输出

    LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
    intercept_scaling=1, max_iter=100, multi_class=’ovr’, n_jobs=1,
    penalty=’l2’, random_state=None, solver=’liblinear’, tol=0.0001,
    verbose=0, warm_start=False)

提取坐标点,对坐标点进行处理

预测坐标点数据,并进行reshape()

# 提取坐标点
x = np.linspace(-8, 9, 200)
y = np.linspace(-15, 15, 200)

# 网格线
X,Y = np.meshgrid(x,y)


X = X.reshape(-1)
Y = Y.reshape(-1)
# 合成点
X_test = np.c_[X,Y]
# 预测
y_ = lr.predict(X_test)

绘制图形

plt.scatter(X_test[:,0],X_test[:,1], c=y_)
plt.scatter(data[:,0], data[:,1], c=target, cmap = 'rainbow')
<matplotlib.collections.PathCollection at 0xcc44cc0>

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值