一、什么是Logistic回归
Logistic回归是统计学习中的经典分类方法,属于对数线性模型,所以也被称为对数几率回归,是一种用于建立分类模型的统计方法。它是广义线性模型的一种,经常用于预测二分类问题。利用logistic回归进行分类的主要思想是:根据现有的数据对分类边界线建立回归公式,以此进行分类。
二、Logistic回归模型
2.1 sigmoid函数
Logistic回归的核心思想是通过sigmoid函数(也称为logistic函数)将线性模型的输出转换为一个概率值。sigmoid函数有一个S形状的曲线,可以将任何实数值映射到0到1之间的概率值域。在Logistic回归中,我们使用sigmoid函数将线性函数的输出映射到概率值上,然后使用损失函数来最小化预测结果与真实结果之间的差异。
我们处理二分类问题。由于分成两类,我们便让其中一类标签为0,另一类为1。我们需要一个函数,对于输入的每一组数据,都能映射成0~1之间的数。并且如果函数值大于0.5,就判定属于1,否则属于0。而且函数中需要待定参数,通过利用样本训练,使得这个参数能够对训练集中的数据有很准确的预测。这个函数就是Sigmoid函数。Sigmoid函数的输入记为z,z=x+b,其中向量x是分类器的输入数据,向量w也就是我们要找到的最佳系数,b为常数。
Sigmoid函数的表达式以及图像为:
2.2 求解参数
最大似然估计
最大似然估计是一种可以生成拟合数据的任何分布的参数的最可能估计的技术。它是一种解决建模和统计中常见问题的方法——将概率分布拟合到数据集。
例如,假设数据来自泊松(λ)分布,在数据分析时需要知道λ参数来理解数据。这时就可以通过计算MLE找到给定数据的最有可能的λ,并将其用作对参数的良好估计。
三、代码实现
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
X, y = np.random.randn(100, 2), np.random.randint(0, 2, (100, 1))
def sigmoid(z):
return 1 / (1 + np.exp(-z))
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 __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 = sigmoid(z)
gradient = np.dot(X.T, (h - y)) / y.size
self.theta -= self.lr * gradient
if (self.verbose == True and i % 10000 == 0):
z = np.dot(X, self.theta)
h = 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 sigmoid(np.dot(X, self.theta))
def predict(self, X, threshold):
return self.predict_prob(X) >= threshold
model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X, y)
plt.scatter(X[:, 0], X[:, 1], c=y.flatten(), s=100, cmap='viridis')
plt.show()
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, levels=[0.5], cmap="Greys", vmin=0, vmax=.6)
plt.scatter(X[:, 0], X[:, 1], c=y.flatten(), cmap="viridis", vmin=-.2, vmax=1.2, edgecolors="k")
plt.show()
四、总结
Logistic回归作为一种常用的分类模型,具有以下优点和缺点:
优点:
1. 模型简单且易于解释:Logistic回归是一种线性模型,模型的系数可以用于解释不同特征对分类结果的影响程度。
2. 计算效率高:相比于其他复杂的分类算法,Logistic回归的计算速度较快,尤其在大规模数据集上表现良好。
3. 输出概率值:Logistic回归可以输出样本属于某一类别的概率值,而不仅仅是简单的分类结果。
4. 可以处理线性可分和线性不可分的问题:通过引入非线性的特征变换或者引入交互项,Logistic回归可以处理一些非线性的分类问题。
缺点:
1. 对于非线性关系的建模能力有限:Logistic回归在处理非线性关系时的表现较差,无法很好地拟合复杂的数据模式。
2. 对异常值敏感:由于Logistic回归是基于最大似然估计的方法,对于异常值较敏感,异常值可能会对模型的拟合产生较大的影响。
3. 对特征相关性敏感:如果输入特征之间存在高度相关性,Logistic回归模型的性能可能会下降,需要对相关特征进行处理或者进行特征选择。
4. 仅适用于二分类问题:Logistic回归只能处理二分类问题,无法直接处理多分类问题,需要进行扩展或者使用其他算法。
综上所述,Logistic回归作为一种简单而有效的分类方法,在许多应用领域仍然具有广泛的应用。但在处理复杂的非线性问题和存在相关特征时,需要注意其局限性,并选择适合的模型或算法。