首页 > 技术文章 > 逻辑、线性回归与聚类分析

hou176 2020-04-03 19:24 原文

逻辑回归

  • 逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归。由于算法的简单和高效,在实际中应用非常广泛。逻辑回归就是解决二分类问题的利器

  • 逻辑回归的输入就是一个线性回归的结果。

  • 逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1(正例),另外的一个类别会标记为0(反例)。(方便损失计算) 逻辑回归的阈值是可以进行改变的

  • 逻辑回归的损失,称之为对数似然损失

  • 优化也是使用梯度下降

    • 使用梯度下降优化算法,去减少损失函数的值。这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。
  • sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)

    • solver可选参数:{'liblinear', 'sag', 'saga','newton-cg', 'lbfgs'},
      • 默认: 'liblinear';用于优化问题的算法。
      • 对于小数据集来说,“liblinear”是个不错的选择,而“sag”和'saga'对于大型数据集会更快。
      • 对于多类问题,只有'newton-cg', 'sag', 'saga'和'lbfgs'可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。
    • penalty:正则化的种类
    • C:正则化力度
  • !我们并不关注预测的准确率,而是关注在所有的样本当中,癌症患者有没有被全部预测(检测)出来。

  • 分类评估的方法

    • 混淆举证 在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
  • 精确率:预测结果为正例样本中真实为正例的比例(了解)

  • 召回率:真实为正例的样本中预测结果为正例的比例(查得全,对正样本的区分能力)

  • F1-score,反映了模型的稳健型

  • 分类评估报告api

  • sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )

    • y_true:真实目标值
    • y_pred:估计器预测目标值
    • labels:指定类别对应的数字
    • target_names:目标类别名称
    • return:每个类别精确率与召回率
  • 假设这样一个情况,如果99个样本癌症,1个样本非癌症,不管怎样我全都预测正例(默认癌症为正例),准确率就为99%但是这样效果并不好,这就是样本不均衡下的评估问题

线性回归

  • 线性回归常用的地方 贷款预测 销售预测 房价的预测

  • 线性回归就跟函数差不多 原理是这样的 但是细节确实按照情况来走 是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。

  • 房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率

    • 这就算是一个关系 而特征值和目标值的之间的关系 可以理解为线性模型
  • 线性回归中主要有两种模型 线性关系 非线性关系

  • 线性 API

    • sklearn.linear_model.LinearRegression()
      • LinearRegression.coef_:回归系数
  • 步骤分析 获取数据 数据基本处理 特征工程 机器学习 模型评估

  • 线性回归的优化

    • 正规方程 需要推导的方程
    • 梯度下降 比如从山上下来 就一段一段的选择路程 一直选择一个小路程的最低点 然后从最低点慢慢在往下走 肯定会到最低谷的
    • 梯度下降算法 随机梯度下降算法 小批量梯度下降算法 随机平均梯度下降算法
  • sklearn.linear_model.LinearRegression(fit_intercept=True)
    通过正规方程优化

    • 参数
      • fit_intercept:是否计算偏置
    • 属性
      • LinearRegression.coef_:回归系数
      • LinearRegression.intercept_:偏置
        sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
    • SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型。
    • 参数:
      • loss:损失类型
        • loss=”squared_loss”: 普通最小二乘法
      • fit_intercept:是否计算偏置
      • learning_rate : string, optional
        • 学习率填充
        • 'constant': eta = eta0
        • 'optimal': eta = 1.0 / (alpha * (t + t0)) [default]
        • 'invscaling': eta = eta0 / pow(t, power_t)
          • power_t=0.25:存在父类当中
      • 对于一个常数值的学习率来说,可以使用learning_rate=’constant’ ,并使用eta0来指定学习率。
    • 属性:
      SGDRegressor.coef_:回归系数
      SGDRegressor.intercept_:偏置
  • 过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)

    • 从新清洗数据
    • 增大数据的训练量
    • 正则化
      • 数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时候尽量减少这个特征的影响(甚至删除某个特征的影响),这就是正则化
      • 正则化有L1正则化 L2正则化
    • 减少特征为维度 防止维灾难
  • 欠拟合:一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

    • 添加其他特征
    • 添加多项式特征
  • 非线性关系的数据,也就是存在很多无用的特征或者现实中的事物特征跟目标值的关系并不是简单的线性关系。

  • 岭回归是线性回归的正则化版本,即在原来的线性回归的 cost function 中添加正则项(regularization term)以达到在拟合数据的同时,使模型权重尽可能小的目的

  • sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)

    • 具有l2正则化的线性回归
    • alpha:正则化力度,也叫 λ
      • λ取值:0~1 1~10
    • solver:会根据数据自动选择优化方法
      • sag:如果数据集、特征都比较大,选择该随机梯度下降优化
    • normalize:数据是否进行标准化
      • normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
    • Ridge.coef_:回归权重
    • Ridge.intercept_:回归偏置
  • Ridge方法相当于SGDRegressor(penalty='l2', loss="squared_loss"),只不过SGDRegressor实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG)

聚类分析

  • 一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。 分类和聚类最大的区别就是分类是有监督 而聚类是无监督
  • 聚类算法的常用在现实中
    • 用户画像 广告推荐 data segmentation 搜索引擎的流量推荐 恶意流量识别
    • 基于位置信息的商业推送 新闻聚类 筛选排序
    • 图像分割 降维 识别 离群点测试 信用卡异常消费 发掘相同功能的基因片段
  • 聚类的API sklearn.cluster.KMeans(n_clusters=8)
    • 参数:
      • n_clusters:开始的聚类中心数量 整型,缺省值=8,生成的聚类数,即产生的质心(centroids)数
    • 方法
      • estimator.fit(x)
      • estimator.predict(x)
      • estimator.fit_predict(x)
        • 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)
  • k-means的聚类步骤 一个一个找点 然后验证点是不是自己需要的那个点 算出每一个点中心的距离 然后每个点定下来后附近开始附着 下面的步骤就是这样
    1、随机设置K个特征空间内的点作为初始的聚类中心
    2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
    3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
    4、如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程
  • kmeans模型的评估
    • 误差平方和(SSE)
    • 轮廓系数
    • 肘方法 用来确定K值得选择
    • CH系数
  • 优点:
    1.原理简单(靠近中心点),实现容易
    ​2.聚类效果中上(依赖K的选择)
    ​3.空间复杂度o(N),时间复杂度o(IKN)
  • 缺点
    1.对离群点,噪声敏感 (中心点易偏移)
    ​2.很难发现大小差别很大的簇及进行增量计算
    3.结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)
  • kemeans是可以优化的 比如用kmeans++ 二分kmeans kernel kmeans 等等

推荐阅读