首页 > 其他分享 >分类模型-逻辑回归

分类模型-逻辑回归

时间:2024-11-14 14:44:25浏览次数:3  
标签:逻辑 plt train 回归 正类 score test 模型

1,逻辑回归的应用场景:

逻辑回归主要用于二分类问题。 在医疗领域,用于疾病诊断和治疗效果预测;在金融领域,可进行信用风险评估和金融市场趋势预测;在市场营销领域,用于客户购买行为预测和客户细分;在互联网领域,用于垃圾邮件识别和用户流失预测;在交通领域,用于交通事故风险评估等。

2,逻辑回归的原理及完整流程:

2.1:模型输入:

逻辑回归模型的输入是一组特征向量。假设我们有个n特征变量,记为$x_1, x_2, \cdots, x_n$,那么对于一个样本,其输入特征向量可表示为$\mathbf{x} = (x_1, x_2, \cdots, x_n)$

2.2:线性组合:

首先对输入特征进行线性组合,得到一个线性表达式:
                                z = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_nx_n
这里的$\beta_0, \beta_1, \cdots, \beta_n$是模型需要学习的参数,其中$\beta_0$为截距项。

2.3:激活函数(Sigmoid)函数:

接着,通过激活函数将线性组合的结果z映射到一个概率值。逻辑回归常用的激活函数是 Sigmoid 函数,其公式为:

                                                          p = \frac{1}{1 + e^{-z}}

这个p值表示样本属于正类(类别 1)的概率,而属于负类(类别 0)的概率为1-p。

2.4:损失函数:

在逻辑回归中,常用的损失函数是对数似然损失函数。对于一个包含个m样本的数据集$\{(\mathbf{x}^{(i)}, y^{(i)})\}_{i = 1}^{m}$(其中$\mathbf{x}^{(i)}$是第个i样本的特征向量,$y^{(i)}\in\{0, 1\}$是对应的类别标签),对数似然损失函数为:

                 L(\beta) = -\sum_{i = 1}^{m}[y^{(i)}\ln p(\mathbf{x}^{(i)}) + (1 - y^{(i)})\ln(1 - p(\mathbf{x}^{(i)}))]

这里的目标是要最小化这个损失函数,找到使得损失函数最小的参数$\beta$的值。

2.5:优化(梯度下降法)

梯度下降法是用于优化模型参数以最小化损失函数的常用方法。其基本思想是沿着损失函数的梯度反方向更新参数,使得损失函数逐渐减小。

对于逻辑回归模型,参数更新公式如下:

                                                        \beta_j \leftarrow \beta_j - \alpha\frac{\partial L(\beta)}{\partial \beta_j}

其中$\alpha$是学习率,它控制着每次参数更新的步长。

计算梯度$\frac{\partial L(\beta)}{\partial \beta_j}$需要对损失函数求偏导,这里以\beta_j($j = 1, \cdots, n$)为例(的更新类似):

                            $\frac{\partial L(\beta)}{\partial \beta_j}$    =     -\sum_{i = 1}^{m}\left[\frac{y^{(i)}}{p(\mathbf{x}^{(i)})}\frac{\partial p(\mathbf{x}^{(i)})}{\partial \beta_j} - \frac{(1 - y^{(i)})}{1 - p(\mathbf{x}^{(i)})}\frac{\partial p(\mathbf{x}^{(i)})}{\partial \beta_j}\right]

通过不断迭代更新参数,直到满足停止条件(如损失函数值小于某个阈值或者达到预定的迭代次数)。

3,计算例子

假设我们根据学生的学习时长和模拟考试成绩来预测学生是否能通过考试,通过为 1,未通过为 0。

3.1:数据准备:

学习时长(x1)模拟考试成绩(x2)是否通过考试(y)
3 小时70 分1
2 小时60 分0
4 小时80 分1
1 小时50 分0

3.2:模型初始化:

假设我们的逻辑回归模型有两个特征(学习时长x1和模拟考试成绩x2),加上截距项$\beta_0$,我们先随机初始化参数:
                                            \beta_0 = 0,\beta_1 = 0.1\beta_2 = 0.1

3.3:计算预测概率:

以第一个样本(x1=3,x2=70,y=1)为例:

首先进行线性组合:

                 z = \beta_0 + \beta_1x_1 + \beta_2x_2 = 0 + 0.1\times3 + 0.1\times70 = 7.3

然后通过 Sigmoid 函数计算预测通过考试的概率:

                                        p = \frac{1}{1 + e^{-7.3}}  \approx 0.999

3.4:计算损失函数值:

根据第一个样本的标签y=1和计算得到的,计算对数似然损失函数部分的值为:

