分类和逻辑回归(Classification and logistic regression)

本文探讨了逻辑回归在二项分类问题中的应用,通过引入逻辑函数解决了传统线性回归模型在分类任务上的不足,并推导了其最大似然估计的求解过程。

这一章将主要讨论分类问题,相比于回归问题,分类问题的预测值y并非连续的数,而是一些离散的数值。现在我们会集中在二项分类问题(即只有0和1两个值),二项问题中的结论大部分都可以推广到多类问题中。比如,我们要构造一个垃圾邮件分类器,x(i)表示电子邮件的一些特征,y=1代表垃圾邮件,y=0则不是。

5 逻辑回归

如果解决分类问题时先忽略y是离散值得限定,用老的线性回归方法去拟合曲线就会发现构造的模型表现很差。直观来说,当我们知道y{0,1}时,假设函数hθ(x)预测超过1或小于0的情况,都是没有意义的。

为了达到这个目标,我们需要变换hθ(x)的形式:

hθ(x)=g(θTx)=11+eθTx,

其中:

g(z)=11+ez

被称为逻辑函数或sigmoid函数,下面是一个逻辑函数的曲线图:
sigmoid function

逻辑函数的值域就在(0,1)之间,除此以外逻辑函数还有一个很优秀的性质就是方便求导:

g(z)=ddz 11+ez=1(1+ez)2(ez)=1(1+ez)(11(1+ez))=g(z)(1g(z)).

对当前的回归模型,我们应该如何选择参数θ呢?接下来我们会证明在一系列概率假设后,最小方差回归会是这个模型的极大似然估计量。

我们不妨先假设,输出y为0或1的概率分别是:

P(y=1|x;θ)=hθ(x)P(y=0|x;θ)=1hθ(x)

则y的概率密度公式可写为:

p(y|x;θ)=(hθ(x))y(1hθ(x))1y

假设m个样本是独立生成的,我们可以写下它们的似然函数:

L(θ)=p(y⃗ |X;θ)=i=1mp(y(i)|x(i);θ)=i=1m(hθ(x(i)))y(i)(1hθ(x(i)))1y(i)

再化简为对数似然函数:

(θ)=logL(θ)=i=1m y(i)log h(x(i))+(1y(i))log(1h(x(i)))

我们应该如何求解极大似然?和之前的线性回归类似,我们可以使用梯度上升法。用向量标记表示我们每一步的更新:θ:=θ+αθ(θ)。我们先计算对数似然函数的梯度:

θj(θ)=(y1g(θTx)(1y)11g(θTx))θjg(θTx)=(y1g(θTx)(1y)11g(θTx))g(θTx)(1g(θTx))θjθTx=(y(1g(θTx))(1y)g(θTx))xj=(yhθ(x))xj

上面的推导中用到了g(z)=g(z)(1g(z))这一结论。那我们的随机梯度上升法:

θj:=θj+α(y(i)hθ(x(i)))x(i)j

如果把这个公式和LMS更新方法比较,会发现形式上几乎是一致的。但要注意它们不是同一种算法,因为这次的假设hθ(x)是以θTx为输入的非线性函数。但他们更新步骤上一致性,到底是一种巧合还是有某些深层原因呢?这点在后面的广义线性模型中会详细论述。

在Python中,实现分层逻辑斯谛回归通常会涉及到使用统计库如statsmodels或专门处理层次模型的库,如pymc3或PyStan。这里我们将使用`pandas`, `numpy`, `statsmodels` 来创建一个简单的例子。 首先,你需要安装必要的库,如果尚未安装可以使用pip: ```bash pip install pandas numpy statsmodels ``` 然后,你可以按照以下步骤进行: 1. 导入所需的库: ```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from statsmodels.discrete.discrete_model import Logit ``` 2. 准备数据,假设有一个包含分类变量的DataFrame,例如用户ID、性别、年龄等: ```python data = pd.read_csv('your_data.csv') # 替换为你的数据文件路径 X = data.drop('target_variable', axis=1) # 假设'target_variable'是你要预测的目标列 y = data['target_variable'] ``` 3. 划分训练集测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 4. 创建层次逻辑斯谛回归模型,如果你的数据中有层次结构(如用户ID),那么可以将这些特征作为类别变量,并设置为分组(grouped): ```python # 假设'model_id'是用户ID列 model = Logit(y_train, X_train[['model_id', 'sex', 'age']]) groups = {'model_id': range(len(model.endog.unique()))} # 给每个模型分配一个组编号 result = model.fit(method='bfgs', groups=groups) ``` 5. 预测: ```python y_pred = result.predict(X_test) ``` 6. 评估模型性能: ```python from sklearn.metrics import classification_report, confusion_matrix print(classification_report(y_test, y_pred)) ``` 请注意,这只是一个基本示例,实际应用中可能需要更复杂的预处理步骤以及更多的模型调整。此外,如果数据量大或者复杂性更高,你可能会选择使用更高级的工具,如PyMC3进行贝叶斯分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值