线性回归和分类问题

线性回归

首先,我们知道线性回归的模型为:
在这里插入图片描述
而线性回归求解其实就是权重的最优解。

普通最小二乘法(OLS)

普通最小二乘法是计算权重的方法之一。
OLS可以最小化因变量实际值和模型得出的预测值之间的均方误差:
在这里插入图片描述

那么要解决最小化问题,就要求出上式的导数,并求出导数等于0时,权重W的值,这涉及到矩阵求导公式
在这里插入图片描述
令导数等于0:
在这里插入图片描述
可以说,根据高斯-马尔可夫定理,模型参数的OLS估计是所有线性无偏估计中最优的,即通过OLS估计可以获得最低的方差。

极大似然估计

这篇文章讲得特别好

极大似然估计在统计学中是参数估计的方法之一,“模型已知,参数未定”,利用已知的样本结果,反推出最有可能导致这个结果的参数值,要注意的是,极大似然估计的样本集中的样本都是独立同分布,只有独立同分布才能保证联合概率密度展开成边缘概率密度的乘积。
似然函数:给定输出x时,关于θ的似然函数L(θ|x)在数值上等于给定参数θ后变量x的概率:L(θ|x)=P(X=x|θ)(X可取得值为x1,x2,…。是观测值,这是对于离散型的;关于连续型,某点概率应为f(xi)dxi,研究的问题是θ取何值时,样本出现的概率最大,但由于dxi不参与讨论,所以连续型的似然函数是L(θ)=∏f(xi;θ),即下图所示的似然函数)。最大似然估计是似然函数最初也是最自然的应用。
极大似然估计的做法是:

  1. 写出似然函数,一般是概率密度函数(还有离散型的)。
  2. 选取似然函数的对数,并整理。
  3. 求导数,并解似然方程

在这里插入图片描述
极大似然估计就是求解能使l(θ)取得最大值的θ值,θ称为极大似然估计值。

现在从概率论的角度来看线性回归,模型和上面的线性回归模型一样。
并假定随机误差符合均值为0的正态分布:
在这里插入图片描述
所以线性模型改写为:
在这里插入图片描述
在这里插入图片描述
所以,可以转化为如下形式:
在这里插入图片描述
所以y的概率密度函数可以表示如下:
在这里插入图片描述
所以似然函数如下(似然函数在数值上等于联合概率密度函数):
在这里插入图片描述
求对数:
在这里插入图片描述
解微分方程:
在这里插入图片描述
在这里插入图片描述
直到上图的最后一步,这个公式已经很眼熟了,这就是我们的损失函数。所以,当随机误差符合正态分布时,可以利用上式求解w。

线性分类器

我们知道,线性分类所用的模型如下(这里使用sign函数,也可以选择别的函数):
在这里插入图片描述
逻辑回归除了可以进行分类之外,还可以预测样本xi为[+]类的概率为p+
在这里插入图片描述

最大似然估计和逻辑回归

将样本分配为[+]的分类逻辑回归模型:
P+(xi)=P(yi=1|xi,W)=σ(WTxi)
将样本分类为[-]的表达式:
P-(xi)=P(yi=-1|xi,W)=1-σ(WTxi)=σ(-WTxi)
上面两式可以合为:
P(y=yi|xi,W)=σ(yiWTxi)

表达式M(xi)=yiWTxi称为目标xi的分类边缘,若表达式的值为正,则分类正确,若表达式的值为负,则分类错误。

计算数据集的似然,假设目标来自于一个独立分布的数据集,则可建立如下式子:
在这里插入图片描述
对似然函数取对数并进行整理如下:
在这里插入图片描述
那么最大化似然函数也就是最小化下式:
在这里插入图片描述
这也是逻辑回归的损失函数。

sklearn库的LogisticRegressionCV()模型的使用

