python之sklearn-分类算法-3.4 逻辑回归与二分类

本文深入讲解逻辑回归在广告点击率预测、垃圾邮件识别、疾病诊断、金融欺诈检测及虚假账号识别等场景的应用。剖析逻辑回归原理,包括输入、激活函数(如sigmoid)、损失函数(对数似然损失)及梯度下降优化方法。通过sklearn库实现逻辑回归,预测癌症分类,展示权重、偏置、预测结果及准确率。介绍评估方法,如精确率、召回率、F1-score及sklearn评估API。解析ROC曲线与AUC指标,用于衡量样本不均衡下的模型性能。
部署运行你感兴趣的模型镜像

一,逻辑回归的应用场景

  • 广告点击率
  • 是否为垃圾邮件
  • 是否患病
  • 金融诈骗
  • 虚假账号

二,逻辑回归的原理

1,输入

逻辑回归的输入是线性回归的结果:
在这里插入图片描述

2,激活函数
1)sigmoid函数

在这里插入图片描述
在这里插入图片描述
回归的结果输入到sigmod函数当中

  • 输出结果:[0,1]区间中的一个概率值,默认为0.5的门限值
2)注意:

逻辑回归的最终分类是通过某个类别的概率来判断是否属于某个类别,并且这个类别默认标记为1(正例),另一个标记为0(反例)。默认目标值少的为正例。

3,损失函数
1)对数似然损失公式

逻辑回归的损失,称之为对数似然损失,公式如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2)综合完整损失函数如下:

在这里插入图片描述

3)理解对数似然损失示例如下:

在这里插入图片描述
如上可知,降低损失需要(正例减少sigmoid返回结果,反例增加sigmod返回结果)

4,优化方法

同样使用梯度下降优化算法,去减少损失函数的值,这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本为0类别的概率。

三,逻辑回归API

sklearn.linear_model.LogisticRegression(solver=‘liblinear’,penalty=‘i2’,c=1.0)

  • solver:优化求解方式(默认开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数)
    • sag:根据数据集自动选择,随机平局梯度下降
  • penalty:正则化种类
  • c:正则化力度

默认将类别数量少的当正例

四,案例:癌症分类预测

数据源:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/

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
def logisticregression():
    '''逻辑回归癌症预测'''
    # 确定数据columns数值
    columns = ["Sample code number","Clump Thickness","Uniformity of Cell Size","Uniformity of Cell Shape","Marginal Adhesion","Single Epithelial Cell Size","Bare Nuclei","Bland Chromatin","Normal Nucleoli","Mitoses","Class"]
    data = pd.read_csv("breast-cancer-wisconsin.data",names=columns)

    # 去掉缺失值
    data.replace(to_replace="?",value=np.nan,inplace=True)
    data.dropna(axis=0,inplace=True,how="any")

    # 提取目标值
    target = data["Class"]

    # 提取特征值
    data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

    # 切割训练集和测试集
    x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

    # 进行标准化
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.fit_transform(x_test)

    # 逻辑回归进行训练和预测
    lr = LogisticRegression()
    lr.fit(x_train,y_train)

    print("逻辑回归权重:",lr.coef_)
    print("逻辑回归偏置:",lr.intercept_)

    # 逻辑回归测试集预测结果
    pre_result = lr.predict(x_test)
    print(pre_result)
    # 逻辑回归预测准确率
    sore = lr.score(x_test,y_test)
    print(sore)
if __name__ == '__main__':
    logisticregression()

五,二分类的评估方法–(精确率(Precision)与召回率(Recall))

1,精确率:

预测结果为正例样本中真是为整理的比例(查的准)
在这里插入图片描述

2,召回率:

真是为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)
在这里插入图片描述

3,F1-score

反应了模型的稳健型
在这里插入图片描述

4,模型评估API

sklearn.metrics.classification_report(y_true,y_pred,target_names=None)

  • y_true: 真实目标值
  • y_pred: 估计器预测目标值
  • target_names: 目标类名称
  • return: 每个类别精准率与召回率
5,代码
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 classification_report

def logisticregression():
    '''逻辑回归癌症预测'''
    # 确定数据columns数值
    columns = ["Sample code number","Clump Thickness","Uniformity of Cell Size","Uniformity of Cell Shape","Marginal Adhesion","Single Epithelial Cell Size","Bare Nuclei","Bland Chromatin","Normal Nucleoli","Mitoses","Class"]
    data = pd.read_csv("breast-cancer-wisconsin.data",names=columns)

    # 去掉缺失值
    data.replace(to_replace="?",value=np.nan,inplace=True)
    data.dropna(axis=0,inplace=True,how="any")

    # 提取目标值
    target = data["Class"]

    # 提取特征值
    data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

    # 切割训练集和测试集
    x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

    # 进行标准化
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.fit_transform(x_test)

    # 逻辑回归进行训练和预测
    lr = LogisticRegression()
    lr.fit(x_train,y_train)

    # 得到训练集返回数据
    # print("逻辑回归权重:",lr.coef_)
    # print("逻辑回归偏置:",lr.intercept_)

    # 逻辑回归测试集预测结果
    pre_result = lr.predict(x_test)
    # print(pre_result)

    # 逻辑回归预测准确率
    sore = lr.score(x_test,y_test)
    print(sore)

    # 精确率(Precision)与召回率(Recall)
    report = classification_report(y_test,pre_result,target_names=["良性","恶性"])
    print(report)

