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