Python语言描述机器学习之Logistic回归算法
Logistic回归是一种常用的分类算法,它可以用于二分类和多分类问题。在本攻略中我们将介绍如何使用Python实现Logistic回归算法,包括算法的基本原理、实现步骤和示例说明。
回归算法基本原理
Logistic回归算法的基本原理是将输入特征映射到一个概率值,该概率值表示输入特征属于某个类别的概率。算法的步骤如下:
- 定义模型:定义一个函数,将输入特征映射到一个概率值。
- 定义损失函数:定义一个损失函数,用于衡量模型的预测结果与真实结果之间的差距。
- 训练模型:使用优化算法,最小化损失函数,得到最优的模型参数。
- 预测结果:使用训练好的模型,预测新的输入特征所属的类别。
Logistic回归算法实现步骤
Logistic回归算法的实现步骤如下:
- 定义模型:定义一个函数,将输入特征映射到一个概率值。通常使用sigmoid函数作为映射函数。
- 定义损失函数:定义一个损失函数,用于衡量模型的预测结果与真实结果之间的差距。通常使用交叉损失函数。
- 训练模型:使用优化算法,最小化损失函数,得到最优的模型参数。通常使用梯度下降算法或其变种。
- 预测结果:使用训练好的模型,预测新的输入特征所属的类别。
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
类,该类包含fit
、predict_prob
和predict
方法。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回归算法,并将其应用于不同的问题。