if __name__ == '__main__':
    logisticregression()

六,ROC曲线与AUC指标

问题:如何衡量样本不均衡下的评估?

1,ROC曲线与FPR
  • TPR = TP / (TP + FN)
    • 所有真实类别为1的样本中,预测类别为1的比例
  • FPR = FP / (TP + FN)
    • 所有真实类别为0的样本中,预测类别为1的比例
2,ROC曲线

ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别时1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5 。
在这里插入图片描述

3,AUC指标
  • AUC的概率意义时随机取一对正负样本,正样本得分大于负样本的概率。
  • AUC的最小值为0.5,最大值为1,取值越高越好。
  • AUC=1,完美分类器,采用这个预测模型时,不管设定什么门限值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5<AUC<1,优于随机猜测. 这个分类器(模型)妥善设定限制的话,能有预测价值。
  • AUC=0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • AUC<0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测,因此不存在AIC<0.5的情况

最终AUC的范围在[0.5,1],并且越接近1越好。

4,AUC计算API

from sklearn.metrics import roc_auc_score

  • sklearn.metrics.roc_auc_score(y_true,y_score)
    • 计算ROC曲线面积,即AUC值
    • y_true:每个样本的真是类别,必须为0(反例),1(正例)标记
    • y_score:每个样本预测的概率值
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 classification_report,roc_auc_score

def logisticregression():
    '''逻辑回归癌症预测'''
    # 确定数据columns数值
    columns = ["Sample code number","Clump Thickness","Uniformity of Cell Size","Uniformity of Cell Shape","Marginal Adhesion","Single Epithelial Cell Size","Bare Nuclei","Bland Chromatin","Normal Nucleoli","Mitoses","Class"]
    data = pd.read_csv("breast-cancer-wisconsin.data",names=columns)

    # 去掉缺失值
    data.replace(to_replace="?",value=np.nan,inplace=True)
    data.dropna(axis=0,inplace=True,how="any")

    # 提取目标值
    target = data["Class"]

    # 提取特征值
    data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

    # 切割训练集和测试集
    x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

    # 进行标准化
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.fit_transform(x_test)

    # 逻辑回归进行训练和预测
    lr = LogisticRegression()
    lr.fit(x_train,y_train)

    # 得到训练集返回数据
    # print("逻辑回归权重:",lr.coef_)
    # print("逻辑回归偏置:",lr.intercept_)

    # 逻辑回归测试集预测结果
    pre_result = lr.predict(x_test)
    # print(pre_result)

    # 逻辑回归预测准确率
    sore = lr.score(x_test,y_test)
    print(sore)

    # 精确率(Precision)与召回率(Recall)
    report = classification_report(y_test,pre_result,target_names=["良性","恶性"])
    print(report)

    # 查看AUC指标
    y_test = np.where(y_test>2.5,1,0)
    print(y_test)
    auc_score = roc_auc_score(y_test,pre_result)
    print(auc_score)
    
if __name__ == '__main__':
    logisticregression()
5,总结
  • AUC只能用来评价二分类
  • AUC非常适合评价样本不平衡中的分类器性能
  • AUC会比较预测出来的概率,而不仅仅是标签类
  • AUC指标大于0.7,一般都是比较好的分类器

七,Scikit-learn的算法实现总结

  • scikit-learn把梯度下降求解的单独分开,叫SGDclassifier和SGDRegressor,他们的损失都是分类和回归对应的损失,比如分类:有log loss, 和 hingle loss(SVM)的,回归如:比如 均方误差, 其它的API是一样的损失,求解并不是用梯度下降的,所以一般大规模的数据都是用scikit-learn其中SGD的方式求解。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