y\ln p+(1 - y)\ln(1 - p)=1\times\ln(0.999)+(1 - 1)\times\ln(1 - 0.999) = \ln(0.999)

,这个数值接近于0,表明预测的非常准确,对所有训练样本进行类似的计算,得到整个数据集的损失函数值。

3.5:参数更新:

按照梯度下降法,根据计算得到的损失函数对各参数的偏导数,结合设定的学习率(假设学习率$\alpha = 0.01$),更新参数$\beta_0$$\beta_1$$\beta_2$

例如,对$\beta_1$的更新(这里省略具体求偏导过程,只展示大致步骤):

先计算出关于$\beta_1$的损失函数偏导数,假设为$\frac{\partial L(\beta)}{\partial \beta_j}$ = -0.5(实际计算要根据完整公式和数据集)

则更新后的$\beta_1$为:

                        \beta_1 \leftarrow \beta_1 - \alpha\frac{\partial L(\beta)}{\partial \beta_1}= 0.1 - 0.01\times(-0.5) = 0.105

类似地更新$\beta_0$$\beta_2$

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)

预测为正类预测为负类
实际为正类TPFN
实际为负类FPTN

5.1.2:准确率(Accuracy),精确率(Precision),召回率(Recall)

精确率:精确率是指在所有被模型预测为正类的样本中,真正属于正类的比例。它衡量了模型预测正类的准确性。例如,在垃圾邮件分类中,精确率表示被模型判定为垃圾邮件的邮件中,真正是垃圾邮件的比例。

                                                 $Precision=\frac{TP}{TP + FP}$

 准确率(Accuracy):  准确率是指模型正确预测的样本数占总样本数的比例。它考虑了所有类别预测正确的情况,是一个综合评估模型在整个数据集上预测准确性的指标。

                                 $Accuracy=\frac{TP + TN}{TP + TN+FP + FN}$

召回率:召回率是指在所有实际为正类的样本中,被模型正确预测为正类的比例。它衡量了模型对正类样本的覆盖程度。例如,在疾病筛查中,召回率表示实际患病的人中,被模型正确诊断为患病的比例。

                                                  $Recall=\frac{TP}{TP + FN}$

5.1.3计算例子:

假设我们有一个用于判断学生是否通过考试的模型,总共有 100 个学生。经过模型预测和实际结果对比后,发现:

  • 有 30 个学生实际通过考试,模型也预测通过,即TP=30。
  • 有 10 个学生实际未通过考试,但模型预测通过,即FP=10。
  • 有 20 个学生实际通过考试,但模型预测未通过,即FN=20。
  • 有 40 个学生实际未通过考试,模型也预测未通过,即TN=40。
  • 那么精确率为:$Precision=\frac{TP}{TP + FP}=\frac{30}{30 + 10}=0.75$
  • 这意味着模型预测通过考试的学生中,有 75% 是真正通过考试的。
  • 召回率为:$Recall=\frac{TP}{TP + FN}=\frac{30}{30 + 20}=0.6$
  • 这表示实际通过考试的学生中,模型只能正确识别出 60%。

5.2:F1-score:

定义:F1 - score 是精确率(Precision)和召回率(Recall)的调和平均数,它综合考虑了精确率和召回率,用于衡量模型在正类预测上的综合性能。当精确率和召回率都高时,F1 - score 的值也高,这样可以避免只考虑精确率或召回率单方面指标所带来的片面性。

F1-score计算公式:

                              $F1 - score=\frac{2\times Precision\times Recall}{Precision + Recall}$

计算例子:

假设我们在一个疾病诊断模型中有以下情况:

精确率Precision=0.8(即模型诊断为患病的人中真正患病的比例为 80%)

召回率Recall=0.6(即实际患病的人中被模型正确诊断出患病的比例为 60%)。

                         $F1 - score=\frac{2\times0.8\times0.6}{0.8 + 0.6}=\frac{0.96}{1.4}\approx0.686$

这意味着该疾病诊断模型在综合考虑精确率和召回率后的性能得分为 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 也称为召回率,它表示在所有实际为正类的样本中,被模型正确预测为正类的例。这反映了模型对正类样本的识别能力。

计算公式:                                $TPR = \frac{TP}{TP + FN}$

5.4.1.2:FPR 原理和计算

定义:FPR 表示在所有实际为负类的样本中,被模型错误预测为正类的比例。它反映了模型将负类样本误判为正类的情况。

计算公式:                               $FPR=\frac{FP}{FP + TN}$

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,                                             $TPR=\frac{1}{1 + 2}=\frac{1}{3}$            $FPR=\frac{0}{0 + 2}=0$

