机器学习-Logistic回归原理及实战

本文深入讲解Logistic回归,一种广泛应用于二分类问题的算法。从基本概念出发,介绍了Logistic回归如何通过Sigmoid函数实现分类,并详细阐述了其在sklearn库中的应用,包括数据预处理、模型训练和评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Logistic回归

  • 回归
    • 在介绍Logistic回归之前,先容我介绍一下什么是回归
    • 回归,指研究一组随机变量(Y1 ,Y2 ,…,Yi)和另一组(X1,X2,…,Xk)变量之间关系的统计分析方法,又称多重回归分析。通常Y1,Y2,…,Yi是因变量,X1、X2,…,Xk是自变量。
    • 若自变量和因变量之间保持一种最基本的线性关系,我们称之为线性回归,最简单的线性回归是指一元线性回归,关系为Y=a+bX+c。
    • 回归研究的过程一般是一个拟合的过程(找寻最佳拟合)。
  • Logistic回归
    • 是一种二分类算法(标签只有“是”或者“否”两个选项)
    • 利用Sigmoid函数阈值在[0,1]区间上的特性
    • 主要思想为:根据现有数据对分类边界线建立回归公式
    • 本质上就是一个基于条件概率的判别模型
    • 公式是这样的
    • Sigmoid
    • 其中θ是参数列向量(也就是我们要求解的),x是样本列向量(也就是给定的数据集),θ的转置和x相乘得到矩阵z,g函数实现了任意实数到[0,1]的映射,这样样本数据集x都可以映射到[0,1]之间进行分类,h函数则给出了输出为1的概率。
    • 这就是说,如果有合适的θ,配合上x,我们通过上述公式可以计算出一个概率来对样本x分类,如果这个概率大于0.5,就说这是一个正样本,否则,这是一个负样本。
    • 问题变为了如何求这个θ了,我们可以通过定义代价函数,配合最大似然估计法,再将公式对数化,得到一个公式,求使公式值最大的θ就可以了,使用梯度上升算法可求。
    • 求出θ,也就得到了分类模型了。
    • 由于主要介绍库内使用,具体数学推导就不多赘述了。
  • 算法优点
    • Logistic回归的目的是寻找一个非线性函数Sigmoid的最佳拟合参数,只要找到,对于二分类问题,分类较快。
  • 算法缺点
    • 对于多分类问题,存在分类的难度。
  • 代码主要演示sklearn中Logistic回归使用,具体实现可以斟酌自行完成。
# -*- coding:UTF-8 -*-
"""
sklearn中Logistic回归的使用
"""
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler



def solve():
    '''
    处理原始数据
    原始数据集有缺失,经过处理
    特征缺失换0,不影响,因为Logistic回归中立
    标签缺失删除
    :return:
    '''
    rawFile = open('./data/rawdata.txt')
    dataSet = []
    label = []
    print(rawFile)
    for line in rawFile:
        line = line.strip()
        line = line.replace("\n", '')
        line2list = line.split(' ')

        if line2list[-1] == "?":
            pass
        else:
            del line2list[2]
            del line2list[23]
            del line2list[23]
            for i in range(len(line2list)):
                if line2list[i] == "?":
                    line2list[i] = 0
            dataSet.append(line2list[:len(line2list)-2])
            label.append(line2list[-1])
    return dataSet, label


def scale(dataSet):
    '''
    归一化
    :param dataSet: 数据集
    :return:
    '''
    scaler = MinMaxScaler()
    dataSet_new = scaler.fit_transform(dataSet)
    return dataSet_new

def divide(dataSet, labels):
    '''
    比例切分两个数据集
    :param dataSet:
    :param labels:
    :return:
    '''
    train_data, test_data, train_label, test_label = train_test_split(dataSet, labels, test_size=0.2)
    return train_data, test_data, train_label, test_label


if __name__ == '__main__':
    data, labels = solve()
    data = scale(data)

    # 得到数据集
    trainDataSet, testDataSet, trainDataLabel, testDataLabel = divide(data, labels)
    # 建立模型并训练
    # 其中,solver表示优化算法选择参数,有五个可选参数
    # newton-cg,lbfgs,liblinear,sag,saga
    # 默认为liblinear
    # solver参数决定了我们对逻辑回归损失函数的优化方法
    # 具体如何选择可以查看官方文档,一般小数据集使用下面使用的即可(多分类不是)
    # 其中,max_iter指明最大迭代次数,默认为10,一般无效
    classifier = LogisticRegression(solver='liblinear', max_iter=10).fit(trainDataSet, trainDataLabel)
    # 给出分类准确率,指明数据集和实际标签即可
    rst = classifier.score(testDataSet, testDataLabel) * 100.0
    print('正确率:{:.2f}'.format(rst))

使用的数据集为马的数据集,代码及数据集可以访问我的github查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周先森爱吃素

你的鼓励是我坚持创作的不懈动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值