Logistic回归


一、回归的基础概念

Logistic回归是一种常用的分类算法,它使用回归模型来建立分类边界线,并根据数据点的特征进行分类。与线性回归不同,Logistic回归使用了逻辑函数(也称为Sigmoid函数)将输出限制在0和1之间,表示概率。

训练Logistic回归分类器的过程是通过寻找最佳拟合参数集来实现的,通常使用最优化算法,例如梯度下降法。最优化算法的目标是最小化损失函数,以使分类器的预测结果与实际结果尽可能接近。

在实际应用中,可以使用Logistic回归进行二分类问题,也可以进行多类别分类。通过提取数据点的特征并利用训练数据进行参数估计,可以得到一个用于分类的模型。然后,可以使用该模型对新的未知数据进行分类预测。

(1) 收集数据:收集数据可以使用任何适合的方法,例如观察、调查问卷、网络爬虫等等。

(2) 准备数据:为了进行距离计算,数据需要转换成结构化数值,例如对文本数据进行分词处理,并将每个词转换为数字特征。

(3) 分析数据:在这一步中,可以使用可视化工具或统计方法来分析数据,以确定特征之间的关系和数据的分布情况。

(4) 训练算法:训练算法的目的是找到最佳的分类回归系数,以使分类器的预测结果与实际结果尽可能接近。训练算法可以使用梯度下降法等最优化算法。

(5) 测试算法:测试算法的目的是评估分类器的性能,通常使用交叉验证法等方法来评估模型的泛化能力。

(6) 使用算法:在使用算法时,需要把新的数据点转换成结构化数值,并利用训练好的回归系数进行分类预测。分类结果可以进一步进行分析和应用

二、基于Logistic回归和Sigmoid函数的分类

优点:

  1. 计算代价不高:Logistic回归的计算速度很快,适用于大规模数据集。
  2. 易于理解和实现:Logistic回归模型比较简单,易于理解和实现。
  3. 可以输出概率:Logistic回归可以输出样本属于每个类别的概率,可以用于生成ROC曲线等评估分类器性能的指标。

缺点:

  1. 容易欠拟合:当特征之间的关系比较复杂时,Logistic回归容易欠拟合,导致分类精度不高。
  2. 分类精度可能不高:由于Logistic回归假设特征之间是线性相关的,因此对于非线性关系的数据,分类精度可能不高。

适用数据类型:

  1. 数值型数据:Logistic回归适用于数值型数据,例如身高、体重等连续型变量。
  2. 标称型数据:Logistic回归也适用于标称型数据,例如性别、颜色等离散型变量。在处理标称型数据时,需要使用虚拟变量将其转换为数值型变量。

实例:从疝气病症状预测病马的死亡率

当使用Logistic回归进行疝气病症状预测病马的死亡率时,通常需要收集病马的各种症状数据以及它们的生存情况,然后根据这些数据建立Logistic回归模型。

假设我们收集了一些病马的数据,包括症状和生存情况,可以使用这些数据来训练Logistic回归模型,以预测病马的死亡率。

以下是一个简单的示例过程:

  1. 数据收集:收集病马的症状数据,例如体温、脉搏、粘膜颜色等。
  2. 数据准备:将收集到的病马症状数据整理成结构化的数值型数据,同时记录它们的生存情况(1表示存活,0表示死亡)。
  3. 数据分析:对收集到的数据进行分析,例如查看各个症状之间的关系,以及与生存情况的关联。
  4. 训练算法:将数据集分为训练集和测试集,使用训练集数据来训练Logistic回归模型,找到最佳的分类回归系数。
  5. 测试算法:使用测试集数据来评估模型的性能,检验模型对病马死亡率的预测效果。
  6. 使用算法:当模型训练完成并通过测试后,就可以用于预测新病马的死亡率。
1、准备数据:处理数据中的缺失值