机器学习中,分类任务用于预测离散的类别标签,而回归任务用于预测连续数值输出。某些算法能够同时适用于这两类监督学习任务,具有良好的通用性和灵活性。 ### 3.1 支持向量机(Support Vector Machine, SVM) 支持向量机是一种广泛使用的监督学习方法,既可以用于分类,也可以用于回归。在分类任务中,SVM 通过寻找最优超平面将不同类别的数据点分开;而在回归任务中(称为 SVR),它尝试构建一个函数使得大部分数据点落在一个容忍带内。该算法尤其适用于高维数据,并且可以通过核技巧处理非线性关系[^1]。 ```matlab % MATLAB 示例:使用 fitrsvm 进行回归 X = rand(100, 1); Y = sin(X) + randn(size(X)) * 0.1; mdl_reg = fitrsvm(X, Y); % 使用 fitcsvm 进行分类 Y_class = Y > 0; mdl_class = fitcsvm(X, Y_class); ``` ### 3.2 决策树(Decision Tree) 决策树是一种直观的模型,可以用于分类和回归任务。它通过递归划分特征空间构建树结构,每个节点代表一个特征判断,叶子节点代表最终的输出值(类别或数值)。决策树易于解释,但容易过拟合,通常会结合集成方法使用[^2]。 ```python from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor # 分类 clf = DecisionTreeClassifier() clf.fit(X_train, y_train_class) # 回归 reg = DecisionTreeRegressor() reg.fit(X_train, y_train_reg) ``` ### 3.3 随机森林(Random Forest) 随机森林是多个决策树的集成模型,通过投票(分类)或平均(回归)提高泛化能力。它是目前最稳定、适用范围最广的算法之一。该算法对异常值和缺失数据不敏感,具有良好的抗过拟合能力[^1]。 ```python from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor # 分类 rf_clf = RandomForestClassifier(n_estimators=100) rf_clf.fit(X_train, y_train_class) # 回归 rf_reg = RandomForestRegressor(n_estimators=100) rf_reg.fit(X_train, y_train_reg) ``` ### 3.4 神经网络(Neural Networks) 神经网络是深度学习的基础,能够灵活地建模复杂的非线性关系。通过调整输出层和损失函数,同一网络架构可以用于分类(如 softmax + 交叉熵)或回归(如线性输出 + MSE)。神经网络需要大量数据和计算资源,但其表达能力强,适合复杂任务[^2]。 ```matlab % MATLAB 示例:多任务神经网络(分类+回归) layers = [ featureInputLayer(inputSize) fullyConnectedLayer(64) reluLayer fullyConnectedLayer(numClasses) softmaxLayer classificationOutputLayer(&#39;Name&#39;, &#39;classoutput&#39;) fullyConnectedLayer(1) regressionOutputLayer(&#39;Name&#39;, &#39;regoutput&#39;) ]; lgraph = layerGraph(layers); lgraph = connectLayers(lgraph, &#39;relu&#39;, &#39;fc_class&#39;); lgraph = connectLayers(lgraph, &#39;relu&#39;, &#39;fc_reg&#39;); options = trainingOptions(&#39;adam&#39;, ... &#39;InitialLearnRate&#39;, 0.001, ... &#39;MaxEpochs&#39;, 50); net = trainNetwork(XTrain, {YClass, YReg}, lgraph, options); ``` ### 3.5 K-近邻算法(K-Nearest Neighbors, KNN) KNN 是一种基于距离的非参数方法,可用于分类和回归。在分类中采用多数投票,在回归中采用最近邻居的平均值。KNN 简单易实现,但计算开销大,不适合大规模数据集。 ```python from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor # 分类 knn_clf = KNeighborsClassifier(n_neighbors=5) knn_clf.fit(X_train, y_train_class) # 回归 knn_reg = KNeighborsRegressor(n_neighbors=5) knn_reg.fit(X_train, y_train_reg) ``` ### 3.6 逻辑回归线性回归(Logistic Regression & Linear Regression) 虽然名称相似,但逻辑回归主要用于二分类任务,而线性回归用于回归任务。两者都属于线性模型,训练速度快,适合线性可分或线性相关的问题。这些模型作为基线模型非常有用,尤其是在特征工程完成后效果显著[^3]。 ```python from sklearn.linear_model import LogisticRegression, LinearRegression # 分类 log_reg = LogisticRegression() log_reg.fit(X_train, y_train_class) # 回归 lin_reg = LinearRegression() lin_reg.fit(X_train, y_train_reg) ``` --- ### 总结对比表 | 算法 | 分类支持 | 回归支持 | 优点 | 缺点 | |------|-----------|-----------|------|------| | SVM | ✅ | ✅ | 高维有效,适合小样本 | 超参调优复杂 | | 决策树 | ✅ | ✅ | 易于解释 | 易过拟合 | | 随机森林 | ✅ | ✅ | 泛化能力强 | 计算成本较高 | | 神经网络 | ✅ | ✅ | 模型灵活 | 数据需求大 | | KNN | ✅ | ✅ | 实现简单 | 效率低 | | 线性/逻辑回归 | ❌/✅ | ✅/❌ | 快速高效 | 仅适合线性关系 | 选择哪种算法应根据具体任务的数据规模、维度、分布特性以及可用资源进行综合考量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值