2.5 logistic 回归初认识

2.5 logistic 回归初认识

一 、数据不均衡的处理方式(补充)

在这里插入图片描述

1. 欠采样:

潜在的问题出现在可能会抛弃一部分数据,使得拟合效果不好,但是可以使得数据总体均衡

2. 过采样:

潜在的问题出现可能会复制部分数据进行填充,使得训练拟合的时候过度集中于被复制的数据的规律中。但也可以使得数据总体均衡

3. 找业务部门填充真实数据
4. 不去处理,直接训练模型,有时候的训练效果要好很多
5. 算法处理:class_weights

eg: 男生 * 权重2 = 女生 * 权重1
回归类的模型指标:
评估模型好坏,使用score, MSE, MAE 是对分类的评判
回归类的模型评估指标:
方法1 : 原始评估方法就是使用score来判断模型好坏。
方法2:加入了交叉验证,的MSE,MAE得到一个平均的score,这样的效果更好。
是否拟合到了足够的信息,使用R²

二 逻辑斯蒂回归的基础理解

1. 逻辑斯蒂回归
  • 名字叫回归,实际上做分类。主要用于两分类问题

  • 逻辑斯蒂回归的回归 - 过程

  • 逻辑斯蒂的分类

  • 逻辑斯蒂回归会生成0-1之间的连续数字 — 数字表示可能性

  • 阈值 —> 阈值的作用:分类的判断

按照以往的方式,使用最小二乘法拟合广告渠道投入金额与顾客是否购买的关系,效果不佳
在这里插入图片描述

  • 这个函数必须连续函数,单调可导,
2. 可能性与最大似然估计
  • 可能性:某件事情发生的可能性的大小

  • 似然函数:某件事情已经发生,反推在什么条件下,发生这个事件的可能性最大

    • 已知参数β的情况下,预测发生X的条件概率:P(X|β) ①

    • 已知已发生的事件X,未知的参数β的似然函数:L(β|X) ②

    • ① = ②

    • 一个参数β对应一个似然函数的值,如果β发生变化,那么似然函数的值也会变,当我们取得某个参数的时候,似然函数的值到达最大。就说明这个参数下最有可能会发生X事件,就意味着这个参数最合理

      最大似然估计:

      P(y=1) = p(y=1) ¹ p(y=0)
      在这里插入图片描述

3. 逻辑斯蒂回归的scikit_Learn代码实现

梯度下降的练习

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei',]
plt.rcParams['axes.unicode_minus']= False

#产生X,y,x预设范围-5,5
X = np.linspace(-5,5,50)

# 预设一个损失函数
# 3x²+2x+3.2
f = lambda x : 3*x**2 + x*2 +3.2
y = f(X)  # y代表的损失函数的值

# 看一下损失函数与x的图像
plt.plot(X,y)
plt.xlabel('w')
plt.ylabel('loss')

在这里插入图片描述

# 使用梯度下降来取得loss最小时的w值
# F(x) = 3*x**2 + x*2 +3.2
# 求导结果 g(x) = 6*x+2
g = lambda x : 6*x+2
"""
# 梯度下降的公式
#w1 = w0 - step*g(w0)
# w0 下降的起始点
# w1 下降之后的点
# step 相当于η 步长 学习率
# g(x) 对损失函数求导之后的函数
"""
w0 = np.random.randint(-5,5,1)[0]
print('下降的起始位置点:%d'%(w0))

step = 0.01

# 初始化一个w1位置
w1 = w0 +1
# 学习率不能太大,太大跳过最优解 梯度震荡
# 学习率太小:找不到最优点

# 设置下降的精度
precession = 0.001

# 下降次数
max_count = 3000

# 当前下降的次数
current_count = 1

# 记录下降的位置
point = []
while True:
    # 如果大于之前预设的迭代次数,则直接跳出
    if current_count > max_count:
        break
        
    if np.abs(w0-w1) <= precession:
        break
    # 更新上一次点
    w0 = w1
    
    #计算新的下降点
    w1 = w0 -step *g(w0)
    point.append(w1)
    current_count += 1
    print('当前第%d次下降的位置: %.4f'%(current_count,w1))

