Python机器学习之逻辑回归

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日

相关文章

  • python列表:开始、结束、步长值实例

    在Python中,列表是一种非常常用的数据类型,可以存储多个元素。在访问列表元素时,我们可以使用切片(slice)来访问列表中的一部分元素。切片的语法如下: lst[start:end:step] 其中,start表示切片的起始位置,end表示切片的结束位置(不包括该位置的元素),step表示切片的步长(默认为1)。 下面是一个简单的例: # 示例1:使用切…

    python 2023年5月13日
    00
  • Python使用try except处理程序异常的三种常用方法分析

    Python使用try except处理程序异常的三种常用方法分析 在Python的程序开发中,错误是无法避免的。当代码在运行过程中出现异常时,如果不进行处理,整个程序可能会崩溃。因此,我们需要使用try…except语句来捕获和处理程序中的异常。在这篇文章中,我们将讨论Python使用try except处理程序异常的三种常用方法。 方法一:捕获所有异…

    python 2023年5月13日
    00
  • Python常用工具类之adbtool示例代码

    下面是针对“Python常用工具类之adbtool示例代码”的完整攻略。 简介 adbtool是Python中一个常用的工具类,可以通过Python脚本操作Android设备。通过adb命令与Android设备进行通信,可以实现多种操作,如:安装应用程序,打开应用程序,截屏,录制视频,执行命令等。本攻略将详细讲解adbtool的使用流程,以及两个示例代码的实…

    python 2023年6月3日
    00
  • python用folium绘制地图并设置弹窗效果

    下面我将详细讲解“Python用Folium绘制地图并设置弹窗效果”的完整攻略分为以下几个步骤: 安装Folium 导入所需库和数据 创建最基础地图 在地图上添加标记 设置弹窗效果 接下来,我们会对每个步骤进行详细的说明,并且给出至少两个样例,以便更好地理解。 1. 安装Folium Folium是基于Python的数据可视化库,用于绘制交互式地图。安装方法…

    python 2023年6月13日
    00
  • 如何在 Redis 中实现限流?

    以下是详细讲解如何在 Redis 中实现限流的完整使用攻略。 Redis 限流简介 Redis 限流是一种常用的限制访问速率的方法,可以用于保系统免受过多的请求。Redis 限流的特点如下: Redis 限流是基于令牌桶算法的,可以控制请求速率。 Redis 限流是可扩展的,可以动态调整限流略。 Redis 限流支持多种限流方式,包括定窗口限流、滑动窗口限流…

    python 2023年5月12日
    00
  • Python爬取爱奇艺电影信息代码实例

    本文将介绍如何使用Python爬取爱奇艺电影信息的方法。以下是本文将介绍的: 使用requests库发送HTTP请求 使用BeautifulSoup库解析页面内容 爬取爱奇艺电影信息 示例说明 使用requests库发送HTTP请求 在Python中,我们可以使用requests库发送HTTP请求。以下是使用requests库发送HTTP请求的示例代码: i…

    python 2023年5月14日
    00
  • python爬虫线程池案例详解(梨视频短视频爬取)

    当我们需要爬取大量数据时,使用Python爬虫和线程池可以提高爬取效率。本文将介绍如何使用Python爬虫和线程池来爬取梨视频短视频。以下是详细步骤和示例。 Python爬虫线程池案例详解(梨视频短视频爬取) 本文将介绍如何使用Python爬虫和线程池来爬取梨视频短视频。我们将使用requests和BeautifulSoup库来获取和解析网页,使用线程池来提…

    python 2023年5月13日
    00
  • Python中字符串的常用方法总结

    针对Python中字符串的常用方法总结,我们可以从以下几个方面进行讲解: 字符串的创建 在Python中创建字符串可以使用单引号或双引号,例如: str1 = ‘hello world’ str2 = "hello world" 除了这种方式,我们还可以使用三引号来创建多行字符串,例如: str3 = ”’hello world”’ …

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