1,逻辑回归的应用场景:
逻辑回归主要用于二分类问题。 在医疗领域,用于疾病诊断和治疗效果预测;在金融领域,可进行信用风险评估和金融市场趋势预测;在市场营销领域,用于客户购买行为预测和客户细分;在互联网领域,用于垃圾邮件识别和用户流失预测;在交通领域,用于交通事故风险评估等。
2,逻辑回归的原理及完整流程:
2.1:模型输入:
逻辑回归模型的输入是一组特征向量。假设我们有个n特征变量,记为,那么对于一个样本,其输入特征向量可表示为
2.2:线性组合:
首先对输入特征进行线性组合,得到一个线性表达式:
这里的是模型需要学习的参数,其中为截距项。
2.3:激活函数(Sigmoid)函数:
接着,通过激活函数将线性组合的结果z映射到一个概率值。逻辑回归常用的激活函数是 Sigmoid 函数,其公式为:
这个p值表示样本属于正类(类别 1)的概率,而属于负类(类别 0)的概率为1-p。
2.4:损失函数:
在逻辑回归中,常用的损失函数是对数似然损失函数。对于一个包含个m样本的数据集(其中是第个样本的特征向量,是对应的类别标签),对数似然损失函数为:
这里的目标是要最小化这个损失函数,找到使得损失函数最小的参数的值。
2.5:优化(梯度下降法)
梯度下降法是用于优化模型参数以最小化损失函数的常用方法。其基本思想是沿着损失函数的梯度反方向更新参数,使得损失函数逐渐减小。
对于逻辑回归模型,参数更新公式如下:
其中是学习率,它控制着每次参数更新的步长。
计算梯度需要对损失函数求偏导,这里以()为例(的更新类似):
=
通过不断迭代更新参数,直到满足停止条件(如损失函数值小于某个阈值或者达到预定的迭代次数)。
3,计算例子
假设我们根据学生的学习时长和模拟考试成绩来预测学生是否能通过考试,通过为 1,未通过为 0。
3.1:数据准备:
学习时长(x1) | 模拟考试成绩(x2) | 是否通过考试(y) |
---|---|---|
3 小时 | 70 分 | 1 |
2 小时 | 60 分 | 0 |
4 小时 | 80 分 | 1 |
1 小时 | 50 分 | 0 |
3.2:模型初始化:
假设我们的逻辑回归模型有两个特征(学习时长x1和模拟考试成绩x2),加上截距项,我们先随机初始化参数:
,
3.3:计算预测概率:
以第一个样本(x1=3,x2=70,y=1)为例:
首先进行线性组合:
然后通过 Sigmoid 函数计算预测通过考试的概率:
3.4:计算损失函数值:
根据第一个样本的标签y=1和计算得到的,计算对数似然损失函数部分的值为:
=
,这个数值接近于0,表明预测的非常准确,对所有训练样本进行类似的计算,得到整个数据集的损失函数值。
3.5:参数更新:
按照梯度下降法,根据计算得到的损失函数对各参数的偏导数,结合设定的学习率(假设学习率),更新参数、,。
例如,对的更新(这里省略具体求偏导过程,只展示大致步骤):
先计算出关于的损失函数偏导数,假设为 = -0.5(实际计算要根据完整公式和数据集)
则更新后的为:
类似地更新和。
3.6:迭代训练:
不断重复步骤 3、4、5,直到满足停止条件,比如损失函数值小于某个设定的阈值(如 0.001)或者达到预定的迭代次数(如 1000 次)。
4,实战训练:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
4.1:获取数据
# 读取之前生成的CSV数据
df = pd.read_csv('A:\数模代码\数据\已婚数据.csv')
4.2:基本数据处理
4.2.1:缺失值处理
# 4.2.1:缺失值处理
# 检查是否存在缺失值
print("缺失值情况:")
print(df.isnull().sum())
4.2.2:确定特征值和目标值
# 4.2.2:确定特征值和目标值
X = df.drop('Is_Married', axis=1) # 特征值,去掉目标列'Is_Married'
y = df['Is_Married'] # 目标值
4.2.3:分割数据
# 4.2.3:分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
4.3:特征工程(标准化)
# 4.3:特征工程(标准化)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
4.4:机器学习(逻辑回归)
# 4.4:机器学习(逻辑回归)
logreg = LogisticRegression()
logreg.fit(X_train_scaled, y_train)
4.5:模型评估
# 4.5:模型评估
y_pred = logreg.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print("准确率:", accuracy)
print("精确率:", precision)
print("召回率:", recall)
print("F1值:", f1)
5,分类模型的评估方法(⭐)
5.1精确率与召回率:
5.1.1:混淆矩阵
定义:混淆矩阵(Confusion Matrix)是用于评估分类模型性能的一种工具,它是一个2×2(在二分类问题中)的矩阵,展示了模型预测结果与实际结果的对比情况。
(正类:positive - P 负类:negative - N 正确:True - T 错误:False - F)
预测为正类 | 预测为负类 | |
实际为正类 | TP | FN |
实际为负类 | FP | TN |
5.1.2:准确率(Accuracy),精确率(Precision),召回率(Recall)
精确率:精确率是指在所有被模型预测为正类的样本中,真正属于正类的比例。它衡量了模型预测正类的准确性。例如,在垃圾邮件分类中,精确率表示被模型判定为垃圾邮件的邮件中,真正是垃圾邮件的比例。
准确率(Accuracy): 准确率是指模型正确预测的样本数占总样本数的比例。它考虑了所有类别预测正确的情况,是一个综合评估模型在整个数据集上预测准确性的指标。
召回率:召回率是指在所有实际为正类的样本中,被模型正确预测为正类的比例。它衡量了模型对正类样本的覆盖程度。例如,在疾病筛查中,召回率表示实际患病的人中,被模型正确诊断为患病的比例。
5.1.3计算例子:
假设我们有一个用于判断学生是否通过考试的模型,总共有 100 个学生。经过模型预测和实际结果对比后,发现:
- 有 30 个学生实际通过考试,模型也预测通过,即TP=30。
- 有 10 个学生实际未通过考试,但模型预测通过,即FP=10。
- 有 20 个学生实际通过考试,但模型预测未通过,即FN=20。
- 有 40 个学生实际未通过考试,模型也预测未通过,即TN=40。
- 那么精确率为:
- 这意味着模型预测通过考试的学生中,有 75% 是真正通过考试的。
- 召回率为:
- 这表示实际通过考试的学生中,模型只能正确识别出 60%。
5.2:F1-score:
定义:F1 - score 是精确率(Precision)和召回率(Recall)的调和平均数,它综合考虑了精确率和召回率,用于衡量模型在正类预测上的综合性能。当精确率和召回率都高时,F1 - score 的值也高,这样可以避免只考虑精确率或召回率单方面指标所带来的片面性。
F1-score计算公式:
计算例子:
假设我们在一个疾病诊断模型中有以下情况:
精确率Precision=0.8(即模型诊断为患病的人中真正患病的比例为 80%)
召回率Recall=0.6(即实际患病的人中被模型正确诊断出患病的比例为 60%)。
这意味着该疾病诊断模型在综合考虑精确率和召回率后的性能得分为 0.686。如果我们调整模型使得精确率和召回率发生变化,F1 - score 也会相应地改变,我们可以通过比较不同模型或者同一模型不同参数下的 F1 - score 来评估模型的综合性能。
5.3:分类评估报告api:
# 输出分类评估报告
print(classification_report(y_test, y_pred))
precision recall f1-score support
0 0.55 0.57 0.56 109
1 0.47 0.45 0.46 91
accuracy 0.52 200
macro avg 0.51 0.51 0.51 200
weighted avg 0.51 0.52 0.51 200
5.4:ROC曲线与AUC指标:
5.4.1:TPR(True Positive Rate,真阳性率)与FPR(False Positive Rate,假阳性率)
5.4.1.1:TPR 原理和计算
定义:TPR 也称为召回率,它表示在所有实际为正类的样本中,被模型正确预测为正类的例。这反映了模型对正类样本的识别能力。
计算公式:
5.4.1.2:FPR 原理和计算
定义:FPR 表示在所有实际为负类的样本中,被模型错误预测为正类的比例。它反映了模型将负类样本误判为正类的情况。
计算公式:
5.4.2:ROC 曲线(Receiver Operating Characteristic Curve)曲线:
原理:ROC 曲线是通过改变分类模型的决策阈值,以 TPR 为纵坐标,FPR 为横坐标绘制的曲线。它展示了在不同阈值下,模型对正类和负类的区分能力。一个理想的模型,其 ROC 曲线应该尽可能靠近左上角(TPR 高,FPR 低)。
绘制例子:
假设我们有一个简单的二分类模型,其预测 5 个样本为正类的概率分别为0.9,0.8,0.7,0.6,0.5,对应的实际类别为1,1,0,1,0。
(1)当阈值设为0.9时,只有第一个样本预测为正类,此时TP=1,FP=0,FN=2,TN=2, 。
(2)当阈值设为0.8时,前两个样本预测为正类,此时,,,,,。
(3)当阈值设为时0.7,前三个样本预测为正类,此时,,,,,。
以此类推,计算不同阈值下的 TPR 和 FPR,然后绘制 ROC 曲线。
5.4.3:AUC 指标(Area Under the Curve)原理和计算方法:
原理:AUC 是 ROC 曲线下的面积,它的取值范围在0.5到1之间。AUC = 0.5表示模型的预测能力等同于随机猜测;AUC = 1表示模型是完美的分类器,能够完全正确地区分正类和负类。AUC 值越高,模型的分类性能越好。
计算方法梯形法(数值积分法):
如果已经得到了一系列的 TPR 和 FPR 值(如通过上述绘制 ROC 曲线的过程),可以使用梯形法来计算 AUC。假设我们有n个点,按照 FPR 从小到大排序。AUC 的计算公式为
6,最终结果展示:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report, confusion_matrix, roc_curve, auc
import matplotlib.pyplot as plt
import seaborn as sns
import os
# 如果不存在images文件夹则创建
if not os.path.exists('images'):
os.makedirs('images')
# 读取之前生成的CSV数据
df = pd.read_csv('A:\数模代码\数据\已婚数据.csv')
# 将Gender列转换为整数
gender_mapping = {'Male': 0, 'Female': 1}
df['Gender'] = df['Gender'].map(gender_mapping)
# 4.2:基本数据处理
# 4.2.1:缺失值处理
# 检查是否存在缺失值
print("缺失值情况:")
print(df.isnull().sum())
# 这里假设数据没有缺失值,如果有缺失值,可以根据情况选择合适的填充方法,例如:
# 对于数值型列可以用均值、中位数填充等,以下是用均值填充的示例(假设Age列有缺失值)
# df['Age'].fillna(df['Age'].mean(), inplace=True)
# 4.2.2:确定特征值和目标值
X = df.drop('Is_Married', axis=1) # 特征值,去掉目标列'Is_Married'
y = df['Is_Married'] # 目标值
# 4.2.3:分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 4.3:特征工程(标准化)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 4.4:机器学习(逻辑回归)
logreg = LogisticRegression()
logreg.fit(X_train_scaled, y_train)
# 4.5:模型评估
y_pred = logreg.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print("准确率:", accuracy)
print("精确率:", precision)
print("召回率:", recall)
print("F1值:", f1)
# 输出分类评估报告
print(classification_report(y_test, y_pred))
# 绘制混淆矩阵
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.savefig('images/confusion_matrix.png')
plt.show()
# 绘制ROC曲线并计算AUC指标
y_pred_proba = logreg.predict_proba(X_test_scaled)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.savefig('images/roc_curve.png')
plt.show()
缺失值情况:
Height 0
Appearance_Rating 0
Weight 0
Age 0
Gender 0
Is_Married 0
dtype: int64
准确率: 0.515
精确率: 0.4659090909090909
召回率: 0.45054945054945056
F1值: 0.4581005586592179
precision recall f1-score support
0 0.55 0.57 0.56 109
1 0.47 0.45 0.46 91
accuracy 0.52 200
macro avg 0.51 0.51 0.51 200
weighted avg 0.51 0.52 0.51 200
(训练数据是机器模拟生成的,训练效果0.5,也呈现随机性)
7,模型优化策略:
7.1:数据层面:
特征选择:目前使用的特征(身高、颜值、体重、年龄、性别)不一定都对预测是否结婚有显著贡献。可以通过一些特征选择方法,如相关系数分析、卡方检验、递归特征消除(RFE)等,来筛选出与目标变量相关性更强的特征,去除那些可能带来噪声的无关特征。例如,计算每个特征与 “是否结婚” 目标变量的相关系数,保留相关系数绝对值较大的特征(或者直接PCA降维)。
7.2:参数调优:
调整正则化参数:逻辑回归中的正则化参数(如 L1 正则化的alpha
参数、L2 正则化的C
参数)控制着模型的复杂度。如果模型出现过拟合(在训练集上准确率高,但在测试集上准确率低),可以适当增加正则化强度(减小C
值或增加alpha
值)来简化模型,防止过拟合;如果模型出现欠拟合(在训练集和测试集上准确率都低),则可以适当减小正则化强度(增加C
值或减小alpha
值),让模型能够更好地拟合数据。
网格搜索(Grid Search):定义一个超参数的取值范围网格,然后对网格中的每一个超参数组合进行模型训练和评估,最后选择性能最佳的超参数组合。例如,对于逻辑回归的C
参数,可以设置一个取值范围(如 [0.01, 0.1, 1, 10, 100]),同时对其他可能的超参数(如求解算法选择等)也设置不同取值,然后通过网格搜索找到最优组合。