亦菲喊你来学习之机器学习(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. 交叉验证,选择较优的惩罚因子
相关推荐
迷迭所归处7 分钟前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ35 分钟前
Java 23 的12 个新特性!!
java·开发语言·学习
leon62536 分钟前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林36 分钟前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
小齿轮lsl40 分钟前
PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
笔记·学习·matlab
Navigator_Z1 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
Aic山鱼1 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
qq11561487071 小时前
Java学习第八天
学习
天玑y2 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
2301_789985942 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习