机器学习算法之逻辑回归(对数几率回归)- 做分类的

一、概述:

逻辑(logistic)回归, 又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域

1、几率

几率:一个时间发生的概率 / 不发生的概率

2、逻辑

逻辑:指的是logistic function

3、回归

回归:来源于线性回归的 Z = XW,使用线性回归去拟合逼近一个‘界’,使得按照这个界进行数据分类后得到的损失函数最小,以概率0.5为分界线,将数据分为正例和反例,使得Z> 0对应于‘正例’(趋近于概率为1),Z< 0对应于‘反例’(趋近于概率为0),使用回归的思想去解决分类问题

二、作用

总的来说,逻辑回归是用来预测离散值输出只有0和1的离散型输出,做二分类(1/0)任务,并给出相应的概率

三、模型

灵感过程

  • 想要解决一个分类问题,从简单的二分类先开始

  • 数据标签是(1/0)

  • 可以使用最简单的单位阶跃函数

  • 在解决问题的迭代优化是需要使用到微分和导数,但是阶跃函数不连续,因此使用link function代替,使其连续可导, 横坐标是Z, 纵坐标是y, 定义域是服务穷到正无穷,值域是0-1(可对应于概率值0-1),link function 对于逻辑回归来说,就是Sigmoid函数:

Sigmoid函数的性质

  • Sigmoid函数是一个S型的函数,当自变量z趋近正无穷时,因变量g(z)趋近于1,而当z趋近负无穷时, g(z)趋近于0,它能够将任何实数映射到(0,1)区间,使其可用于将任意值函数转换为更适合二分类的函 数。

四、损失函数

逻辑回归的损失函数由极大似然估计法得出,过程可以写作:

负对数似然函数:
cost=−∑(y∗log(h)−(1−y∗)log(1−h))cost = -\sum (y^{*}log(h) - (1-y^{*})log(1-h)) cost=−∑(y∗log(h)−(1−y∗)log(1−h))