(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_1, TPR_1),(FPR_2, TPR_2),\cdots,(FPR_n, TPR_n)$,按照 FPR 从小到大排序。AUC 的计算公式为            

                       $AUC=\frac{1}{2}\sum_{i = 1}^{n - 1}(TPR_{i + 1}+TPR_i)(FPR_{i + 1}-FPR_i)$

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]),同时对其他可能的超参数(如求解算法选择等)也设置不同取值,然后通过网格搜索找到最优组合。

标签:逻辑,plt,train,回归,正类,score,test,模型
From: https://blog.csdn.net/ABCabc0286/article/details/143752687

相关文章

  • AI大模型
    AI大模型通常指的是那些参数量极大、训练数据广泛、具有强大生成或理解能力的人工智能模型。这类模型在自然语言处理(NLP)、计算机视觉(CV)等多个领域表现出色。以下是一些关于AI大模型的关键点:模型架构:大多数现代大模型采用的是深度学习架构,如Transformer,这种架构能够有效处理序......
  • AI大模型
    AI大模型指的是那些拥有大量参数和复杂结构的人工智能模型,能够处理多种任务,生成高质量的输出。它们通常基于深度学习框架,尤其是像Transformer这样的架构,具有强大的学习和泛化能力。下面是AI大模型的一些重要特点:1.参数规模与计算需求AI大模型的一个显著特点是其庞大的参数量......
  • LIMA模型——大模型对齐的新方法
     人工智能咨询培训老师叶梓转载标明出处大模型通常在两个阶段进行训练:首先是从原始文本中进行无监督预训练,以学习通用表示;其次是通过大规模的指令微调和强化学习,以更好地适应最终任务和用户偏好。来自MetaAI、卡内基梅隆大学和特拉维夫大学研究人员提出了,通过LIMA模型,对这......
  • 【大模型书籍】复旦大学推出首部大模型中文专著,引领AI学习新风潮!
    前言在信息爆炸的时代,自然语言处理(NLP)技术如同璀璨的星辰,照亮了我们与机器沟通的道路。而今,复旦大学自然语言处理实验室的教授团队,如同航海家般,为我们带来了一本指引大语言模型领域前行的明灯——《大语言模型入门与实践》。......
  • 知乎3.4万赞,大模型入门书籍精选!2025年程序员必备!
    在知乎上,"如何系统的入门大模型?"这一话题引爆了超过50万读者的热烈讨论。作为程序员,我们应当是最先了解大模型的人,也是率先成为了解大模型应用开发的人,到底如何入门大模型的应用开发?前排提示,文末有大模型AGI-CSDN独家资料包哦!我精心整理了一份2024年畅销的大模型书单。......
  • 人工智能AI→计算机视觉→机器视觉→深度学习→在ImageNet有限小样本数据集中学习深度
    前言:通过前篇《人工智能AI→计算机视觉→机器视觉→深度学习→在ImageNet有限小样本数据集中学习深度模型的识别任务实践》我们可以学到如何对实际生活、工作场景中的字符识别、人脸识别、图像类别进行识别的基于深度学习方法的技术路径实现具体包括:准备数据集制作、创建深......
  • 哈工大出品《自然语言处理新范式:基于预训练模型的方法》一本书读懂ChatGPT背后核心技
    大家好,今天给大家推荐一本来自哈工大创作的一本大模型书籍《自然语言处理新范式:基于预训练模型的方法》!这本大模型书籍已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】为什么推荐这本书?近些年来,以GPT、BERT为代表的预训练模型......
  • 怎么设计一个自己的大模型?设计一个大模型需要哪些能力?
    “自己设计并实现一个大模型,才能对大模型技术有更加深刻的体会**”**对学习大模型技术的人来说,大家都想体验自己训练和微调一个模型,但受限于自身条件,可能很多人无法达成这个目的;但不知道有人是否思考过,能否自己设计一个模型,根据自己的想法去落地一个大模型。当然,这个大模......
  • 如何打造你的AI大模型:开源大模型指南
    本地大语言模型为什么要用开源模型大语言模型有两种类型:闭源的模型,如GPT-3.5、GPT-4、Cluade、文心一言等开源的模型,如LLaMA、ChatGLM,Qianwen等开源模型的优势已知目前最强的gpt4等大模型是商用闭源的,这些模型参数更大,更加智能,为什么我们会关注开源模型呢?可......
  • 大模型神书《HuggingFace自然语言处理详解——基于BERT中文模型的任务实战》读完少走
    这几年,自然语言处理(NLP)绝对是机器学习领域最火的方向。那么今天给大家带来一本《HuggingFace自然语言处理详解——基于BERT中文模型的任务实战》这本大模型书籍资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】★内容全面本......