一、逻辑回归介绍
逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归。由于算法的简单和高效,在实际中应用非常广泛。也称“对数几率回归”或“逻辑斯谛回归”,是统计学习中的经典分类方法。
二、逻辑回归的本质
Logistic 回归的本质是:假设数据服从某种分布,然后使用极大似然估计做参数的估计。
sigmoid 函数:
逻辑回归名字的由来是因为算法流程中使用到了一个关键的 Logisitic 函数,该函数是一个比较简单的单调递增函数,逻辑回归用 sigmoid 函数来计算样本对应的后验概率。
表达式和图像如下:
其中,X是我们的训练样本输入,w就是我们需要求的参数,Y是最后的结果分类标签(0,1)
2.如何得到模型的函数
逻辑回归模型的数学形式确定后,剩下就是如何去求解模型中的参数。
在统计学中,常常使用极大似然估计法来求解,即找到一组参数,使得在这组参数下,我们的数据的似然度(概率)最大。
似然函数:
为了更方便求解,我们对等式两边同取对数,写成对数似然函数:
找到令l(w)最大的w,就是我们要找的模型
在l(w)公式上加个负号,得到的损失函数表示
我们发现交叉熵公式跟之前的逻辑回归损失函数完全一致,也就是说逻辑回归的损失函数其实就是交叉熵
三、逻辑回归实现
Python 代码演示
下面是一个使用 Python 进行逻辑回归的简单示例。我们将使用 scikit-learn
库,这是一个常用的机器学习库。
三、逻辑回归实现
1.逻辑回归并没有对数据的分布进行建模,也就是说,逻辑回归模型并不知道数据的具体分布,而是直接根据已有的数据求解分类超平面。
2.逻辑回归可以很好地解决线性分类问题,而且收敛速度较快,在真实的数据集上往往只需要数百次的迭代就能得到结果。
3.正则项在数据量较大时,对结果的影响不大。在数据量较小时,可以有效解决过拟合问题。
4.从结果中可以看出,模型在满足朴素贝叶斯假设时的分类表现略好于不满足朴素贝叶斯假设时。
5.在 UCI 上找的数据以及自己的生成数据上的准确率基本都在 90% 以上,说明逻辑回归是一个比较不错的线性分类模型。但数据本身的分布对实验结果影响较大,需要满足数据本身就是线性可分的,否则正确率下降严重
# 导入必要的库
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
# 生成一些示例数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = (4 + 3 * X + np.random.randn(100, 1) > 5).astype(int)
# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并拟合逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
# 绘制决策边界
plt.scatter(X_test, y_test, color='black')
x_values = np.linspace(0, 2, 100).reshape(-1, 1)
y_probabilities = model.predict_proba(x_values)[:, 1]
plt.plot(x_values, y_probabilities, color='blue', linewidth=3)
plt.xlabel('X')
plt.ylabel('Probability')
plt.title('Logistic Regression Example')
plt.show()
四.模型评估
1. 模型评估指标
在使用逻辑回归模型时,了解模型的性能是至关重要的。一些常用的模型评估指标包括:
- 准确率(Accuracy): 正确预测的样本数占总样本数的比例。
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
- 混淆矩阵(Confusion Matrix): 用于详细了解模型的性能,包括真正例、真负例、假正例和假负例的数量。
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)
- 精确度(Precision)和召回率(Recall): 精确度表示模型预测的正例中有多少是真正例,召回率表示真正例中有多少被模型成功预测。
from sklearn.metrics import precision_score, recall_score
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
print("Precision:", precision)
print("Recall:", recall)
2. 模型调优
为了提高模型性能,可能需要进行一些调优步骤:
- 特征工程: 选择和转换特征对逻辑回归的性能影响较大。可以通过探索数据、选择重要特征和进行特征缩放来改进模型。
# 示例:特征缩放
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
- 正则化调优: 调整正则化参数,以防止过拟合。
# 示例:使用网格搜索调整正则化参数
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100]}
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train_scaled, y_train)
best_C = grid_search.best_params_['C']
- 学习曲线分析: 通过绘制学习曲线,可以了解模型在不同训练样本数量下的表现。
# 示例:使用学习曲线进行分析
from sklearn.model_selection import learning_curve
train_sizes, train_scores, test_scores = learning_curve(LogisticRegression(C=best_C), X_train_scaled, y_train, cv=5)
# 绘制学习曲线
plt.figure(figsize=(8, 6))
plt.plot(train_sizes, np.mean(train_scores, axis=1), label='Training Score')
plt.plot(train_sizes, np.mean(test_scores, axis=1), label='Validation Score')
plt.xlabel('Training Set Size')
plt.ylabel('Accuracy')
plt.title('Learning Curve for Logistic Regression')
plt.legend()
plt.show()
五、结论
1.逻辑回归并没有对数据的分布进行建模,也就是说,逻辑回归模型并不知道数据的具体分布,而是直接根据已有的数据求解分类超平面。
2.逻辑回归可以很好地解决线性分类问题,而且收敛速度较快,在真实的数据集上往往只需要数百次的迭代就能得到结果。
3.正则项在数据量较大时,对结果的影响不大。在数据量较小时,可以有效解决过拟合问题。
4.从结果中可以看出,模型在满足朴素贝叶斯假设时的分类表现略好于不满足朴素贝叶斯假设时。
5.在 UCI 上找的数据以及自己的生成数据上的准确率基本都在 90% 以上,说明逻辑回归是一个比较不错的线性分类模型。但数据本身的分布对实验结果影响较大,需要满足数据本身就是线性可分的,否则正确率下降严重