"""
下降的起始位置点:3
当前第2次下降的位置: 3.7400
当前第3次下降的位置: 3.4956
···

当前第90次下降的位置: -0.3157
当前第91次下降的位置: -0.3168
当前第92次下降的位置: -0.3178

"""

w = np.array(point)[::10]
"""
array([ 3.74      ,  1.86062556,  0.84836609,  0.30314784,  0.00948504,
       -0.14868617, -0.23387958, -0.27976604, -0.30448118, -0.31779313])
"""
value = f(w)

# 绘图 ,看原来损失函数与下降位置,拿到10个下降位置
x = np.linspace(-5,5,50)
y = f(x)

plt.figure(figsize=(24,6))
plt.plot(x,y)
plt.scatter(w,value,color='red')
plt.show()

在这里插入图片描述

4. 参数理解
梯度下降最重要参数:max_iter梯度下降最重要参数:max_iter
  • L1
  • L2
    在这里插入图片描述
    sag :随机平均梯度下降是梯度下降的编制
    在这里插入图片描述
5. 逻辑斯蒂回归解决多分类的方法

三种方法:

  • 将sigmoid的函数换成softmax
  • OvR: 选择ovr, 4损失函数的优化方法liblinear,newton_cg,lbfgs,sag 都可以选择。
  • MVR:只能选择newton_cg,lbfgs,sag

了解一下

了解广义线性回归?
逻辑斯蒂回归与线性回归有什么不同?

逻辑斯蒂回归的分类使用

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei',]
plt.rcParams['axes.unicode_minus']= False
# 逻辑斯蒂回归 虽然名字叫回归 实际上解决分类问题

from sklearn.linear_model import LogisticRegression # 制造假数据
from sklearn.datasets import make_blobs # 制作假数据
X,y = make_blobs(n_samples=150,n_features=2,centers=3)
X.shape
y.shape
sns.set()
sns.displot(y) # 查看y值的分布
sns.countplot(x=y) 画出y值的分布图

sns.countplot(x=y)

# 绘图展示数据情况
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Accent)

#LR
# 1.
lr = LogisticRegression()
# 
lr.fit(X,y)

# 绘制决策边界
xmin,xmax = X[:,0].min(),X[:,0].max()
ymin,ymax = X[:,1].min(),X[:,1].max()

a = np.linspace(xmin,xmax,200)
b = np.linspace(ymin,ymax,200)

xx,yy = np.meshgrid(a,b)

X_test = np.concatenate((xx.reshape(-1,1),yy.reshape(-1,1)),axis=1)
# 3.预测
y_= lr.predict(X_test)
plt.scatter(X_test[:,0],X_test[:,1],c=y_,cmap=plt.cm.Accent)
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.BuGn)

+ 逻辑斯蒂回归对于线性不可分的数据划分不太好
+ 对于线性可分的数据划分比较优越

+ 概率估计模型,并且也具备所有线性模型的优点(高效,缩减)|
#概率估计模型,并且也具备所有线性模型的优点(高效,缩减)|
# lr.predict_proba()

### 逻辑斯蒂回归的概率估计
# 预设:5个特征 10个样本
X = np.random.random(size=(10,5))
y = np.random.randint(0,2,10)
lr = LogisticRegression()
lr.fit(X,y)
lr.predict(X)

# 线性模型 
lr.coef_
# score
lr.score(X,y)

# 查看正负样本的概率
# 第一列实际上是p(y=0)概率 第二列是P(y=1)的概率
# 如果p(y=0)概率 >P(y=1)的概率,结果就是y=0,反之亦然

# 如果将阈值调整就可以使得结果更加偏向于某一个类
# eg:p(y=0)>0.5 改为0.4 即实际上就是y=0的概率变大
lr.predict_proba(X)

lr.predict(X)
# 试验:如果我们需要调整阈值使得结果偏好发生变化
(lr.predict_proba(X)[:,0]>0.6)*1
# 查看
(lr.predict_proba(X)[:,0]<0.4)*1
(lr.predict_proba(X)[:,1]<0.4)*1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值