Task03:逻辑回归

理论部分

  • 逻辑回归与线性回归的联系与区别
  • 模型建立:逻辑回归原理、逻辑回归模型
  • 学习策略:逻辑回归损失函数、推导及优化
  • 算法求解:批量梯度下降
  • 正则化与模型评估指标
  • 逻辑回归的优缺点
  • 样本不均衡问题
  • sklearn参数详解
  1. 案例:
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    %matplotlib inline
    
    
    df_X = pd.read_csv('./logistic_x.txt', sep='\ +',header=None, engine='python') #读取X值
    ys = pd.read_csv('./logistic_y.txt', sep='\ +',header=None, engine='python') #读取y值
    ys = ys.astype(int)
    df_X['label'] = ys[0].values #将X按照y值的结果一一打标签
    
    ax = plt.axes()
    #在二维图中描绘X点所处位置,直观查看数据点的分布情况
    df_X.query('label == 0').plot.scatter(x=0, y=1, ax=ax, color='blue')
    df_X.query('label == 1').plot.scatter(x=0, y=1, ax=ax, color='red')
    
    #提取用于学习的数据
    Xs = df_X[[0, 1]].values
    Xs = np.hstack([np.ones((Xs.shape[0], 1)), Xs])
    ys = df_X['label'].values
    
    
    from __future__ import print_function
    import numpy as np
    from sklearn.linear_model import LogisticRegression
    
    lr = LogisticRegression(fit_intercept=False) #因为前面已经将截距项的值合并到变量中,此处参数设置不需要截距项
    lr.fit(Xs, ys) #拟合
    score = lr.score(Xs, ys) #结果评价
    print("Coefficient: %s" % lr.coef_)
    print("Score: %s" % score)
    
    
    ax = plt.axes()
    
    df_X.query('label == 0').plot.scatter(x=0, y=1, ax=ax, color='blue')
    df_X.query('label == 1').plot.scatter(x=0, y=1, ax=ax, color='red')
    
    _xs = np.array([np.min(Xs[:,1]), np.max(Xs[:,1])])
    
    #将数据以二维图形式描点,并用学习得出的参数结果作为阈值,划分数据区域
    _ys = (lr.coef_[0][0] + lr.coef_[0][1] * _xs) / (- lr.coef_[0][2])
    plt.plot(_xs, _ys, lw=1)
    
    
    class LGR_GD():
        def __init__(self):
            self.w = None
            self.n_iters = None
    
        def fit(self, X, y, alpha=0.03, loss=1e-10):  # 设定步长为0.002,判断是否收敛的条件为1e-10
            y = y.reshape(-1, 1)  # 重塑y值的维度以便矩阵运算
            [m, d] = np.shape(X)  # 自变量的维度
            self.w = np.zeros((1, d))  # 将参数的初始值定为0
            tol = 1e5
            self.n_iters = 0
            # ============================= show me your code =======================
            while tol > loss: #设置收敛条件
                for i in range(d):
                    temp = y - X.dot(self.w)
                    self.w[i] = self.w[i] + alpha *np.sum(temp * X[:,i])/m
                
                tol = np.abs(np.sum(y -  X.dot(self.w)))
                self.n_iters += 1 #更新迭代次数
     
            # ============================= show me your code =======================
    
        def predict(self, X):
            # 用已经拟合的参数值预测新自变量
            y_pred = X.dot(self.w)
            return y_pred
    
    
    if __name__ == "__main__":
        lr_gd = LGR_GD()
        lr_gd.fit(Xs, ys)
    
        ax = plt.axes()
    
        df_X.query('label == 0').plot.scatter(x=0, y=1, ax=ax, color='blue')
        df_X.query('label == 1').plot.scatter(x=0, y=1, ax=ax, color='red')
    
        _xs = np.array([np.min(Xs[:, 1]), np.max(Xs[:, 1])])
        _ys = (lr_gd.w[0][0] + lr_gd.w[0][1] * _xs) / (- lr_gd.w[0][2])
        plt.plot(_xs, _ys, lw=1)
    
    
    class LGR_NT():
        def __init__(self):
            self.w = None
            self.n_iters = None
    
        def fit(self, X, y, loss=1e-10):  # 判断是否收敛的条件为1e-10
            y = y.reshape(-1, 1)  # 重塑y值的维度以便矩阵运算
            [m, d] = np.shape(X)  # 自变量的维度
            self.w = np.zeros((1, d))  # 将参数的初始值定为0
            tol = 1e5
            n_iters = 0
            Hessian = np.zeros((d, d))
            # ============================= show me your code =======================
            while tol > loss:
                n_iters += 1
            # ============================= show me your code =======================
            self.w = theta
            self.n_iters = n_iters
    
        def predict(self, X):
            # 用已经拟合的参数值预测新自变量
            y_pred = X.dot(self.w)
            return y_pred
    
    
    if __name__ == "__main__":
        lgr_nt = LGR_NT()
        lgr_nt.fit(Xs, ys)
    
    
    
    
    
    print("梯度下降法结果参数:%s;梯度下降法迭代次数:%s" %(lgr_gd.w,lgr_gd.n_iters))
    print("牛顿法结果参数:%s;牛顿法迭代次数:%s" %(lgr_nt.w,lgr_nt.n_iters))
    

     

逻辑回归和线性回归虽然名称相似,但适用的场景和目标不同。逻辑回归主要用于解决二分类问题,其目标是预测一个样本属于某一类别的概率。而线性回归则用于解决回归问题,目标是预测一个连续数值的输出。 逻辑回归适用于以下场景: 1. 二分类问题:当目标变量只有两个可能的取值时,逻辑回归可以用于预测样本属于哪个类别。例如,预测一个邮件是垃圾邮件还是正常邮件。 2. 概率预测:逻辑回归可以输出一个样本属于某个类别的概率,这在一些应用中非常有用。例如,在信用评分中,可以使用逻辑回归预测一个人违约的概率。 3. 可解释性要求较高:逻辑回归的结果可以通过逻辑函数进行解释,可以理解为样本属于某个类别的相对可能性。这对于理解模型和结果具有重要意义。 线性回归适用于以下场景: 1. 连续数值预测:当目标变量是一个连续数值时,线性回归可以用于预测该数值。例如,预测房屋价格、销售额等。 2. 关联性分析:线性回归可以分析自变量与因变量之间的线性关系,从而判断它们是否存在相关性。 3. 预测未来趋势:线性回归可以使用现有的数据来预测未来的趋势,例如通过历史销售数据预测未来的销售额。 总结起来,逻辑回归适用于二分类、概率预测、可解释性要求较高的场景,而线性回归适用于连续数值预测、关联性分析和预测未来趋势的场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【ML】逻辑回归适用场景-原理-优缺点汇总:](https://blog.csdn.net/pearl8899/article/details/81626030)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

R_TRIG

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值