逻辑回归(Logistic Regression)是一种用于解决二分类(0/1)问题的统计学习方法。虽然它名为“回归”,但实际上它是一种分类方法,因为它预测的是样本属于某个类别的概率。逻辑回归通过引入逻辑函数(Sigmoid函数)来将线性回归的输出映射到[0, 1]区间,从而得到属于某个类别的概率。
一、逻辑回归的基本步骤
1.构建模型:
逻辑回归模型假设输入变量与输出变量之间存在线性关系,即。但这个线性关系需要通过逻辑函数(Sigmoid函数)进行转换,以得到属于某个类别的概率。
Sigmoid函数的形式为:sigmoid(z) = 1/(1 + exp(-z))
,其中 z
是线性回归的输出。
2.训练模型:
使用训练数据来估计模型参数(权重 w
和截距 w0
)。这通常通过最小化损失函数(如交叉熵损失函数)来完成,该损失函数衡量了模型预测与真实标签之间的差异。
损失函数的形式为:L(w) = - ∑ [y_i * log(p_i) + (1 - y_i) * log(1 - p_i)]
,其中 y_i
是真实标签,p_i
是模型预测的属于正类的概率。
最小化损失函数通常使用梯度下降或其变种(如随机梯度下降、批量梯度下降、Adam等)来进行。
3.评估模型:
使用测试数据来评估模型的性能。常见的评估指标包括准确率、精确率、召回率、F1分数和AUC-ROC等。
4.预测:
使用训练好的模型对新的、未见过的数据进行预测。
二、Sigmoid函数
sigmoid函数公式:
其函数曲线如下:
代入
得 其中x是我们的输入,w和b为我们要求取的参数
# sigmoid函数
def sigmoid(inX):
return 1.0 / (1 + exp(-inX))
梯度上升算法:
# 梯度上升算法
def gradAscent(dataMat, classLabels): # dataMat数据集、classLabels数据标签
dataMatrix = mat(dataMat) # 转换为NumPy矩阵
labelMat = mat(classLabels).transpose() # 转换为NumPy矩阵,并且矩阵转置
m, n = shape(dataMatrix) # 获取数据集矩阵的大小,m为行数,n为列数
alpha = 0.001 # 目标移动的步长
maxCycles = 500 # 迭代次数
weights = ones((n, 1)) # 权重初始化为1
for k in range(maxCycles): # 重复矩阵运算
h = sigmoid(dataMatrix * weights) # 矩阵相乘,计算sigmoid函数
error = (labelMat - h) # 计算误差
weights = weights + alpha * dataMatrix.transpose() * error # 矩阵相乘,更新权重
return weights
三、逻辑回归例子(简单)
1.导入库:这里我们导入了train_test_split用于分割数据集,LogisticRegression用于创建逻辑回归模型,accuracy_score用于评估模型准确度,以及pandas用于数据加载和处理。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import pandas as pd
2.加载数据集:我们使用pandas的read_csv函数加载CSV文件,并设最后一列是标签。
数据集分割:我们将数据集分割为训练集和测试集。训练集用于训练模型,测试集用于评估模型性能。
age(年龄)、sex(性别,女生0,男生1)、income(收入,高收入3,中等收入2,低收入1)和一个目标变量purchased(是否购买,目标变量是一个二元分类变量,取值为yes或no)
data = pd.read_csv('D:\zy\机器学习\dataset.csv')
# 最后一列是目标变量,其余列是特征
X = data.iloc[:, :-1] # 除了最后一列的所有列(特征)
y = data.iloc[:, -1] # 最后一列(标签)
3.创建逻辑回归模型:我们使用LogisticRegression
类初始化一个逻辑回归模型。
训练模型:我们使用训练数据(X_train
和y_train
)拟合模型。
# 初始化逻辑回归模型
model = LogisticRegression()
# 使用训练数据拟合模型
model.fit(X_train, y_train)
5.预测:我们使用训练好的模型对测试集进行预测。评估模型:我们使用accuracy_score
函数计算模型的准确度,并将结果打印出来。
# 对测试集进行预测并使用准确度评估模型性能
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')
7.进一步分析:你可以根据需要对模型进行进一步的分析,例如查看系数和截距,计算混淆矩阵,绘制ROC曲线等。
print('Coefficients:', model.coef_) #系数
print('Intercept:', model.intercept_) #截距
四、逻辑回归的优缺点
- 优点:
- 实现简单,计算效率高。
- 可以给出分类的概率预测,而不仅仅是类别标签。
- 对线性关系敏感,能够很好地处理线性可分问题。
- 可解释性强,可以清晰地看到每个特征对最终预测结果的影响。
- 缺点:
- 对非线性问题处理能力有限,需要进行特征工程或使用其他模型(如决策树、神经网络)来处理非线性关系。
- 对特征间的相关性敏感,如果特征之间存在多重共线性,可能会影响模型的性能。
- 对缺失值和异常值敏感,需要进行适当的数据预处理。