Python语言描述机器学习之Logistic回归算法

  • Post category:Python

Python语言描述机器学习之Logistic回归算法

Logistic回归是一种常用的分类算法,它可以用于二分类和多分类问题。在本攻略中我们将介绍如何使用Python实现Logistic回归算法,包括算法的基本原理、实现步骤和示例说明。

回归算法基本原理

Logistic回归算法的基本原理是将输入特征映射到一个概率值,该概率值表示输入特征属于某个类别的概率。算法的步骤如下:

  1. 定义模型:定义一个函数,将输入特征映射到一个概率值。
  2. 定义损失函数:定义一个损失函数,用于衡量模型的预测结果与真实结果之间的差距。
  3. 训练模型:使用优化算法,最小化损失函数,得到最优的模型参数。
  4. 预测结果:使用训练好的模型,预测新的输入特征所属的类别。

Logistic回归算法实现步骤

Logistic回归算法的实现步骤如下:

  1. 定义模型:定义一个函数,将输入特征映射到一个概率值。通常使用sigmoid函数作为映射函数。
  2. 定义损失函数:定义一个损失函数,用于衡量模型的预测结果与真实结果之间的差距。通常使用交叉损失函数。
  3. 训练模型:使用优化算法,最小化损失函数,得到最优的模型参数。通常使用梯度下降算法或其变种。
  4. 预测结果:使用训练好的模型,预测新的输入特征所属的类别。

Python实现Logistic回归算法

以下是使用Python实现Logistic回归算法的示例代码:

import numpy as np
import matplotlib.pyplot as plt

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):
        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

# 示例1
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]])
y = np.array([0, 0, 1,1, 1])
model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X, y)
print(model.theta)
print(model.predict(np.array([[1, 2], [5, 6]])))

# 示例2
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:, :2]
y = (iris.target != 0) * 1
model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X, y)
print(model.theta)
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='b', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='r', label='1')
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='black')
plt.legend()
plt.show()

在这个示例中我们定义了一个LogisticRegression类,该类包含fitpredict_probpredict方法。fit方法用于训练模型,predict方法用于预测输入特征属于某个类别的概率,predict方法用于预测输入特征所属的类别。

我们首先定义了一个LogisticRegression类的构造函数,该函数包含四个参数:lr表示学习率,num_iter表示迭代次数,fit_intercept表示是否拟合距,verbose表示是否输出训练过程中的损失值。然后,我们定义了__add_intercept方法,该方法用于在输入特征中添加截距项。接着,我们定义了__sigmoid方法,该方法用于计算sigmoid函数的值。然后,我们定义了__loss方法,该方法用于计算交叉熵损失函数的值接着,我们定义了fit方法,该方法使用梯度下降算法最小化损失函数,得到最优的模型参数。然,我们定义了predict_prob方法,该方法使用训练好的模型,预测输入特征属于某个类别的概率。最后,我们定义了predict方法,该方法使用训练好的模型,预测输入特征所属的类别。

我们使用两个示例说明了如何使用Logistic归算法。在示例1中,我们使用Logistic回归算法将一个二维数据集分成两个类别。在示例2中,使用Logistic回归算法将一个三维数据集分成两个类别,并绘制了决策边界。

结论

本攻略介绍了如何使用Python实现Logistic回归算,包括算法的基本原理、实现步骤和示例说明。这些示例代码帮助初学者更好地理解如何Python实现Logistic回归算法,并将其应用于不同的问题。