逻辑回归
逻辑回归是 深度神经网络的基础;把人很多神经细胞 组件成一个神经网络 这个系统越复杂 它就越深 所以给它取名 深度学习;而逻辑回归就相当于 其中的一个神经细胞 所以我们得开始学它其中的一个神经细胞 再学整个的网络 所以我们是从细节到宏观的这个学习过程
线性回归Regression 它是做预测用的 我们知道x 预测y 最后得到的是1个值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUi1Ern4-1610805921673)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125184423894.png)]
逻辑回归 logistic Regression它是用于分类的 最后输出1个类别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJ7feygt-1610805921675)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125184426532.png)]
比如:1条新闻预测这个人 会点与不会点; 然后把她有可能点的广告展现给她
分类
分类可以分为 多分类和二分类
多分类 比如:你输入一个x 它有很多y1,y2…yn 每个y表示它对应类的概率(宏观上讲是这样的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X34v019T-1610805921676)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125184650331.png)]
二分类:输入x 它输出的是两类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9nWg1i65-1610805921679)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125184701364.png)]
那么有一分类吗? 没有 其实 任何一件事 可以分为两个结果 所以就算你做一分类 它也是两个类 它是相反的
二分类
两个分类的概率P1+P2相加 一定是1的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItircGVp-1610805921680)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125184829114.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2kjPS5Xk-1610805921681)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125184910343.png)]
假如这个x是二维的 那么就可以找1个直线w,b 把两类点区分开了 相当于分类 >0 <0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LBXnuJF-1610805921682)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125185128464.png)]
如果大于0 概率就是1 小于就是0的话 最后我们分类曲线 就学习成这样 这个d是我们直线到点之间的距离
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JConNF4w-1610805921682)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125185310773.png)]
那么这样的分类曲线 有什么问题吗? 是不是这个直线太硬了 要不就是1 要不就是0
比如:我做一个字母 识别 识别字母Q 当我的输入是一个图片 是一个Q的时候
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYalPvXC-1610805921683)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125185406806.png)]
但是如果 有个很像Q的 但又不是Q的 我们是不是希望 Q的相似度能大于 没那么相似的啊 通过规则的方式 我们做不到 它太硬了 我们希望它软一点
激活函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6GBb5IW-1610805921684)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125185458468.png)]
这个平滑的曲线 是不是更好 可以提供的信息更多 那么我们看一下 怎么去平滑 就是有一些数学家找到了一些函数 这个函数有这样一些性质
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eE0HzbJn-1610805921685)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125185553420.png)]
当这个d趋向于正无穷的时候 f是不是趋近于1 d趋向于负无穷时 f趋近于0 d=0时 f=0.5 这个函数 是不是刚好满足 我们要的性质
但是满足 我们性质的函数 不止这一个 有很多函数都满足我们的性质 后面会告诉大家 高斯怎么找出这个函数来的
我们研究1个这个f函数 对它求个导 再画个图
这个函数的求导过程一定要会的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yfp1AKWY-1610805921685)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125185830919.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RksY76m-1610805921686)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125185916127.png)]
d=0时 是 0.25 ;最左边刚开始 和最右边刚结束 f随d变化 都比较小 导数的变化就像这样;这个图像是关于0对称的
这个激活函数怎么用?
比如:我现在是不是想找个中间的直线 把它们两个很好的直线分开
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UwxdTXy-1610805921686)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125190018247.png)]
同样是d>0 d=10 和d=100有什么区别吗?这个d是不是 就是和 距离成 正比的啊
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oO91FN3S-1610805921687)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125190142656.png)]
是不是 越远离分界点 算出来的d就越大 越近就越暧昧不清啊
这样数学通过感性的方式来学习 这样理解更轻松一些
逻辑回归模型如何学习的呢?
这个模型就是 进去一个点X1 然后根据w 算出一个f1 然后比较它和y1的区别 调整w 尽量让f1和y1贴近
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K8RBYrr8-1610805921688)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125190309106.png)]
KL距离
是不是 还是借着线性回归的思想 找w 让它们(f-y)的误差最小就行了 但是在逻辑回归中还可以用线性回归的mse吗?
答案是不能的 为什么?
在线性回归中,线性回归 是不是就是 求预测的 和本身的欧式距离 mse啊,那么在逻辑回顾中,这种距离不能用 这个不能用 我们是不是就换个距离就行了啊 找一个新的距离 来度量预测值和真实值
我们预测的是概率 比如我们预测的是0.9 我们发生的概率是0.9 不能发生的概率就是0.1 ;那么我们是不是 求两个概率的距离 这里的距离 我们用的是KL距离 这个是KL距离的公式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6ADdSvo-1610805921689)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125190934341.png)]
注意:这里的p和q(虽然很像r)是两个概率分布 然后n就是x所有能取到的情况
例子:现在我有两枚硬币 我想让你 求一下 这两个硬币p,q的差异到底有多大?如何利用KL用概率求? 已知:p(正)=1/3 p(反)=2/3 q(正)=1/4 q(反)=3/4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDWQ39W2-1610805921689)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125191040041.png)]
带入 这个公式 x取到的情况 就是正/反 两种 p(正)=1/3 表示 p硬币取正的概率
KL= (1/3)log( (1/3)/(1/4) ) + (2/3)log( (2/3)/(3/4) ) = 得到的值 是1个不为0的值
如果p,q两个硬币的正反概率分布都是一样的呢?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dx3dIoe3-1610805921690)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125192031342.png)]
我们再计算一下KL距离:KL = log 1 = 0 是不是就是一模一样的 没有差异性
因此 它具有 距离的性质 又不具备距离的性质
欧式距离 是不是有对称性 但是KL距离是没有对称性的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUf5Ikcr-1610805921691)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125192407471.png)]
三级知识点:P(X)它是一个概率分布
现在我们的x取的都是离散点 然后放到KL公式里 算出来的 如果这里的x是取的连续值的话 而且 它取的是一个正态分布 那么这个公式怎么办呢?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9N7XMV7-1610805921691)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125192509977.png)]
假设我们的q(x)呈正态分布,它可以移动
而p(x)是这样的 定死的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UlX5a69G-1610805921692)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125192654000.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6bjmjj7-1610805921693)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125192717149.png)]
如果说 我来衡量 两个概率分布 用哪个q(x)来衡量 更加的贴近
当争议性 越大的时候 这个问题是不是更有价值啊 所以我是希望两个类别的KL距离的值更大的 而不是为0
我们把KL距离化简一下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vb2mQGqt-1610805921693)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125192816211.png)]
那么第一项跟q没有半毛钱关系 第一项求出来只是常数值 我们只用分析第二项就可以了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ByGbqHDc-1610805921694)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125192939805.png)]
那么是不是 这一项 要尽可能大啊
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jXQKoII0-1610805921695)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125193002008.png)]
那么q对应的 P越大 越好
所以 我们把q和p倒换一下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dU0bvJAB-1610805921695)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125193120507.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c6eSn7bN-1610805921696)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125193235972.png)]
相反的,所以我们希望 这个尽可能小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvyOxbXV-1610805921697)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125193253717.png)]
p很小的时候 那么logp很快趋近于-∞ 那么p很小的时候 是不是q 也必须很小 以便消除logp的影响
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29Cky0Ha-1610805921697)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125193854490.png)]
所以 前1个参数 越大越好 后1个参数 越小越好
KL怎么在训练集上计算 距离?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZqs7R0I-1610805921698)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125194143033.png)]
可不可以 这样算
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7fKPbmZZ-1610805921699)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125194207449.png)]
交叉熵损失
当Y=1时 f->1 完美 当Y=0 f随意 为什么? 是不是因为 这个公式 f只拟合Y比较大的点 其他点 它不拟合 对不对?
因为 它Y=0的情况 后面的KL距离几乎计算出来为0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IR10PR4r-1610805921699)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125194440152.png)]
我们算是 只有一个输出 但是我们是不是二分类 本质是发生和不发生 两头都得拟合
其实这不是 mse了 其实它叫 交叉熵损失 后面会讲
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHQJKbGm-1610805921700)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125194628377.png)]
其实 你面试时 就说KL距离就行了,交叉熵就是两个正反KL距离相加 面试官 懂的 自然会懂,这个式子 是不是一定有一个为0
在上面的基础上 我们再把上面的交叉熵损失函数 化简一下 把等于0的无关项 化简出来
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2R3QBGDv-1610805921701)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125195008423.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1YcGGB71-1610805921701)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125194952275.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pF9zO9E-1610805921702)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125195136617.png)]
我们的fi 是不是就是这个 不停的调整w 进而调整fi 调正fi使KL距离变小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KqsXIzGK-1610805921703)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125195812870.png)]
现在还差 怎么调整w 其实sklearn已经帮我们封装好了 原理很难 不用掌握
代码实战
#get_data.py
import random
def generate_data(num):
results=[]
count=0
while True:
x1=random.uniform(0,10)
x2=random.uniform(0,10)
if abs(x1-x2)<2:
continue
y=1 if x1>x2 else 0
results.append(str([[x1,x2],[y]]))
count+=1
if count>=num:
break
return results
train_data=generate_data(500)
test_data=generate_data(100)
with open("train_data","w") as f :
f.writelines("\n".join(train_data))
with open("test_data","w") as f :
f.writelines("\n".join(test_data))
#train.py
# -*- 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
def curve(x_train,w,w0):
results=x_train.tolist()
for i in range(0,100):
x1=1.0*i/10
x2=-1*(w[0]*x1+w0)/w[1]
results.append([x1,x2])
results=["{},{}".format(x1,x2) for [x1,x2] in results]
return results
X_train,y_train=read_data("train_data")
X_test,y_test=read_data("test_data")
model = LogisticRegression()
model.fit(X_train, y_train)
# 不停的调整w 跟线性回归一样的 是不是就是一个学习的过程 我们找导数的过程
print "w",model.coef_
print "w0",model.intercept_
y_pred = model.predict(X_test)
print y_pred
y_pred=model.predict_proba(X_test)
print y_pred
loss=log_loss(y_test,y_pred)
print "KL_loss:",loss
loss=log_loss(y_pred,y_test)
print "KL_loss:",loss
curve_results=curve(X_train,model.coef_.tolist()[0],model.intercept_.tolist()[0])
with open("train_with_splitline","w") as f :
f.writelines("\n".join(curve_results))
二级知识点:手推KL距离 对w的导数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YeNamPxh-1610805921705)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125195914251.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-htocWK5w-1610805921706)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125195925215.png)]
这个式子 是不是高度对称的,每一次 我们都是这样更新的 然后w可以这样算出来,但是yi和fi是不是总有一个为0的啊 因为yi也就两个值
三级知识点(30%的正确率):为什么不用mse?关键的问题来了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDHqQuSo-1610805921707)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125200444439.png)]
多元链式求导 看到没有,其实 它的问题 不是在于 不能度量 而是它的导数 有问题
我的w是不是 随机的 假如我的w开始时 是一个非常大的正值 会出现什么问题?
它会往 这两个极端的值走
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vmTYNTR-1610805921707)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125200541967.png)]
然后 导致这个导数 所有的值为0 那么 导致 这个导数非常的小
但是 我真正要学习的是 这个w
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fAGrcQNw-1610805921708)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125232045828.png)]
如果我这个α非常小 都趋近于0了的话 那么这个w是不是 就没有变化啊 这个w根本就学不到东西 但是这个w是正确的分类吗? 不是 对不对? 因为你还没有正确的分类的时候 你已经学不到 东西了
其实 在机器学习的前沿领域 很多研究 都是在研究 怎么选初始点?你很难选对 你知道为什么吗?
这里的x1,x2这个是两维的,但是 企业里动不动 就是成千上亿维
而极值点的数量 和维数的平方成正比
比如我维度100维 那么我的局部极小就有可能有10000多 很难避掉 所以你说几千万个点里面 找几个合适的点 是不是非常的难啊
深入理解KL距离函数
KL是什么线? 有抛物线的形状 但不是 它其实是凸函数
这就是 我们学出来的结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I3m71Sak-1610805921709)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125232254033.png)]
这条直线能画多少条 是不是能画无数条啊 一般它会选中间的这一条
预测概率 在企业中应用(可以使用logistics regression)
1.比如 广告的点击率预测
用户,广告 我可以预测它点击的概率 这个概率本身就不会太高 0.01 0.02 但是我们可以预测找出一个 概率最高的广告;如果你的模型 能把点击的预测率 稍微提高一点点 你是不是就可以赚翻啊 因为我是放一条广告 然后用户点了 我就给搜索引擎公司钱 只要把点击率提高一点点 是不是给公司带来效率高
2.给用户进行 内容分发
比如 是一个内容分发的文本网站 很多用户会写内容 写文章 头条啊快报 会对文章进行分级 好级别 分发得多一点 流量大一点 如果文章比较差 是不是直接干掉了 不分发,一个网站里面 每天新来的文章都是几十万,上百万 是不是人搞不定这种事情啊 这个时候就可以用机器学习 怎么使用?我对以前的文章 我做过的文章 好的标1 差的标0 我训练一个逻辑回归的模型来预测每一篇文章 如果分数越高 它越可能好 分数越低 它越可能差
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2B0n6Jfa-1610805921709)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125232629083.png)]
0.9的交给人工确认 是不是真的好 0.1的交给人工确认是不是真的差;中间的不管它 作为普通文章;100w的文章 变成了几千 你做了这个事情后 是不是给公司少了很多成本处理
逻辑回归只能做二分类吗?
逻辑回归可以做多分类 ;比如我们有一个多分类的任务 x里面有n个分类 输入有n+1个 为什么有n+1个? 因为还有一种是n类都不是
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xEDPTiwl-1610805921710)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125232743408.png)]
比如 今天是10个分类 然后你一下子训练完了 然后我后天告诉你5个就够用了 或者11个 那么你是不是 要来回的改 来回改需求 是不是产品经理来回的改 那么你就得来回的折腾 那么我们怎么办呢?
我们可以 每一类对应训练1个分类器。如果这个模型 对于这个类 打出的分数比较大, 那么说明这个分类器对这个模型比较好判断,那个模型拿出来 就属于这个模型的分类;但是如果最大的也比较小 那么它是不是就不属于 这n个类中的 任何一个;这样 你用n个小的 就不用改的那么多
线性不可分问题
能否 找一条线 把2个圆形和2个三角形分隔开来?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v7RMtLzs-1610805921711)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125233242410.png)]
我们发现 我这个w无论怎么找 你都有错 是不是做不到完美 ,是线性不可分的
那么问题来了 在真实场景里 线性可分的场景多 还是线性不可分的场景多?
显然真实场景中 线性不可分的场景更多,这样是不是 大量都是线性不可分 你用线性模型做线性不可分的问题 是不是不一定完全分得准确 是不是总是有一些点是要错的
怎么用线性模型解决线性不可分的问题?
如果 我们要做到可分 有什么办法吗?
方法1.升维
我可以 把三角形抬上去 那么我是不是就可以进行线性分割了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O5oGIVfr-1610805921711)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125233449904.png)]
那我怎么抬呢?
把(x1,x2)变成(x1,x2,x1x2),做了一个数学技巧 我不扩维 我让原来的向量相乘
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vOCtE9H-1610805921712)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125233617610.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xVk2S2Vc-1610805921712)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125233633142.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUwBydOF-1610805921713)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125233718657.png)]
那么这样 我们最后的学习出来的直线 这个是不是一条双曲线,然后曲线里面是一类 外面是一类
为什么是这样的双曲线?因为 然后三维的面 投回 二维就是这样一条线
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwG2w7Vp-1610805921714)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125233809435.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUhDy0f1-1610805921715)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125235828629.png)]
下面的曲线肯定比上面的曲线好的 因为不好的话 w3会自动学成0 升维后模型的表达能力更强
想到 之前 年轻女性双十一的例子 是不是 还 可以是特征的组合啊,特征工程:那么 我通过不同的改变w 让w改变 是不是可以让直线 变弯,是不是 一个简单模型在特征上 搞来搞去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xKLjSqry-1610805921715)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125233943457.png)]
xi代表年龄的分段,为什么要把年龄分段?
好处1:如果x不分段 代表0到100 不管你多少岁 你的岁数对这个值的贡献 是不是就是一个线性的过程 这个 斜率就是w2 如果我分段 0-50是一段 50-100岁是一段 那么我一条直线变成了一条折线 我的表达能力更强了 如果所有年龄共用一个系数 是不是很难调 有些岁数 对年龄很敏感 有些不敏感 这是分段的好处
好处2:真实场景中 x的维度一般比较高 上万维 但是这是个在线的服务 可能这个qps 一秒钟要被调用几万次 是不是你的运算就特别大啊 如果我进行分段 有个什么好处
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7nKgzYyS-1610805921716)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125234122123.png)]
x很稀疏 x中有大量的是0 偶尔是1 当我算wx 我只需要把 当x是1的那几个 不是0的那几个 拿来乘 是不是就可以了 减少运算量 速度就提上来了,如果我的x值 表达范围是0,1的话 年龄分段,那么我就不用乘法了w·x了 反正x那么是0 那么是1 我们所有特征全部变成相加了(乘法变加法 这快多了)
比如1000w维的特征 我只有789 800 900为1 那么我直接相加 我是不是连乘法都没有了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2s1h492c-1610805921717)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125234518384.png)]
所以逻辑回归 是不是非常简单 但是有很多玩法
逻辑回归最大的好处就是速度非常快
如果你在企业中 要做逻辑回归的工作 特别是在企业的时候 别人问你怎么做?这些其实 都是一些点 你们都可以进行回答
代码实战
#get_data.py
# -*- encoding:utf-8 -*-
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_predict
from numpy import shape
from sklearn import metrics
def array_to_list(data):
data=data.tolist()
return data
loaded_data= datasets.load_breast_cancer()
#loaded_data = datasets.load_boston()
data_X = loaded_data.data
data_y = loaded_data.target
X_train, X_test, y_train, y_test = train_test_split(data_X, data_y, test_size=0.2)
X_train=array_to_list(X_train)
X_test=array_to_list(X_test)
y_train=array_to_list(y_train)
y_test=array_to_list(y_test)
train_data=zip(X_train,y_train)
train_data=[str(list(s)) for s in train_data]
test_data=zip(X_test,y_test)
test_data=[str(list(s)) for s in test_data]
with open("train_data","w") as f :
f.writelines("\n".join(train_data))
with open("test_data","w") as f :
f.writelines("\n".join(test_data))
#train.py
# -*- 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)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vb1WdLhz-1610805921718)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125234843442.png)]
我们这里的逻辑回归 阈值设定为0.5 但是 这样合理吗?
因为 分类器有一定的错误率,并不是一下可以断定出来谁一定癌症,为了不漏掉 任何一个人 我们降低权重 我们保证时癌症的人一定被找出来 他自带的是0.5为标准 实际上我们要把0.5给降下来 这也是一个 非常真实的场景
逻辑回归的训练过程 我们怎么训练w? w就是画直线的过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5t4GSvUN-1610805921719)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125235051359.png)]
这些点 推来推去 最好推不动了 就结束
数据倾斜
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zQnCnmtx-1610805921719)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125235108920.png)]
假如在训练过程中 圆形这一类有1w个 三角形有100个 你觉得会出现什么情况?
是不是这根线 肯定推到 三角形外面了 把三角形也划分为 圆形类了,虽然正确率高 但是没有意义啊 对不对。 那么怎么平衡呢?这个问题叫 数据倾斜 解决方法叫 数据平衡
数据平衡的常见方法
1.下采样 圆形多了9倍,那么我们就只取1/9个圆形,和三角形达到1:1的比例;
大样本变少 叫下采样
2.上采样 让少的类 重复n次 与大类达1:1 让它重复几次 重复9998次
小样本变多 叫上采样(或者 (加大三角形的权重))
但在实际生活中 被标注的数据 本来就很少 很多数据量是人来标注的 你下采样是不是 让输入的数据量总数变少了 而我上采样是变多 理论上两者都可以 但实际用的多是 上采样
上采样的应用
比如 广告公司; 是不是 大量的广告都不会被点 做逻辑回归
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YpdLaTpQ-1610805921720)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201125235634438.png)]
那么 我们是不是重复1 这个数据来平衡
再比如 做评论检测 大多数评论都不是反动的 就把反动的加重
模型评价——准确率,召回率
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QIM9G86n-1610805921721)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201202084024777.png)]
我们是不是 要对逻辑回归模型 进行评测 其实每个模型出来后 都应该有个评测
什么是正例,负例?
什么是“正例”?比如说,医学中癌症的良、恶性分类,“正例”是指“良性”还是“恶性”?看你自己的目标是什么,你想找恶性的就定义恶性为正例,反之就定义良性为正例,全看自己的定义
TP与FN是什么?
P/N是预测结果的positive,negetive,T/F是对预测结果true与false的判断(T/F是对于预测结果的判断)。也就是说:
根据正负样本,我们可以把模型的预测结果分为4个象限:
TP是判断为正例§,判断是正确的(T)(t也就是实际就是正例);TP
TN是判断为负例(N),判断是正确的(T)(也就是实际就是负例);TN
FP是判断为正例(N),判断是错误的(T)(也就是实际是负例);FP
FN是判断为负例(N),判断是错误的(T)(也就是实际是正例);FN
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7SMFbFF9-1610805921721)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201202084609006.png)]
如果我们要让模型越好,是不是要落在1,4象限越多就行
正确率,准确率,召回率
正确率(accuracy)公式:
正 确 率 ( a c c u r a c y ) = ( T P + T N ) / ( P + N ) 正确率(accuracy) = (TP+TN)/(P+N) 正确率(accuracy)=(TP+TN)/(P+N)
P+N即为所有判断为改类的样例数 T*即为判断正确的样例
正确率也就是 所有判断正确的样例在所有样本中的占比(正负类都有正确率的)
假如:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gDmlX29h-1610805921722)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201202091306540.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9SHA6ZOB-1610805921722)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201202091312313.png)]
那么我们得到的这个正确率是不是 还可以? 但是有个问题 正确率高的原因 有可能是正样本比较好 即使我1/5的负样本FN都预测错了(5个负样本中 预测错了1个) 但是得到的正确率依然还是很高,所以这个指标预测不是很科学 特别是在 它们两类样本的 数量差异 特别大的情况下
准确率(precision)公式:(也称 查准率 )
准 确 率 ( p r e c i s i o n ) = ( T P ) / ( T P + F P ) 准确率(precision)=(TP)/(TP+FP) 准确率(precision)=(TP)/(TP+FP)
中精度又称为查准率:预测为正例的预测集内,正例预测正确的比率
精度通常与另一个指标一起使用,这个指标就是召回率(recall),也称为灵敏度(sensitivity)或者真正类率(TPR):它是分类器正确检测到的正类实例的比率
召回率(recall)公式 (查全率)(灵敏度)(真正类率)
召 回 率 ( r e c a l l ) = ( T P ) / ( T P + F N ) 召回率(recall)=(TP)/(TP+FN) 召回率(recall)=(TP)/(TP+FN)
即:我在 整个正(负)类样本中,预测正确的样本所占的比率
你不能同时增加精度并减少召回率,反之亦然。这称为精度/召回率权衡。
对于负样本来说,总共有5个负样本 我只找到了一个 所以我的召回率是1/5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qrtoWWWA-1610805921723)(C:\Users\24391\AppData\Roaming\Typora\typora-user-images\image-20201202093038863.png)]
准确率是 我认为是负的样本里面 到底有多少是负;召回是什么 是实际中 有多少个负样本 我找回了多少个
所以我们可以分别计算一下 正负样本的正确率和召回率:
对于正样本:
正确率:一共有98个(正的 负的)是预测正确的 但实际上有94个是预测正的 94/98
召回率:95个正样本 找回了94个
对于负样本
正确率:一共有5个负样本,我预测对了4个 就是4/5
召回率:一共5个负样本中,我1/5
混合精度和召回率就是F1
准 确 率 ( p r e c i s i o n ) = ( T P ) / ( T P + F P ) 准确率(precision)=(TP)/(TP+FP) 准确率(precision)=(TP)/(TP+FP)
中精度又称为查准率:预测为正例的预测集内,正例预测正确的比率
精度通常与另一个指标一起使用,这个指标就是召回率(recall),也称为灵敏度(sensitivity)或者真正类率(TPR):它是分类器正确检测到的正类实例的比率
召回率(recall)公式 (查全率)(灵敏度)(真正类率)
召 回 率 ( r e c a l l ) = ( T P ) / ( T P + F N ) 召回率(recall)=(TP)/(TP+FN) 召回率(recall)=(TP)/(TP+FN)
即:我在 整个正(负)类样本中,预测正确的样本所占的比率
你不能同时增加精度并减少召回率,反之亦然。这称为精度/召回率权衡。
对于负样本来说,总共有5个负样本 我只找到了一个 所以我的召回率是1/5
[外链图片转存中…(img-qrtoWWWA-1610805921723)]
准确率是 我认为是负的样本里面 到底有多少是负;召回是什么 是实际中 有多少个负样本 我找回了多少个
所以我们可以分别计算一下 正负样本的正确率和召回率:
对于正样本:
正确率:一共有98个(正的 负的)是预测正确的 但实际上有94个是预测正的 94/98
召回率:95个正样本 找回了94个
对于负样本
正确率:一共有5个负样本,我预测对了4个 就是4/5
召回率:一共5个负样本中,我1/5
混合精度和召回率就是F1