美文网首页
逻辑回归

逻辑回归

作者: Bounty_Hunter | 来源:发表于2019-07-22 14:59 被阅读0次

    逻辑回归说的是数据的分类,估计的是一个离散值

    线性回归用来估计某个连续值,如果用线性回归来归类,预测值是0.1 0.2 而不是1 和 0。

    根据:

    如果我们可以计算属于每个类的观察概率,我们可以将它分配给具有最高概率的类。

    我们需要一个函数可以将 feature 的 Series 作为输入​,返回概率值域为[0,1]

    Logit函数

    比值比(odds ratio) ,它可以被写成 ​ ,其中的 ​ 代表正事件(positive event)的概率.

    正事件代表我们想要预测的事件。比如:病人患有某种疾病的概率。

    我们把正事件的类标签设置为1。比值比的对数称为Logit函数,它可以写成如下形式:

    可以证明 ​ 的定义域为 [0,1],值域为​

    image

    logit函数输入0到1的值并把它们转换为整个实数范围内的值,则

    输入的是 特征向量x的条件下,类别y=1的概率, 输出的是输出范围是整个实数。

    模型的线性分量包含设计矩阵和要估计的参数矢量。 自变量X的设计矩阵由N行和K + 1列组成,其中K是模型中指定的独立变量的数量。 对于设计矩阵的每一行,第一个元素xi0 = 1.这是截距或“alpha”。参数矢量β是长度为K + 1的列向量。有一个参数对应于每个 X列中的K列自变量设置加上一个β0,用于截距。

    因此如果我们想得到特征向量x的条件下,类别y=1的概率的话,就是取 Logit() 的反函数

    Sigmoid 函数

    Sigmoid 图像:

    定义域​ ,值域[ 0 , 1]

    image

    (1)式对应的反函数如果我们只取截距 ​ 和1 列数据,得到

    这就是简单Logistic回归模型

    numpy.ndarray.astype( dtype )

    将 array 里的数据强制转换类型

    • dtype = int 转换成整形,True -> 1 False -> 0

    numpy.reshape(a, newshape, order='C')

    将矩阵换个形状

    • a 要换的矩阵

    • newshape: 可以是 int 类型或者是个 Tuple 类型

      • 如果是 int 类型,返回结果是该长度的1-D 矩阵

      • 如果是 tuple , 就根据原矩阵形成新的矩阵,( 行数,列数 )

      • 如果 一个形状尺寸可以是-1。 在这种情况下,从阵列的长度和剩余尺寸推断出矩阵的形状。

    • y_true 指的是 target 的真实值数据向量

    • y_pred 指的是 target 的预测值数据向量

      • 可以显示各项评估值

        • precision 精确率

          精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),也就是 [图片上传失败...(image-6339d6-1563778534298)]

        • recall 召回率结果是否完整

        • 召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。

        • [图片上传失败...(image-9a0046-1563778534298)]

        • f1-score F1值是精确度和召回率的调和平均值(是总体各统计变量倒数的算术平均数的倒数)

        • support 每个标签的出现次数

      sklearn.metrics.classification_report(y_true, y_pred

      分类报告

      可以用下面的表格再练习一下

      所有的公式:

      • 准确性

        Accuracy: Overall, how often is the classifier correct?

        • (TP+TN)/total = (100+50)/165 = 0.91
      • 错误率

        Misclassification Rate: Overall, how often is it wrong?

        • (FP+FN)/total = (10+5)/165 = 0.09

        • equivalent to 1 minus Accuracy

        • also known as "Error Rate"

      • True Positive Rate: When it's actually yes, how often does it predict yes?

        • TP/actual yes = 100/105 = 0.95

        • also known as "Sensitivity" or "Recall"

      • fall-out

        False Positive Rate: When it's actually no, how often does it predict yes?

        • FP/actual no = 10/60 = 0.17
      • 特异性

        Specificity: When it's actually no, how often does it predict no?

        • TN/actual no = 50/60 = 0.83

        • equivalent to 1 minus False Positive Rate

      • 精确性

        Precision: When it predicts yes, how often is it correct?

        • TP/predicted yes = 100/110 = 0.91
      • Prevalence: How often does the yes condition actually occur in our sample?

        • actual yes/total = 105/165 = 0.64

      从混淆矩阵中我们可以得到很多关于预测结果的评价数据

      image
      True positive(TP) eqv. with hit
      True negative(TN) eqv. with correct rejection
      False positive(FP) eqv. with false alarm, Type I error
      False negative(FN) eqv. with miss, Type II error
      • true positives (TP): These are cases in which we predicted yes (they have the disease), and they do have the disease.

      • true negatives (TN): We predicted no, and they don't have the disease.

      • false positives (FP): We predicted yes, but they don't actually have the disease. (Also known as a "Type I error.")

      • false negatives (FN): We predicted no, but they actually do have the disease. (Also known as a "Type II error.")

      对于该预测结果我们得到混淆矩阵的几个基础值

      混淆矩阵允许我们做出更多的分析,而不仅仅是局限在正确率。准确率对于分类器的性能分析来说,并不是一个很好地衡量指标,因为如果数据集不平衡(每一类的数据样本数量相差太大),很可能会出现误导性的结果。例如,如果在一个数据集中有95只猫,但是只有5条狗,那么某些分类器很可能偏向于将所有的样本预测成猫。整体准确率为95%,但是实际上该分类器对猫的识别率是100%,而对狗的识别率是0%。

      在这165个案例中,模型预测的结果“是”110次,“否”预测55次。 实际上,样本中的105名患者患有该疾病,而60名患者没有。

      image

      假设有一个用来对是否患病预测结果进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结。假设结果的混淆矩阵如下图:

      举例说明下混淆矩阵

      • y_true 指的是 target 的真实值数据向量

      • y_pred 指的是 target 的预测值数据向量

      • 返回值是一个混淆矩阵,分别是false positives,falsenegatives,true positives和true negatives 的值

      sklearn.metrics.confusion_matrix( y_true , y_pred)

      混淆矩阵

      分类结果评估

      • statsmodels.api.Logit( Y, x_with_intercept)

        • 这里的x_with_intercept 是训练集 中 feature 向量加上一列1的结果:

      也可以用 Statsmodels.api 里的逻辑回归

      指的是 回归拟合 的 特征系数

      coef_LogisticRegression 类型的属性值之一

      LogisticRegression.coef_

      指的是 回归拟合 的截距, 即​

      intercept_LogisticRegression 类型的属性值之一

      LogisticRegression.intercept_

      返回给定测试集合的平均准确率(mean accuracy),浮点型数值

      y_predict 是要预测的 target 的 i行数据向量,y_true 是X 对应的真实 target 数据向量

      LogisticRegression.score( y_predict,y_true)

      返回的结果是一个 i 行的数据,代表每一条 feature 对应的预测结果。

      输入值是要预测的 feature 的 i行数据向量

      根据拟合结果预测可能性

      LogisticRegression.predict( X )

      如果参数是默认情况下,返回的第0列是 分类为 0 的概率,第1列是分类为1 的概率

      返回的结果是一个 i 行 j 列的数据,其中第i行第j列上的数值是模型预测第i个预测样本的标签为j的概率。所以每一行的和应该等于1.

      输入值是要预测的 feature 的 i行数据向量

      根据拟合结果预测可能性

      LogisticRegression.predict_proba( X )

      • X 指的是训练集的 feature 数据向量

      • Y 训练集中的 target 值的向量

      • 返回的是模型训练的结果

      模型训练

      LogisticRegression.fit(X, y)

      • C = 1e16

        • C 是正则化强度 Regularization strength 的倒数。

        • 正则化就是为了防止模型记忆训练集的数据,而导致预测结果的偏差。尤其是在训练集有很多变量但是数据个数少的的时候,模型训练的时候会根据训练集的数修改参数来尽可能拟合数据,然而我们想要预测的数据往往并没有训练集数据的特点(比如一个特别大的数),这样我们得到的模型的预测能力就会受损。

        • 更具体地说,如果我们的模型遭受(高)方差(即,它过度拟合训练数据),我们可以将正则化视为增加偏差。

        • 过多的偏差会导致欠拟合,我们在非正规化模型中的目标是最小化 cost 函数,即,我们希望找到与全局成本最小值相对应的特征权重(w)

        • 如果我们规范成本函数(例如,通过L2正则化),我们在我们的成本函数(J)中增加一个附加值,随着参数权重(w)的值增加而增加; 添加了一个新的超参数 ​ 来控制正则化强度。

        • Regularization strength ​ 越大参数在幅度上增加的可能性较小,仅仅是为了调整数据中的小扰动。

      sklearn.linear_model.LogisticRegression()

      逻辑回归 调用库实现

    相关文章

      网友评论

          本文标题:逻辑回归

          本文链接:https://www.haomeiwen.com/subject/lohwlctx.html