逻辑回归算法

注:结论二级,推理三级

  1. 逻辑回归是神经网络(深度学习)的基础

(1)线性回归:知道一个坐标的一部分x,来预测另一个y

(2)逻辑回归:知道完整坐标(x,y),来计算和直线的相对位置

  1. 多分类和二分类(一分类不存在)

  1. 最少是二分类,简化一个输出的类

  1. 二分类的预测函数:f=1/[1+e^-(wx+w0)]或者f=1/(1+e^-d)

  1. 导数df/dd=f*(1-f)(d就是点到直线的距离)

  1. KL距离:找出一种新的距离,来度量预测值和真实值

(1)求min的KL=∑p(xi)*log (p(xi)/q(xi))

=∑[p(xi)*log p(xi)-p(xi)*log q(xi)]

(2)不具有对称性:

∑p(xi)*log (p(xi)/q(xi))≠∑q(xi)*log (q(xi)/p(xi)

a. KL(p,q):p(xi)*log q(xi)最好越大越好,当p大的时候,q越大越好,增加log q的影响;当p小的时候,q无所谓

b. KL(q,p):q(xi)*log p(xi)最好越大越好,当p小的时候,q越小越好,消除log p的影响;当p大的时候,q无所谓

(3)KL(p,q),q尽可能匹配p的大值; KL(q,p),q尽可能匹配p的小值

  1. 交叉熵损失:

[yi*log(yi/fi)+(1-yi)*log((1-yi)/(1-fi))]

=∑[yi*log(yi)-yi*log(fi)+(1-yi)*log((1-yi)-(1-yi)*log(1-fi)]

第一项和第三项固定值不变,fi才是预测的结果

KL距离=-∑[yi*log(fi)+(1-yi)*log(1-fi)]

  1. (1)先随机出一个w,计算模型输出

(2)计算模型输出和真实数据的差异 得到损失函数(mse和KL距离)

(3)不停地调整w让损失函数变小

  1. (1)KL对fi的导数:dKL/dfi= -1/n∑[yi/fi+(1-yi)/(1-fi)*(-1)]

(2)KL对w的导数:dKL/dw= -1/n∑[yi/fi+(1-yi)/(1-fi)*(-1)]*fi*(1-fi)*x

(3)f对w求导数:dfi/dw= f*(1-f)*x

  1. w=w-α*(dKL/dw)

  1. mse的缺陷:mse=(1/n)∑(fi-yi)^2

dmse/dw= (2/n)∑(fi-yi)*fi*(1-fi)*x(这两项总是趋向于0)

(1)w=w-α*(dmse/dw)(该项趋向于0,w学习不到)

(2)mse具有大量局部最小值,数据很多,无法通过随机采样获得最小值(在机器学习的前沿领域,很多研究都是在研究怎么选取初始点,但是工程上达不到很好的效果,同时局部最小值的数量和数据维度的平方成正比)

  1. 多分类要分成n个二分类来使用,程序修改过程中更加方便

  1. 线性不可分:在一个平面内无法用一条直线将多个点完全分开,情况比较多

  1. 数据分段的优点

(1)不分段时,用线性回归来分类;分段时,能用折线来分类,更加精确

(2)数据x的维度很高,使用数据分段x会很稀疏,计算fi更加方便

  1. 分类器有一定的错误类:我们需要将关心的类别划分更加严格一些

  1. 数据分类失去效果:需要上采样和下采样

1(9999)与0(1)

  1. Logistic Regression:

  1. 正确率=(TP+TN)/(MP+MN总数据)

缺点:数据容易被两类不平衡所影响

  1. 准确率和召回率:跟阈值相关,而阈值的选择依赖于产品形态,正样本或者负样本,单看一边

准确率=TP/(TP+FP)

召回率=TP/(TP+FN)

  1. ROC和AUC:

ROC 是一条关于m/M和n/N的曲线

AUC =(正样本比负样本预测的分数值大的组合数)/(正负样本的组合数)

AUC的数值上是∈(0.5,1)

(1)α:用模型预测负样本 分值在0.5和0.6之间的为正样本数 占所有负样本的比例

(2)β:用模型预测正样本 分值大于等于0.6的为正样本数 占所有正样本的比例

(3)γ:用模型预测负样本 分值大于等于0.6的为正样本数 占所有负样本的比例

  1. 例两大model的比较: model1的AUC > model2的AUC

  1. 总结:

(1)正确率 问题: 容易被两类分类不平衡所影响,指标被阈值所影响

(2)准确率和召回率:单独看一类预测结果的指标 问题:指标被阈值所影响

(3)ROC曲线和AUC值:真正反映了模型的能力,表达了正负样本分数的区分度的问题

  1. w的表达:f=1/[1+e^-(wx+w0)]

(1)对于同一条直线,有无数个w的方式进行表达

(2)对于w预测硬币的正面概率,那么-w就是预测硬币反面的概率

(3)w-->10w:扩大了x变化范围,使x更加接近0或1

A:x=信号+噪声,容易扩大噪声,增加误差

B:信号存在信息冗余,噪声不存在,w扩大之后,信息不受影响,但噪声无理由放大

  1. train_data和test_data:

(1)我们希望在test集上表现好

(2)等于在train集上表现好,且train和rest的差别小

  1. Train性能好+test和train差异的要小:

=-∑[yi*log(fi)+(1-yi)*log(1-fi)] +λ||w||

(1)||w||=√w1^2+w2^2+w3^2……,表示test和train差异的;λ是用来调整比例

(2)train的数据量越大,损失函数越大,导致λ就越小;train的数据量越小,损失函数越小,导致λ就越大

(3)如果已经找到了w的正确分类,把w扩大2倍,损失函数会更小

  1. 正则项的作用:λ||w||

(1)从机器学习的角度:抑制w在分类正确情况下,按比例无限增大

(2)从效果的角度:减少train和test的差异性

(3)破坏训练集的效果

  1. L2和L1:

L2=||w||=√w1^2+w2^2+w3^2……

L1=||w||=|w1|+|w2|+|w3|……

区别:(1)L2各维度普遍变小;L1牺牲最不重要的维度

(2)L2数学完美,实际少用;L1用在维度高的数据集方面

我们真正想要的是:(1)test效果好

(2)train效果好,train和test差异小

27. 等高线:dKL/dw= -1/n∑[yi/fi+(1-yi)/(1-fi)*(-1)]*fi*(1-fi)*x

(1)x1量级大于x2的时候,我们希望学习的时候w1变化慢一些,w2变化快一些

(2)理想情况等高线x1大w1变化小;实际情况x1大w1变化大(量级不一致)

(3)相对变化x1=(x1-min)/(max-min) (x1,x2),(x1,x2)……(这种情况存在脏数据,使得整组数据的计算都没有意义)

(4)N均值和σ均方差:x1=x1/σ

  1. 正规化:

  1. 岭回归:线性回归mse+正则项

  1. 推导(w1,w2)变换:

  1. 特征转换:让x1,x2可正可负---->N均值和σ均方差:x1=(x1-N)/σ

  1. 逻辑回归总结:

(1)交叉熵损失(KL)+L1(或者L2)---->泛化能力好

(2)X的标准化(x-N)/σ ----> 简化数据,让模型学习更快

(3)正确率,召回率,准确率,ROC,AUC----->评判指标

  1. 概率分布和高斯分布(正态分布):公理对于具体类别来说,它的特征分布符合正态分布

  1. 正态分布推导逻辑回归预测函数f=1/[1+e^-(wx+w0)]

(1)逻辑回归属于判别模型(N1,N2,σ)但是只有两个已知条件求(w,w0)

(2)逻辑回归要承认两个事实:a满足正态分布,b两类数量相等(上下采样)

  1. 最大似然估计推导KL距离:

# -*- encoding:utf-8 -*-
from sklearn import datasets
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_predict
from numpy import shape
from sklearn import metrics
from sklearn.metrics import log_loss
import numpy as np
def read_data(path):
    with open(path) as f :
        lines=f.readlines()
    lines=[eval(line.strip()) for line in lines]
    X,y=zip(*lines)
    X=np.array(X)
    y=np.array(y)
    return X,y

X_train,y_train=read_data("train_data")
X_test,y_test=read_data("test_data")
 
 
model = LogisticRegression()
model.fit(X_train, y_train)
 
print (model.coef_)
print (model.intercept_)
 
y_pred = model.predict(X_test)
y_pred=model.predict_proba(X_test)
print (y_pred)
loss=log_loss(y_test,y_pred)
print( "KL_loss:",loss)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值