分类算法 中的 二元逻辑回归模型函数

首页 / 机器学习入门教程 / 分类算法 中的 二元逻辑回归模型函数

Logistic回归的最简单形式是二进制或二项式Logistic回归,其中目标或因变量只能具有2种可能的类型,即1或0。它使无涯教程能够对多个预测变量与二进制/二项式目标变量之间的关系进行建模。在逻辑回归的情况下,线性函数基本上用作另一个函数(例如g)的输入。在以下关系中-

这里, g是logistic或Sigmoid函数,可以给出如下-

可以通过下图来表示S形曲线。可以看到y轴的值介于0和1之间,并且与该轴的交点为0.5。

Binary Logistic Regression Model

这些类别可以分为正面或负面。如果输出介于0和1之间,则输出属于正类别的概率。假设假设函数的输出≥0.5则为正,否则为负。

链接:https://www.learnfk.comhttps://www.learnfk.com/python-machine-learning/machine-learning-with-python-binary-logistic-regression-model.html

来源:LearnFk无涯教程网

还需要定义一个损失函数以使用权重来衡量算法的性能,以theta表示如下-

现在,在定义损失函数之后,主要目标是使损失函数最小化。可以借助调整权重来完成,这意味着可以增加或减少权重。借助于损失每个权重的损失函数的导数,将能够知道哪些参数应具有较高的权重,哪些参数应具有较小的权重。

以下梯度下降方程式告诉无涯教程,如果修改参数,损耗将如何变化-

Python代码实现

现在,无涯教程将在Python中实现上述二项式逻辑回归的概念。为此,使用了一个名为" iris"的多元花卉数据集,该数据集包含3类,每类50个实例,但将使用前两个要素列。每个类别代表一种鸢尾花。

首先,需要导入必要的库,如下所示:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets

接下来,按以下方式加载数据集-

iris=datasets.load_iris()
X=iris.data[:, :2]
y=(iris.target != 0) * 1

无涯教程可以绘制训练数据如下-

plt.figure(figsize=(6, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend();
用Python实现

接下来,无涯教程将定义S型函数,损失函数和梯度下降,如下所示:

class LogisticRegression:
   def __init__(self, lr = 0.01, num_iter = 100000, fit_intercept = True, verbose = False):
      self.lr = lr
      self.num_iter = num_iter
      self.fit_intercept = fit_intercept
      self.verbose = verbose
   def __add_intercept(self, X):
      intercept = np.ones((X.shape[0], 1))
      return np.concatenate((intercept, X), axis=1)
   def __sigmoid(self, z):
      return 1/(1 + np.exp(-z))
   def __loss(self, h, y):
      return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
   def fit(self, X, y):
      if self.fit_intercept:
      X = self.__add_intercept(X)

现在,初始化权重,如下所示:

self.theta = np.zeros(X.shape[1])
   for i in range(self.num_iter):
      z = np.dot(X, self.theta)
      h = self.__sigmoid(z)
      gradient = np.dot(X.T, (h - y))/y.size
      self.theta -= self.lr * gradient
      
      z = np.dot(X, self.theta)
      h = self.__sigmoid(z)
      loss = self.__loss(h, y)
      
      if(self.verbose ==True and i % 10000 == 0):
         print(f'loss: {loss}\t')

借助以下脚本,可以预测输出概率-

def predict_prob(self, X):
   if self.fit_intercept:
      X = self.__add_intercept(X)
   return self.__sigmoid(np.dot(X, self.theta))
   
   def predict(self, X):
      return self.predict_prob(X).round()

接下来,无涯教程可以判断模型并将其绘制如下:

model = LogisticRegression(lr = 0.1, num_iter = 300000)
preds = model.predict(X)
(preds == y).mean()

plt.figure(figsize = (10, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color = 'g', label = '0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color = 'y', label = '1')
plt.legend()

x1_min, x1_max = X[:,0].min(), X[:,0].max(),
x2_min, x2_max = X[:,1].min(), X[:,1].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red');
Implementation Model and Plot

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

微服务架构实战160讲 -〔杨波〕

OpenResty从入门到实战 -〔温铭〕

移动端自动化测试实战 -〔思寒〕

实用密码学 -〔范学雷〕

手把手带你写一个Web框架 -〔叶剑峰〕

深入浅出分布式技术原理 -〔陈现麟〕

Kubernetes入门实战课 -〔罗剑锋〕

Dubbo源码剖析与实战 -〔何辉〕

AI 应用实战课 -〔黄佳〕

好记忆不如烂笔头。留下您的足迹吧 :)