文章目录
- 1.基础简析
- 交叉熵损失函数(Cross-Entropy Loss)
- 对数似然损失函数(Log-Likelihood Loss)
- 2.关键步骤
- 3.案例
1.基础简析
逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计模型,它使用了一个称为逻辑函数(Sigmoid function)的非线性变换来预测一个事件发生的概率。在逻辑回归中,常用的损失函数是交叉熵损失函数(Cross-Entropy Loss)或者对数似然损失函数(Log-Likelihood Loss)。这两个表述实际上是等价的,只是视角不同。
交叉熵损失函数(Cross-Entropy Loss)
对于二分类问题,假设我们有一个实例 (x_i),其真实标签为 (y_i)((y_i \in {0, 1})),模型预测的概率为 (p_i = \sigma(z_i)),其中 (z_i = w^Tx_i + b) 是线性组合的输出((w) 为权重向量,(b) 为偏置项,(\sigma) 为 sigmoid 函数),交叉熵损失函数定义为:
[L = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(p_i) + (1-y_i) \log(1-p_i)]]
这里,(N) 是样本数量,(y_i) 是实际标签,(p_i) 是模型预测该样本属于正类的概率。
对数似然损失函数(Log-Likelihood Loss)
从对数似然的角度看,如果我们将每个样本的预测看作是一个伯努利试验,那么整个数据集的似然函数可以写作所有单个样本似然的乘积。最大化似然等同于最小化对数似然的负值,这自然导出了与上面相同的交叉熵表达式。因此,对数似然损失也是:
[L = -\sum_{i=1}^{N} [y_i \log(p_i) + (1-y_i) \log(1-p_i)]]
在实际应用中,为了方便计算,通常会对这个公式进行小的调整,比如添加一个正则化项来防止过拟合,但这不影响其基本形式。
通过优化这个损失函数(通常是使用梯度下降法或其变种),逻辑回归模型能够学习到最佳的参数 (w) 和 (b),从而使得预测概率 (p_i) 尽可能接近真实标签 (y_i),进而提高分类的准确性。
2.关键步骤
在逻辑回归的训练过程中,通过不断迭代调整模型参数(权重 (w) 和偏置 (b)),以减小损失函数 (L) 的值,达到模型优化的目的。这一过程具体包括以下几个关键步骤:
-
初始化参数:首先给模型的参数 (w) 和 (b) 设置初始值,这可以是随机值或者是零。
-
计算预测概率:对于每个样本 (x_i),计算其属于正类的概率 (p_i = \sigma(z_i)),其中 (z_i = w^T x_i + b),(\sigma) 是sigmoid函数,定义为 (\sigma(z) = \frac{1}{1 + e^{-z}})。
-
计算损失:利用上述提到的交叉熵损失函数公式,计算当前参数下整个数据集的损失 (L)。
-
梯度计算:接下来,需要计算损失函数关于每个参数的梯度,即损失函数对 (w) 和 (b) 的偏导数。这些梯度指示了参数更新的方向和步长。对于逻辑回归的交叉熵损失,梯度计算可得:
- 对于权重 (w_j):(\frac{\partial L}{\partial w_j} = \frac{1}{N} \sum_{i=1}^{N}(p_i - y_i)x_{ij})
- 对于偏置 (b):(\frac{\partial L}{\partial b} = \frac{1}{N} \sum_{i=1}^{N}(p_i - y_i))
-
参数更新:根据梯度下降的规则,使用学习率 (\alpha) 来调整参数,使其沿负梯度方向移动,以期望减少损失。更新公式如下:
- (w_j = w_j - \alpha \frac{\partial L}{\partial w_j})
- (b = b - \alpha \frac{\partial L}{\partial b})
-
迭代:重复步骤2至5,直到满足某个停止条件,比如损失函数的改变小于一个很小的阈值,或者达到预设的最大迭代次数。
-
正则化:为了防止过拟合,可以在损失函数中加入正则项(如L1或L2正则化),这会影响梯度计算和参数更新的过程,但基本的迭代优化框架保持不变。
通过这一系列步骤,逻辑回归模型逐渐学习到数据中的模式,并能够在新的数据上做出更准确的分类预测。
3.案例
下面是一个使用Python和scikit-learn库实现逻辑回归的简单代码案例,用于处理二分类问题。假设我们有一组特征数据X
和对应的标签数据y
。
# 导入所需库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import pandas as pd
import numpy as np# 假设数据已经加载到DataFrame中,X为特征,y为标签
# X = pd.DataFrame(...) # 特征数据
# y = pd.Series(...) # 标签数据# 如果没有现成的数据,我们可以创建一些模拟数据
np.random.seed(0)
X = np.random.rand(100, 2) # 创建100行2列的随机特征数据
y = (X[:, 0] + X[:, 1] > 1).astype(int) # 根据特征生成二元分类标签# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化逻辑回归模型
logreg = LogisticRegression(max_iter=10000) # max_iter设置较高以避免收敛警告# 训练模型
logreg.fit(X_train, y_train)# 预测测试集
y_pred = logreg.predict(X_test)# 计算并打印准确率
print("Accuracy of logistic regression classifier on test set: {:.2f}".format(logreg.score(X_test, y_test)))# 输出混淆矩阵
confusion_matrix = metrics.confusion_matrix(y_test, y_pred)
print("Confusion Matrix:\n", confusion_matrix)
这段代码首先导入了必要的库,并创建了一组简单的模拟数据来演示逻辑回归模型的训练和测试过程。然后,它将数据划分为训练集和测试集,初始化逻辑回归模型,并用训练数据拟合模型。最后,它对测试集进行预测,并计算模型的准确率及混淆矩阵,以评估模型性能。
请注意,实际应用中,您需要根据自己的数据集调整数据读取和预处理部分的代码。
在上述基础之上,如果我们想进一步优化模型或者进行模型的评估,可以考虑以下几个方面:
- 交叉验证:使用交叉验证来更稳健地评估模型性能,而不仅仅依赖于一次分割得到的训练集和测试集。
- 超参数调优:通过网格搜索或随机搜索等方法调整逻辑回归模型的超参数,如正则化强度
C
,以找到最优参数组合。 - 特征选择与工程:基于特征的重要性分析,选择或构建更有预测力的特征。
- 模型评估指标:除了准确率之外,还可以考虑查准率(Precision)、查全率(Recall)、F1分数等其他评估指标,特别是对于类别不平衡的数据集。
下面是这些概念如何融入代码的示例:
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.metrics import classification_report# 使用交叉验证评估模型
cv_scores = cross_val_score(logreg, X, y, cv=5) # 5折交叉验证
print("Cross-validation scores: ", cv_scores)
print("Mean cross-validation score: {:.2f}".format(np.mean(cv_scores)))# 超参数调优
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100]} # 设置要搜索的参数范围
grid_search = GridSearchCV(logreg, param_grid, cv=5)
grid_search.fit(X_train, y_train)# 输出最佳参数组合
print("Best parameters found: ", grid_search.best_params_)# 使用最佳参数重新训练模型
best_logreg = grid_search.best_estimator_
y_pred_best = best_logreg.predict(X_test)# 打印分类报告
report = classification_report(y_test, y_pred_best)
print("\nClassification Report:\n", report)
这段代码展示了如何使用5折交叉验证评估模型的稳定性和平均性能,以及如何通过GridSearchCV
进行超参数调优来找到模型的最佳配置。最后,利用找到的最佳参数重新训练模型,并使用classification_report
输出详细的分类评估指标,包括精确度、召回率、F1分数等,这有助于更全面地理解模型在不同类别上的表现。
————————————————
最后我们放松一下眼睛