潜在的问题出现在可能会抛弃一部分数据,使得拟合效果不好,但是可以使得数据总体均衡
潜在的问题出现可能会复制部分数据进行填充,使得训练拟合的时候过度集中于被复制的数据的规律中。但也可以使得数据总体均衡
eg: 男生 * 权重2 = 女生 * 权重1
回归类的模型指标:
评估模型好坏,使用score, MSE, MAE 是对分类的评判
回归类的模型评估指标:
方法1 : 原始评估方法就是使用score来判断模型好坏。
方法2:加入了交叉验证,的MSE,MAE得到一个平均的score,这样的效果更好。
是否拟合到了足够的信息,使用R²
名字叫回归,实际上做分类。主要用于两分类问题
逻辑斯蒂回归的回归 - 过程
逻辑斯蒂的分类
逻辑斯蒂回归会生成0-1之间的连续数字 — 数字表示可能性
阈值 —> 阈值的作用:分类的判断
按照以往的方式,使用最小二乘法拟合广告渠道投入金额与顾客是否购买的关系,效果不佳
可能性:某件事情发生的可能性的大小
似然函数:某件事情已经发生,反推在什么条件下,发生这个事件的可能性最大
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()
三种方法:
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