3.1 逻辑回归模型先导回归和分类的区别有监督学习数据带有标签比如之前的小明的学习时长无监督学习数据不带有标签最典型的算法聚类算法输入一部分数据将这些数据的类型分为类别有监督学习可以分为两大任务回归任务、分类任务回归举个例子输入一个人每日的运动时间、睡眠时间、工作时间、饮食等一些特征来预测一个人的体重一个人的体重的值可以有无限个值。所以预测的结果是无限的、不确定的连续数值。这样的机器学习任务就是回归任务。分类如果利用一个人每日的运动时间、睡眠时间、工作时间、饮食等一些特征来判断这个人的身体状况是否健康那么最终的判断的结果就只有两种健康和不健康。这样的输出结果为离散值预测的结果也是一个有限的数值来代表种类。3.2 逻辑回归原理逻辑回归算法原理虽然名字里带有回归但是是做二分类的任务是利用回归来做分类的sigmoid函数z取负无穷到正无穷这个区间他会把函数值映射到0-1前面讲了逻辑回归的sigmoid函数按照线性回归的原理和逻辑来讲x为特征w为权重的重要性可以把z转化成线性回归的函数比如一个人运动的时间睡觉的时间吃多少为数据输入在里面。同时各有合适的权重最后会的出来一个值将所有的值会映射到0-1之间。那么我们会想到一个问题就是概率不会超过1假设我们判断这个人是否健康超过0.5就是健康低于就是不健康就可以进行一个分类所以说逻辑回归可以利用回归的方法进行分类。当面对一个二分类问题应该如何处理用sigmoid函数去表达正例的概率和反例的概率。将这两个公式结合起来一个公式搞定所有可将y1和y0代入下面的公式现在数学模型有了假设现在有一组数据数据中包含特征、标签、w和b现在想要使模型拟合我们的数据就使用前面的梯度下降法进行参数更新不断学习数据进行更新w和b但是在学习之前我们有一个损失函数为了使损失函数变低lossw合理或者最优会使误差很小或者没有无限接近于03.3 w参数的更新这里用到了交叉熵损失函数 交叉熵损失函数解析-CSDN博客为什么要用到交叉熵主要是比较两个模型它们之间的障碍有什么如果两个模型是一样的那么比较起来就比较容易因为是同样的参数但如果不一样就没有办法直接比较我们需要一个像货币体系一样去衡量各种类型的事物那么在模型当中他就是熵代表一个系统里的混乱程度。了解熵的前提概念是信息量关键是信息量是否能给你带来确定性我们假设f(x)信息量尝试去找f(x)的表达式阿根廷夺冠的路径不同但是携带的信息量应该是一样的必须满足为了自洽系数最简单的形式就是用1可以但是不符合我们直观的感觉想象一下应该是概率越小所带的信息量越多那么就是相反的关系而log单调递增所以加负号递减以什么为底合适以e或者2为底所以信息量可以理解成一个不确定的事情变成确定的事情的难度有多大熵与其类似熵是衡量一个系统里的所有事件是怎样的对熵进行定义对该系统计算期望把里面所有可能发生的事件的信息量求出来再和概率进行相乘最后把所有事件加起来得到的就是系统的熵。相对熵p在前就是以p为基准去考虑p和q相差有多少将交叉熵应用到神经网络当中由于是两个不同的课程体系上面图片的yi是预测结果下面图片的yi是真是标签也就是上面图片的xi而我们求损失是要求平均损失所以下面的式子当中多了除以m得到了我们的平均损失3.4 b参数的更新3.5 分类和回归模型评价指标回归输出连续值分类是离散值导致模型的评价指标不同。分类模型的评价指标案例现在有一个深度学习的模型来检测病人是否有肿瘤的判断很显然这是一个二分类的任务只有两种结果第一种结果是判定有肿瘤第二种是判定没有肿瘤。假设现在有100个人其中有10个人是患有肿瘤的90个人是健康的。现在这个深度学习模型对这100个人进行判断最后的判断结果为有10个人患有肿瘤90个人是健康的。对比真实的结果发现10个人被判断患有肿瘤的人中间有5人是健康的另外5个人是患有肿瘤的而被判断为健康的90人中有85个人是健康的另外5个人是患有肿瘤的。在计算评价指标之前先定义一些参数首先本案例的目标是判定一个人是否有肿瘤那么有肿瘤就是正类健康就是反类。定义参数如下真实为正类预测为正类称为真正用TP表示。本案例中一共有10个正类患有肿瘤其中有5个被预测出来了因此本案例的TP5。真实为负类预测为负类称为真负用TN表示。本案例中一共有90个负类健康其中有85个被预测出来了因此本案例的TN85。真实为负类预测为正类称为假正误报用FP表示。本案例中一共有90个负类健康其中有5个被预测为正类患有肿瘤因此本案例的FP5。真实为正类预测为负类称为假负漏报用FN表示。本案例中一共有10个正类患有肿瘤其中有5个被预测为负类健康因此本案例的FN5。准确率:现在我们来用准确率这个指标来看看模型的性能准确就是通俗我们说的有多少判断对了这个评价指标是将正类和负类是否都预测对包含在内因此准确率的计算公式如下所示:利用该公式计算模型的准确率为:从最后的准确率来看模型的效果貌似是不错的但是在案例中我们看到有10个人患有肿瘤这个模型只预测出来5个如果我们偏信这个模型的话那将会有5个人漏报了产生的结果将很严重。导致这样的结果的原因是样本不均衡因为正类和负类的数量相差太大试想一下在这样一个不均衡的样本中我直接认定所有的样本都是正类那么准确率也是90%。因此此时准确率就不能很好作为模型的评价指标了。精确率精确率的计算公式为:精确率又叫查准率精确率告诉我们在预测出来的正类样本中真正为正类的比例是多少精确率的计算公式为:召回率召回率又叫查全率召回率告诉我们所有的正类样本中有多少被识别出来了。具体的计算公式如下所示:F1值还有F1值是精确率和召回率的调和均值具体的计算公式如下所示:精确率和准确率都高的情况下F1值也会高。回归模型的评价指标和分类模型不同的是回归模型的输出是一个连续的值或者可以说是不确定的值。那么用精确度和准确度等评价指标就不那么合理了。从回归模型的任务性质来说我们希望得到的回归预测值尽可能的接近于真实值也就是预测值和真实值之间的误差尽可能小因此我们可以用如下的评价指标。平均绝对误差(MAE)均方误差(MSE)均方根误差(RMSE)MAPE3.7 逻辑回归模型实战-数据预处理import numpy as np import pandas as pdnumpy用于数值计算、数组操作别名nppandas用于表格数据处理DataFrame、Series别名pdfrom sklearn.model_selection import train_test_split用来划分训练集和测试集把数据集拆成两部分训练模型用训练集评估模型泛化能力用测试集。from sklearn.preprocessing import MinMaxScalerMinMaxScaler最小 - 最大归一化把特征缩放到[0,1]区间公式归一化假设一份数据特征大概有30个但是往往特征的量纲是不一样的可能第一个是1000后几个是个位数因为特征代表物理量但是不管是在机器学习模型还是深度学习模型都会认为数值越大他的特征越重要但可能其中一个量纲小的他对结果的影响程度会更大但你可能会觉得我们可以通过w去进行一个更新那我们把1000哪个w变小一点但这样也很麻烦所以我们通过归一化所以说我们把一列的数据当中找到他的最大值和最小值然后最后除以他的平均值然后把他规划到0-1之间把其他数据也归一化到0-1之间那么w就可以控制他的特征的一个重要程度了。量纲是指标的物理单位。当特征量纲不同时数值大小不具备可比性取值范围大的特征会在模型计算中占据主导影响梯度下降的收敛。归一化可以消除量纲带来的尺度差异让各特征处于同一数值区间。from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report# 读取数据 dataset pd.read_csv(breast_cancer_data.csv) print(dataset)用 pandas 读取csv 表格文件存入 DataFrame变量名叫 dataset。# 提取x X dataset.iloc[:, :-1] # print(X)iloc是 pandas按位置索引数字下标不是列名,前面行后面列:表示全部行:-1从第 0 列 到倒数第 2 列去掉最后一列✅ 含义取全部样本除了最后一列剩下全部作为特征 X# 提取数据种的标签 Y dataset[diagnosis] print(Y)# 划分数据集和测试集 x_train, x_test, y_train, y_test train_test_split(X, Y, test_size0.2)test_size0.2测试集占总数据 20%训练集 80%# 进行数据的归一化 sc MinMaxScaler(feature_range(0, 1)) x_train sc.fit_transform(x_train) x_test sc.transform(x_test)fit 是学习最值transform 是执行缩放训练集用 fit_transform 学习并缩放测试集只能 transform禁止 fit避免数据泄露。原理简单理解模型在现实场景中是看不到测试集数据的。预处理也必须模拟这个场景只能依靠训练集统计信息不能偷看测试集。3.8 逻辑回归模型实战-模型训练# 逻辑回归模型搭建 lr LogisticRegression() lr.fit(x_train, y_train)lr LogisticRegression()实例化模型创建一个逻辑回归模型对象此时模型只是空架子还没有学到任何权重参数w。lr.fit(X_train, y_train)模型训练拟合输入训练集特征X_train和标签y_train。内部使用梯度下降不断更新权重w和偏置b最小化损失函数学到特征与类别之间的关系。手写梯度下降需要手动设置学习率sklearn 逻辑回归使用高级优化器自动自适应调整学习率步长全程无需人工设置学习率。# 打印模型的参数 print(w:, lr.coef_) print(b, lr.intercept_)lr.coef_含义权重系数 w形状(1, 特征数量)的数组。你这里乳腺癌数据集 30 个特征就会输出 30 个 w 值分别对应每一个特征的权重。意义代表各个特征对分类结果影响的大小与方向。lr.intercept_含义偏置项 b截距逻辑回归公式\(\hat y w_1x_1 w_2x_2 ... w_nx_n b\)逻辑回归本质\(z w^T x b\)再代入 sigmoid 函数得到概率。✅ 只有执行完lr.fit(X_train, y_train)训练完成之后才能访问.coef_和.intercept_如果还没 fit 就打印会直接报错# 利用训练好的模型进行推理测试 pre_reslut lr.predict(x_test) print(pre_reslut)lr.predict(X_test)前提模型已经完成lr.fit(X_train,y_train)训练w、b 已经学习完毕。作用把测试集特征送入训练好的逻辑回归模型直接输出预测类别本例良性 / 恶性肿瘤标签。# 打印预测结果的概率 pre_reslut_proba lr.predict_proba(x_test) print(pre_reslut_proba)lr.predict_proba(X_test)前提模型已经fit()训练完成作用输出每个样本属于各个类别的概率返回数组格式[类别0概率类别1概率]示例[0.02, 0.98]代表该样本属于 0 类概率 2%属于 1 类概率 98%和.predict()的对比predict()直接输出判定后的类别0 / 1默认阈值 0.5predict_proba()输出原始概率可以自己设定阈值判断类别逻辑回归内部sigmoid 算出概率predict默认拿 0.5 做分界线大于等于 0.5 预测为 1小于则为 0。但是阈值也可以进行调整# 获取恶性肿瘤的概率 pre_list pre_reslut_proba[:, 1] print(pre_list)# 设置阈值 thresholds 0.3 # 设置保存结果的列表 result [] result_name [] for i in range(len(pre_list)): if pre_list[i] thresholds: result.append(1) result_name.append(恶性) else: result.append(0) result_name.append(良性) # 打印调整后的结果 print(result) print(result_name)# 输出结果的精确率和召回还有f1值 report classification_report(y_test,result,labels[0,1],target_names[良性肿瘤,恶性肿瘤]) print(report)