注:结论二级,推理三级
逻辑回归是神经网络(深度学习)的基础
(1)线性回归:知道一个坐标的一部分x,来预测另一个y
(2)逻辑回归:知道完整坐标(x,y),来计算和直线的相对位置
多分类和二分类(一分类不存在)
最少是二分类,简化一个输出的类
二分类的预测函数:f=1/[1+e^-(wx+w0)]或者f=1/(1+e^-d)
导数df/dd=f*(1-f)(d就是点到直线的距离)
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的小值
交叉熵损失:
[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)先随机出一个w,计算模型输出
(2)计算模型输出和真实数据的差异 得到损失函数(mse和KL距离)
(3)不停地调整w让损失函数变小
(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
w=w-α*(dKL/dw)
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具有大量局部最小值,数据很多,无法通过随机采样获得最小值(在机器学习的前沿领域,很多研究都是在研究怎么选取初始点,但是工程上达不到很好的效果,同时局部最小值的数量和数据维度的平方成正比)
多分类要分成n个二分类来使用,程序修改过程中更加方便
线性不可分:在一个平面内无法用一条直线将多个点完全分开,情况比较多
数据分段的优点
(1)不分段时,用线性回归来分类;分段时,能用折线来分类,更加精确
(2)数据x的维度很高,使用数据分段x会很稀疏,计算fi更加方便
分类器有一定的错误类:我们需要将关心的类别划分更加严格一些
数据分类失去效果:需要上采样和下采样
1(9999)与0(1)
Logistic Regression:
正确率=(TP+TN)/(MP+MN总数据)
缺点:数据容易被两类不平衡所影响
准确率和召回率:跟阈值相关,而阈值的选择依赖于产品形态,正样本或者负样本,单看一边
准确率=TP/(TP+FP)
召回率=TP/(TP+FN)
ROC和AUC:
ROC 是一条关于m/M和n/N的曲线
AUC =(正样本比负样本预测的分数值大的组合数)/(正负样本的组合数)
AUC的数值上是∈(0.5,1)
(1)α:用模型预测负样本 分值在0.5和0.6之间的为正样本数 占所有负样本的比例
(2)β:用模型预测正样本 分值大于等于0.6的为正样本数 占所有正样本的比例
(3)γ:用模型预测负样本 分值大于等于0.6的为正样本数 占所有负样本的比例
例两大model的比较: model1的AUC > model2的AUC
总结:
(1)正确率 问题: 容易被两类分类不平衡所影响,指标被阈值所影响
(2)准确率和召回率:单独看一类预测结果的指标 问题:指标被阈值所影响
(3)ROC曲线和AUC值:真正反映了模型的能力,表达了正负样本分数的区分度的问题
w的表达:f=1/[1+e^-(wx+w0)]
(1)对于同一条直线,有无数个w的方式进行表达
(2)对于w预测硬币的正面概率,那么-w就是预测硬币反面的概率
(3)w-->10w:扩大了x变化范围,使x更加接近0或1
A:x=信号+噪声,容易扩大噪声,增加误差
B:信号存在信息冗余,噪声不存在,w扩大之后,信息不受影响,但噪声无理由放大
train_data和test_data:
(1)我们希望在test集上表现好
(2)等于在train集上表现好,且train和rest的差别小
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倍,损失函数会更小
正则项的作用:λ||w||
(1)从机器学习的角度:抑制w在分类正确情况下,按比例无限增大
(2)从效果的角度:减少train和test的差异性
(3)破坏训练集的效果
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/σ
正规化:
岭回归:线性回归mse+正则项
推导(w1,w2)变换:
特征转换:让x1,x2可正可负---->N均值和σ均方差:x1=(x1-N)/σ
逻辑回归总结:
(1)交叉熵损失(KL)+L1(或者L2)---->泛化能力好
(2)X的标准化(x-N)/σ ----> 简化数据,让模型学习更快
(3)正确率,召回率,准确率,ROC,AUC----->评判指标
概率分布和高斯分布(正态分布):公理对于具体类别来说,它的特征分布符合正态分布
正态分布推导逻辑回归预测函数f=1/[1+e^-(wx+w0)]
(1)逻辑回归属于判别模型(N1,N2,σ)但是只有两个已知条件求(w,w0)
(2)逻辑回归要承认两个事实:a满足正态分布,b两类数量相等(上下采样)
最大似然估计推导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)