Python机器学习之逻辑回归

yizhihongxing

Python机器学习之逻辑回归

逻辑回归(Logistic Regression)是一种常用的分类算法,它可以用于二分类和多分类问题。在这篇文章中,我们将介绍如何使用Python实现逻辑回归算法,并详细讲解实现原理。

实现原理

逻辑回归是一种基于概率的分类算法,它的目标是根据输入特征预测样本属于哪个类别。逻辑回归的实现原理如下:

  1. 首先定义一个逻辑回归模型,包含权重向量和偏置项。
  2. 然后定义一个损失函数,用于衡量模型预测结果与真实结果之间的差距。
  3. 接着使用梯度下降算法来最小化损失函数,从而得到最优的权重向量和偏置项。
  4. 最后使用训练好的模型来预测新的样本类别。

Python实现

下面是一个使用Python实现逻辑回归算法的示例:

import numpy as np

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

            if self.verbose and i % 10000 == 0:
                z = np.dot(X, self.theta)
                h = self.__sigmoid(z)
                print(f'loss: {self.__loss(h, y)} \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, threshold=0.5):
        return self.predict_prob(X) >= threshold

在这个示例中,我们首先定义了一个名为LogisticRegression的类,用于实现逻辑回归算法。在LogisticRegression类中,我们首先定义了一个__add_intercept函数,用于添加截距项。然后定义了一个__sigmoid函数,用于计算sigmoid函数的值。接着定义了一个__loss函数,用于计算损失函数的值。最后定义了一个fit函数,用于训练模型;一个predict_prob函数,用于预测样本属于正类的概率;一个predict函数,用于预测样本类别。

示例1:使用逻辑回归进行二分类

在这个示例中,我们将使用逻辑回归进行二分类。我们首先生成一个二分类数据集,然后使用逻辑回归模型进行训练,并使用测试集评估模型的性能。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
X = np.random.randn(200, 2)
y = np.array([0 if x[0] + x[1] 0 else 1 for x in X])

model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X, y)

plt.scatter(X[:, 0], X[:, 1], c=y)
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')
plt.show()

在这个示例中,我们首先使用numpy模块生成一个二分类数据集。然后使用逻辑回归模型进行训练,并使用测试集评估模型的性能。最后使用matplotlib模块绘制出决策边界。

示例2:使用逻辑回归进行多分类

在这个示例中,我们将使用逻辑回归进行多分类。我们首先加载一个手写数字数据集,然后使用逻辑回归模型进行训练,并使用测试集评估模型的性能。

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.3, random_state=0)

model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print(f"Accuracy: {accuracy}")

fig, axes = plt.subplots(4, 4, figsize=(8, 8))
fig.subplots_adjust(hspace=0.3, wspace=0.3)

for i, ax in enumerate(axes.flat):
    ax.imshow(X_test[i].reshape(8, 8), cmap='binary', interpolation='nearest')
    ax.text(0.05, 0.05, str(y_pred[i]), transform=ax.transAxes, color='green' if y_pred[i] == y_test[i] else 'red')
    ax.set_xticks([])
    ax.set_yticks([])

plt.show()

在这个示例中,我们首先使用sklearn.datasets模块加载一个手写数字数据集。然后使用逻辑回归模型进行训练,并使用测试集评估模型的性能。最后使用matplotlib模块绘制出预测结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python机器学习之逻辑回归 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • pandas merge报错的解决方案

    以下是关于“pandas merge 报错的解决方案”的完整攻略: 问题描述 在使用 pandas 进行数据处理时,可能会遇到 merge 函数报错的问题。本文将介绍如何解决这个问题。 解决方法 1. 检查列名 在使用 merge 函数时,需要确保两个 DataFrame 中的列名相同。如果列名不同,可以使用 rename 函数重命列名。示例代码如下: df…

    python 2023年5月13日
    00
  • Python 中Django验证码功能的实现代码

    Python中Django验证码功能的实现,可以借助第三方库django-simple-captcha来实现。下面是实现验证码功能的具体步骤: 安装django-simple-captcha $ pip install django-simple-captcha 配置settings.py 在settings.py的INSTALLED_APPS中加入capt…

    python 2023年5月14日
    00
  • scratch3.0二次开发之用blocks生成python代码

    当你需要让孩子们更深入地学习编程,Scratch是一个非常好的选择。但是,当他们掌握了基础,你可能需要让他们尝试不同的编程环境。这时,Scratch的Python生成器就派上了用场。 下面是Scratch 3.0二次开发之用Blocks生成Python代码的完整攻略: 什么是Scratch 3.0二次开发? Scratch Generators是Scratc…

    python 2023年6月3日
    00
  • 如何配置 uwsgi 以使用特定版本的 python?

    【问题标题】:How to configure uwsgi to work with a specific version of python?如何配置 uwsgi 以使用特定版本的 python? 【发布时间】:2023-04-04 20:38:01 【问题描述】: 我使用 Debian 9 uwsgi 和 nginx 作为几个 Django 站点的服务器…

    Python开发 2023年4月6日
    00
  • python处理excel文件之xlsxwriter 模块

    Python 处理 Excel 文件之 XlsxWriter 模块 简介 XlsxWriter 是一个使用纯 Python 编写的强大的 Excel 写入库。通过它,我们可以创建和修改 Excel 文档,支持多种自定义样式,如单元格格式、字体、颜色、边框等等。XlsxWriter 还支持创建图表、图表系列、数据有效性等。 安装 通过 pip 可以很容易地安装…

    python 2023年6月3日
    00
  • python 3的kivy中是否有任何将textinput(小部件)的文本访问到另一个类的方法?

    【问题标题】:Is there any to access textinput (widget)’s text into another class in kivy of python 3?python 3的kivy中是否有任何将textinput(小部件)的文本访问到另一个类的方法? 【发布时间】:2023-04-05 16:53:02 【问题描述】: 我…

    Python开发 2023年4月5日
    00
  • Python一键安装全部依赖包的方法

    当我们使用Python开发一些项目的时候,可能需要使用到第三方库。但是,每次手动安装各种库的依赖包实在是太麻烦了。那么,有没有什么办法可以一键安装全部依赖包呢?答案是肯定的,下面就详细讲解一下Python一键安装全部依赖包的方法攻略。 方法一:使用pipenv虚拟环境 pipenv 是一个专门为 Python 应用程序创建虚拟环境和管理依赖项的工具,可以无缝…

    python 2023年5月14日
    00
  • python 自动提交和抓取网页

    Python 是一种功能强大的编程语言,可以编写自动化脚本来实现很多自动化操作,其中包括自动提交和抓取网页。在本文中,我们将为您详细介绍如何使用 Python 自动提交和抓取网页的完整攻略。 环境搭建 在开始之前,我们需要确保环境已经准备好。我们需要安装 Python 和一些必要的包,比如 requests 和 beautifulsoup4,在执行下面的命令…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部