from sklearn.linear_model import LogisticRegression, LogisticRegressionCV
# LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用了交叉验证来选择正则化系数C。
# 而LogisticRegression需要自己每次指定一个正则化系数。
from sklearn.model_selection import StratifiedKFold
# StratifiedKFold的作用是划分数据集,划分后的训练集和数据集种类别比例尽量和原数据集一样

logit = LogisticRegression(C=1, random_state=17)
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=17)
c_values = np.logspace(-2, 3, 500)
print(c_values)
logit_searcher = LogisticRegressionCV(Cs=c_values, cv=skf, verbose=1, n_jobs=-1)

# 使用make_pipeline创建管道,和Pipeine区别开来,Pipeine创建管道时要为每一步操作提供一个名称
from sklearn.pipeline import make_pipeline
# 这里先对CountVectorizer()函数表示对数据集文本中的词语转化为词频矩阵
text_pipe_logit = make_pipeline(CountVectorizer(),
                                LogisticRegression(solver='lbfgs',
                                                   n_jobs=1,
                                                   random_state=7))

text_pipe_logit.fit(text_train, y_train)

验证曲线

验证曲线和学习曲线的区别:
验证曲线的横坐标是某个超参数,比如决策树模型中max_depth,从验证曲线可以看出使用不同的超参数时模型的拟合情况,当然要注意的是,不能只使用训练集的测试结果来验证不同超参数优劣,因为这不能代表当前模型的泛化能力。所以一般选择将数据集分为三个部分,train、validation和test,在训练集上训练模型,在validation验证集上调参,在测试集上衡量模型的泛化能力。所以当数据集比较大时,可以将数据集分为三部分,在数据集比较小时,可以使用交叉验证,并留一部分test数据集。

validation_curve的使用

让一个模型更优秀的方法有很多,比如使用更复杂的特征、选用合适的正则化参数(使用交叉验证来选择合适的参数)
但如果模型的质量不佳,我们可以可视化学习曲线来观察使用不同的参数(如正则化参数)时的模型的效果:

from sklearn.model_selection import validation_curve, learning_curve
alphas = np.logspace(-2, 0, 20)
# 验证曲线validation_curve(),
# 各参数含义:要进行验证的模型名称,特征变量,目标变量,要调参的超参数名称,参数范围,使用k折交叉验证,要返回的分数类型
train_score, test_score = validation_curve(logit_pipe, X, y, 'sgd_logit__alpha', alphas, cv=5, scoring='roc_auc')

# 画出验证曲线
plt.plot(alphas , train_score, '-', label='train_score')
plt.plot(alphas , test_score , '-', label='test_score ')

学习曲线

一般来说,数据集的数量越大,模型的训练效果越好。学习曲线就是通过改变训练集的大小,来探究模型的质量和训练集大小之间的关系。

from sklearn.model_selection import learning_curve

train_sizes = np.linspace(0.05, 1, 20)
# 函数的返回值train_sizes_abs:用于生成学习曲线的训练集数目,train_score:训练集得分,test_score:测试集得分。
# learning_curve函数各参数意义:模型对象,特征变量,目标变量,train_sizes:训练集的相对数量,
# 其值要在(0, 1]之间,使用k折交叉验证,返回的分数类型
train_sizes_abs, train_score, test_score = learning_curve(logit_pipe, X, y, train_sizes=train_sizes, cv=5, scoring='roc_auc')

# 同样的,可以画出学习曲线。

在这里插入图片描述
这样一个学习曲线表明,当训练集的数据比较小时,训练集和交叉验证集之间的误差较大,出现了过拟合现象,当数据集的数量比较大时,训练集和交叉验证集之间的误差收敛(无论怎么改变训练集和交叉验证集的数量,模型的分数之间的差别都不是很大),这表示欠拟合的现象,所以,当模型已经出现了欠拟合的现象,如果不改变模型的复杂度,无论怎样增大训练集,模型的拟合效果都不会有很好地提升。

构造验证曲线和学习曲线能够帮助我们选择合适的超参数。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值