2、测试算法:使用梯度上升算法进行分类 
def colicTest1():
    # 读取训练集和测试集数据,并进行格式化处理
    with open('horseColicTraining.txt') as frTrain, open('horseColicTest.txt') as frTest:
        trainingSet = []
        trainingLabels = []
        for line in frTrain.readlines():
            currLine = line.strip().split('\t')
            lineArr = [float(currLine[i]) for i in range(21)]
            trainingSet.append(lineArr)
            trainingLabels.append(float(currLine[21]))

        # 使用改进的随机梯度上升算法进行训练
        trainWeights = gradAscent(array(trainingSet), trainingLabels)

        errorCount = 0
        numTestVec = 0.0

        for line in frTest.readlines():
            numTestVec += 1.0
            currLine = line.strip().split('\t')
            lineArr = [float(currLine[i]) for i in range(21)]
            if int(classifyVector(array(lineArr), trainWeights)) != int(currLine[21]):
                errorCount += 1

        errorRate = float(errorCount) / numTestVec
        print("测试的错误率为: %f" % errorRate)
        return errorRate


def multiTest():
    numTests = 10
    errorSum = 0.0

    for _ in range(numTests):
        errorSum += colicTest1()

    print("在 %d 迭代之后,平均错误率为: %f" % (numTests, errorSum / float(numTests)))

3、测试算法:使用改进后的随机梯度上升算法进行分类

使用Logistic 回归方法进行分类并不需要做很多工作,所需做的只是把测试集上每个特征向量乘以最优化方法得来的回归系数,再将该乘积结果求和,最后输入到Sigmoid函数中即可。如果对应的Sigmoid值大于0.5就预测类别标签为1,否则为0。

1.文件读取和数据处理:

def read_data(filename):
    with open(filename) as file:
        lines = file.readlines()
    data = []
    labels = []
    for line in lines:
        line = line.strip().split('\t')
        data.append([float(x) for x in line[:-1]])
        labels.append(float(line[-1]))
    return data, labels
  1. 随机梯度上升算法:
def loadDataSet(fileName):
    dataMat = []
    labelMat = []
    with open(fileName) as fr:
        for line in fr.readlines():
            currLine = line.strip().split('\t')
            lineArr = [float(currLine[i]) for i in range(21)]
            dataMat.append(lineArr)
            labelMat.append(float(currLine[21]))
    return dataMat, labelMat

def colicTest():
    # 读取测试集和训练集,并对数据进行格式化处理
    trainingSet, trainingLabels = loadDataSet('horseColicTraining.txt')
 
    # 使用改进的随即上升梯度训练
    trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)

    # 读取测试集数据
    testSet, testLabels = loadDataSet('horseColicTest.txt')

    errorCount = 0                                # 错误数
    numTestVec = len(testSet)
    for i in range(numTestVec):                    # 遍历每行数据
        if int(classifyVector(array(testSet[i]), trainWeights)) != int(testLabels[i]):
            errorCount += 1                        # 预测结果与真值不一致,错误数加1
    errorRate = (float(errorCount) / numTestVec)   # 计算错误率
    print("测试的错误率为: %f" % errorRate)
    return errorRate
  1. 多次测试的平均错误率计算:

def multi_test(data, labels, num_tests=10):
    error_sum = 0.0
    for _ in range(num_tests):
        weights = stoc_grad_ascent(data, labels)
        error_count = 0
        for i in range(len(data)):
            if classify_vector(data[i], weights) != int(labels[i]):
                error_count += 1
        error_rate = float(error_count) / len(data)
        error_sum += error_rate
    avg_error_rate = error_sum / num_tests
    return avg_error_rate


总结

梯度上升算法和随机梯度下降法都是常用的优化算法,它们各自适用于不同的场合。

梯度上升算法通常适用于样本较少的数据集,它能够获得全局最优解,但当样本比较多时,训练速度会变得特别慢。

随机梯度下降法则适用于样本非常多的数据集,因为它的训练速度很快。然而,由于每次更新回归系数只有一个样本参与,所以准确率会降低,并且容易获取到局部最优解,而非整体最优解。

因此,在实际应用中,需要根据具体的数据集大小和复杂度来选择合适的优化算法,以在准确性和训练速度之间取得平衡。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值