亦菲喊你来学习之机器学习(6)--逻辑回归算法

逻辑回归

逻辑回归(Logistic Regression)是一种广泛使用的统计方法,用于解决分类问题,尤其是二分类问题。尽管名字中有"回归"二字,但它实际上是一种分类算法,因为它试图通过线性回归的方式去预测一个事件的发生概率(即属于某个类别的概率),然后根据设定的阈值(通常是0.5)来分类。

注意哦!逻辑回归其实是分类算法!!!

逻辑回归模型

逻辑回归模型使用逻辑函数(通常是sigmoid函数)将线性回归的预测值转换为概率值。sigmoid函数的公式如下:

其中,z 是线性回归模型的预测值,即 z =β 0+β 1x 1+β 2x 2+⋯+βnxn ,其中 β 0 是截距,β 1,β 2,...,βn 是回归系数,x 1,x 2,...,xn 是特征值。

逻辑回归模型的训练过程主要是找到最佳的回归系数(即 β 值),使得模型的预测概率与实际标签之间的差异最小。这通常通过最大化似然函数(在逻辑回归中,常用的是对数似然函数)来实现,也就是最小化负对数似然损失(Negative Log Likelihood Loss, NLL Loss)。

总的来说:就是通过概率来分类。

实现模型

对于实现一个算法模型,我们一般从以下几个方面来完成:

  1. 训练模型
  2. 测试模型

训练模型

  1. 收集数据
python 复制代码
  1. 数据预处理
python 复制代码
import pandas as pd
data = pd.read_csv('creditcard.csv') #读取数据
data = data.drop('Time',axis=1) #去除无关变量

from sklearn.preprocessing import StandardScaler #导入归一化方法
scaler = StandardScaler()
#对需要归一化处理的数据归一化,避免权重影响
data['Amount'] = scaler.fit_transform(data[['Amount']])
  1. 绘制图像,查看正负样本个数
python 复制代码
import matplotlib.pyplot as plt
from pylab import mpl

#字体调整
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False

#对样本中每个类别的数量计数,将其可视化,观察数据
lei_count = pd.value_counts(data['Class'])
plt.title('样本数')
plt.xlabel('类别')
plt.ylabel('数量')

lei_count.plot(kind = 'bar')
plt.show()
  1. 随机分割数据集与测试集

使用train_test_split方法,在数据中随机抽取数据作为训练集与测试集

python 复制代码
x = data.drop(["Class"],axis=1)
y = data.Class

from sklearn.model_selection import train_test_split

train_x,test_x,train_y,test_y = \
    train_test_split(x,y,test_size=0.3,random_state=0)	#test_size表示抽取的的测试集所占的百分比
  1. 交叉验证,选择较优的惩罚因子

在逻辑回归的算法中,逻辑模型的参数中,有一参数为正则化强度C,越小的数值表示越强的正则化。我们要进行调参数,看看哪个惩罚因子最为合适,使模型拟合效果更好:

python 复制代码
#交叉验证选择较优的惩罚因子
scores = []
c_param_range = [0.01,0.1,1,10,100] #参数:一般常用的惩罚因子

for i in c_param_range:
    lr = LogisticRegression(C = i,penalty='l2',solver='lbfgs',max_iter=1000)
    # C表示正则化强度,越小的数值表示越强的正则化。防止过拟合
    score = cross_val_score(lr,x_train,y_train,cv = 8,scoring='recall')
    #交叉验证,将模型和数据集传入,对其进行划分,每份轮流作为测试集来测试模型。返回一个列表对象
    score_mean = sum(score)/len(score)
    scores.append(score_mean)
beat_c = c_param_range[np.argmax(scores)] #argmax取出最大值的索引位置
  1. 训练模型
python 复制代码
lr = LogisticRegression(C = beat_c,penalty='l2',max_iter=1000)
lr.fit(x_train,y_train) #训练模型

测试模型

  1. 先用训练数据再次进入模型测试,查看他本身的模型训练效果怎么样:
python 复制代码
from sklearn import metrics

train_predicted = lr.predict(x_train)
print(metrics.classification_report(y_train,train_predicted)) #绘制混淆矩阵,查看测试参数
---------------------------------------------------------------
              precision    recall  f1-score   support

           0       1.00      1.00      1.00    199019
           1       0.88      0.62      0.73       345

    accuracy                           1.00    199364
   macro avg       0.94      0.81      0.86    199364
weighted avg       1.00      1.00      1.00    199364
  1. 再用分割的测试集来测试模型:
python 复制代码
test_predicted = lr.predict(x_test)
print(metrics.classification_report(y_test,test_predicted))
----------------------------------------------
              precision    recall  f1-score   support

           0       1.00      1.00      1.00     85296
           1       0.88      0.62      0.73       147

    accuracy                           1.00     85443
   macro avg       0.94      0.81      0.86     85443
weighted avg       1.00      1.00      1.00     85443

到这为止我们的模型就训练好啦,但是!!通过混淆矩阵我们可以发现,模型对类别为1的召回率只有0.62,这是比较差的,是什么原因导致的呢?

其实,在训练模型时第三步查看样本个数时,我们通过图片可以发现样本数量极度不均衡,致使训练时,类别1的数据训练不够,拟合欠缺,那么我们该如何处理呢?

处理方法有过采样(扩充样本数量)和下采样(数量多的将数据量向数量少的类别数量靠近),可以解决这个问题!我们下篇来介绍。

总结

本篇介绍了:

  1. 什么是逻辑回归:逻辑回归其实是分类算法!!!
  2. 逻辑回归算法如何分类:计算每个数据的属于哪个类别的概率,判断属于哪个类。(默认阈值0.5为分界线)
  3. 训练模型:
    1. 使用train_test_split方法,在数据中随机抽取数据作为训练集与测试集,使测试更有说服力。
    2. 交叉验证,选择较优的惩罚因子
相关推荐
数据的世界0113 分钟前
.NET开发人员学习书籍推荐
学习·.net
bastgia22 分钟前
Tokenformer: 下一代Transformer架构
人工智能·机器学习·llm
四口鲸鱼爱吃盐28 分钟前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
菜狗woc30 分钟前
opencv-python的简单练习
人工智能·python·opencv
15年网络推广青哥35 分钟前
国际抖音TikTok矩阵运营的关键要素有哪些?
大数据·人工智能·矩阵
AI莫大猫35 分钟前
(6)YOLOv4算法基本原理以及和YOLOv3 的差异
算法·yolo
taoyong00138 分钟前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
Uu_05kkq1 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
weixin_387545641 小时前
探索 AnythingLLM:借助开源 AI 打造私有化智能知识库
人工智能
engchina2 小时前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python