J(Θ)=−∑[yi∗log(yθ(xi))−(1−yi∗)log(1−yθ(xi)]J(\Theta ) = -\sum [y_{i}^{*}log(y_{\theta }(x_{i}))- (1 - y_{i}^{*})log(1 -y_{\theta }(x_{i})] J(Θ)=−∑[yi∗​log(yθ​(xi​))−(1−yi∗​)log(1−yθ​(xi​)]

其中, 表示求解出来的一组参数, m是样本的个数, x是样本 上真实的标签, 是样本 上,基于 参数 计算出来的逻辑回归的返回值, 是样本 各个特征的取值。我们的目标,就是求解出使 最小的 取 值。 在损失函数中, , 都是已知量, 是未知量。 接下来,我只用找 最小值时的参数 。

五、梯度下降求解参数过程

  • 梯度:在多元函数上对各个自变量求偏导数,再把这个偏导数用向量的方式写出来,就是梯度。
  • 逻辑回归的数学目的是求解能够让模型最优化,拟合程度最好的参数$ \theta $ 的值,即求解能够让损失函数$ J(\theta) $ 最小化的 值

六、SKlearn中的逻辑回归

详细步骤:

  • 首先进行数据清洗

  • 处理类别型特征变量

    • 对于类别型特征变量的处理

    • 名义变量:没有大小关系,并列的 , 要将它单独的拆出来,由列拆成单独的一列 —— 采用独热编码,将一个特征变成三个特征

      • from sklearn.preprocessing import OneHotEncoder
        # 实例化
        one = OneHotEncoder()
        trans = one.fit_transform(df[['race', 'sex']])
        # 查看每一列代表的是什么
        one.get_feature_names()
        # 将装换后的数据转变成dataframe类型
        df2 = pd.DataFrame(trans.toarray())
        df2.rename({0: 'Amer-Indian-Eskimo', 1: 'Asian-Pac-Islander', 2: 'Black',3: 'Other', 4: 'White', 5: 'Female', 6: 'Male'}, axis=1, inplace=True)
        # 拼接回原表
        df = pd.merge(left=df, right=df2, left_index=True, right_index=True)
        
    • 有序变量:小学, 初中,高中,大学:直接从小到大给0, 1, 2, 3

      • from sklearn.preprocessing import OrdinalEncoder
        Or = OrdinalEncoder()
        or_ = df[['workclass', 'education', 'marital_status', 'occupation', 'relationship', 'native_country']]
        trans_ = Or.fit_transform(or_)
        # 查看每一个代表什么
        Or.categories_
        df1 = pd.DataFrame(trans_)
        df1.rename({0: 'workclass', 1: 'education', 2: 'marital_status',3: 'occupation', 4: 'relationship', 5: 'native_country'}, axis=1, inplace=True)
        df = pd.merge(left=df, right=df1, left_index=True, right_index=True)
        
    • 有距变量: 分箱之后的变量,比如说身高0—1.65的- 低,1.65-1.8 - 中等,1.8以上,利用分箱给0, 1, 2或者里面的数值都可以

  • 对数据进行量纲标准化

    • from sklearn.preprocessing import StandardScaler
      X = StandardScaler().fit_transform(df)
      
  • 进行训练集的划分

    • from sklearn.model_selection import train_test_split
      xtrain, xtest, ytrain, ytest = train_test_split(X, Y, test_size = 0.3, random_state = 40)
  • 导入逻辑回归的模块,进行预测

    • from sklearn.linear_model import LogisticRegression
      LR = LogisticRegression(penalty='l2', tol=0.01, max_iter=20,C = 1.0)
      # 参数 :penalty:{l2},正则化项,默认是l2正则,会压缩一些特征,防止过拟合
      # tol = 0.0001,梯度下降的参数
      # C = 1.0 :正则化项的系数,表示正则化项很强,加满
      # fit_intercept = True: 要不要截距项
      LR.fit(xtrain, ytrain)
      LR.predict(xtest)
      
  • 查看精确度,查准率和查全率

    • # 查看精确率
      LR.score(xtest, ytest)
      # 查看查准率和查全率
      from sklearn.metrics import classification_report
      print(classification_report(ytest, LR.predict(xtest)))precision    recall  f1-score   support0       1.00      1.00      1.00      61601       1.00      1.00      1.00      1957accuracy                           1.00      8117macro avg       1.00      1.00      1.00      8117
      weighted avg       1.00      1.00      1.00      8117
      # 查看混淆矩阵
      from sklearn.metrics import confusion_matrix
      print(confusion_matrix(ytest, LR.predict(xtest)))
      [[ 51   5][  6 109]]
      # 查看标签是1的查全率
      from sklearn.metrics import recall_score
      recall_score(ytest, LR.predict(xtest))
      # 查看标签是0的查全率
      recall_score(ytest, LR.predict(xtest), pos_label=0)
      # 将正则变成l1正则
      LR_l1 = LogisticRegression(penalty='l1', tol=0.0001,solver='liblinear', # 对应梯度下降的一种方法max_iter=100,C = 1.0).fit(xtrain, ytrain)
      
  • 重要参数:

    • 正则化项:penalty=‘I2’ 或者 penalty=‘I1’

      • L1:会将参数压缩为0 L2:只会让参数尽量小,不会为0
    • C正则化强度的倒数:C=1.0

      • 必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的 比值是1:1
      • C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越 来越小
    • 梯度下降的最大迭代次数(代替步长):max_iter=100

    • # 检查步长
      train_score = []
      test_scroe = []
      test_recall = []
      for i in range(100):LR_ = LogisticRegression(penalty='l1', tol=0.01,solver='liblinear', # 对应梯度下降的一种方法max_iter=i,C = 1.0).fit(xtrain, ytrain)ts = LR_.score(xtrain, ytrain)# 求平均的准确率tts = LR_.score(xtest, ytest)tr = recall_score(ytest, LR_.predict(xtest), pos_label=0)train_score.append(ts)test_scroe.append(tts)test_recall.append(tr)plt.plot(range(100), train_score, c='r')
      plt.plot(range(100), test_scroe, c='g')
      plt.plot(range(100), test_recall, c='b')
      

七、模型评估

混淆矩阵

真实\预测 1 0
1 TP FN
0 FP TN

查准率

  • 关注的问题是筛选的样本中是正样本的比例=查正确的样本/预测结果是这个类型的 总样本数。

precision=TPTP+FPprecision = \frac{TP}{TP + FP} precision=TP+FPTP​

查全率

  • 关注的问题是筛选的样本中有多少比例的正样本被筛选出来=查正确的样本/真正 是这个类型的总样本数。

recall=TPTP+FNrecall = \frac{TP}{TP + FN} recall=TP+FNTP​

错误率与精度

  • 错误率:分错的样本战样本总数的比例
  • 精度: 1- E

八、逻辑回归的优点

  • 逻辑回f归对线性关系的拟合效果非常好
  • 逻辑回归计算快
  • 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
  • 逻辑回归还有抗噪能力强

关注的问题是筛选的样本中有多少比例的正样本被筛选出来=查正确的样本/真正 是这个类型的总样本数。

recall=TPTP+FNrecall = \frac{TP}{TP + FN} recall=TP+FNTP​

错误率与精度

  • 错误率:分错的样本战样本总数的比例
  • 精度: 1- E

八、逻辑回归的优点

  • 逻辑回f归对线性关系的拟合效果非常好
  • 逻辑回归计算快
  • 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
  • 逻辑回归还有抗噪能力强

机器学习之逻辑回归(对数几率回归)相关推荐

  1. 逻辑斯蒂回归(对数几率回归)

    首先,对数几率回归和线性回归的一点直观上的理解: 线性回归目的是找到一条直线(或者超平面)尽可能地接近所有的训练数据点,而对数几率回归(二元)的目的是找到一条直线(或者超平面)尽可能地分开两种不同类别 ...

  2. 机器学习-对数几率回归(逻辑回归)算法

    文章目录 简介 激活函数 损失函数 优化算法 代码 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 简介 对数几率回归(Logistic Regre ...

  3. 机器学习入门学习笔记:(2.3)对数几率回归推导

    理论推导   在以前的博客(机器学习入门学习笔记:(2.1)线性回归理论推导 )中推导了单元线性回归和多元线性回归的模型.   将线性回归模型简写为:y=ωTx+by = \omega^Tx+b:   ...

  4. 小白学机器学习西瓜书-第三章对数几率回归

    小白学机器学习西瓜书-第三章对数几率回归 3.3 对数几率回归 3.3.1 对数几率函数 3.3.1 估计参数 上一部分我们介绍了线性回归,包括简单的二元回归和多元回归,这两个主要解决的是拟合预测的问 ...

  5. 机器学习(二)线性模型——线性回归、对数几率回归、线性判别分析

    一.线性回归 线性回归(linear regression:试图学得一个线性模型以尽可能准确地预测实值输出标记. 1.最简单的形式:输入属性的数且只有一个, 最小二乘法:基于均方差误差最小化来进行模型 ...

  6. 个人总结:从 线性回归 到 逻辑回归 为什么逻辑回归又叫对数几率回归?

    逻辑回归不是回归算法,是分类算法,可以处理二元分类以及多元分类. 线性回归 线性回归的模型是求出特征向量Y和输入样本矩阵X之间的线性关系系数θ,满足Y = Xθ.此时Y是连续的,所以是回归模型. 对应 ...

  7. 机器学习 | 对数几率回归

    机器学习 | 对数几率回归 名词解释 对数几率回归 名词解释 回归:预测连续的值,例如预测气温 分类:预测离散的值,例如垃圾分类 线性回归:通过一个线性组合预测连续的值,是回归模型 对数几率回归:用S ...

  8. 机器学习-对数几率回归

    目录 前言 一.对数几率回归的机器学习三要素 二.对数几率回归 2.1 算法原理 2.1.1 广义线性模型 2.1.2 对数几率回归 2.2 利用极大似然估计推导损失函数 2.2.1 确定概率密度(质 ...

  9. 对数几率回归-机器学习

    数据集百度网盘,就是西瓜书3.0a的数据. 首先,加载数据,load_data(file)函数. def load_data(file):s =[]with open(file) as f:for l ...

最新文章

  1. (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)...
  2. 深度学习笔记:Tensorflow手写mnist数字识别
  3. php的old函数,laravel单元测试之phpUnit中old()函数报错解决
  4. php中ajax方法的理解,基本的PHP和AJAX
  5. 服务发现和注册和Eureka
  6. 当你使用微信和QQ时,请不要忘记ICQ这个伟大的公司!
  7. 【动态规划】计蒜客:蒜头君闯关(最长递增子序列的变体)
  8. 模块调用时对参数值的更改
  9. [Ubuntu Error]鼠标指针闪烁的解决方法
  10. Python中and(逻辑与)计算法则
  11. Spring使用XML的方式实现AOP的开发——Spring AOP(六)
  12. maya! board_教你玩转MAYA的四十二精华造诣(第二期)
  13. 夜深人静写算法(十二)- 凸包
  14. VC 轻松实现非客户区按钮
  15. 有关javabean的说法不正确的是_关于JavaBean,下列的叙述哪一项是不正确的?( )...
  16. java对数组进行排序
  17. TCP 的演化史-sack 与 reordering metric
  18. php递归函数return问题
  19. hiredis的代码示例
  20. 【数据挖掘】葡萄酒质量分析及异常值检测

热门文章

  1. 如何在离开计算机后加密锁定,如何对企业电脑硬盘文件进行加密?
  2. Docker的镜像制作与整套项目一键打包部署
  3. AU软件导出mp3为pcm文件
  4. html银白色,纯CSS打造银色MacBookAir(二)_html/css_WEB-ITnose
  5. Robust Consistent Video Depth Estimation_具有鲁棒一致性的视频深度估计
  6. 门控时钟电路(Intergrated clock gating)
  7. for循环的学习心得
  8. 【excel技巧读书笔记005】快速隔行填充
  9. Mybatis的特性详解——动态SQL
  10. 微信小程序中实现获奖名单滚动播放