找回密码
 会员注册
查看: 40|回复: 0

Logistic回归(逻辑回归)及python代码实现

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
73539
发表于 2024-9-3 22:30:09 | 显示全部楼层 |阅读模式
文章目录Logistic(LogisticRegression,LR)回归原理讲解参数计算python代码实现生成数据集不使用其他库实现定义激活函数(标准Logistic函数即Sigmoid函数)定义LogisticRegression类调用LogisticRegression类解决分类问题使用sklearn库拓展Logistic(LogisticRegression,LR)回归原理讲解在模式识别问题中,所关心的量是分类,比如是否会患有某种疾病,这时就不能用简单的线性回归来完成这个问题了。为了解决次问题,我们引入了非线性激活函数g:RD→(0,1)g:{\mathbbR}^D\to(0,1)g:RD→(0,1)来预测类别标签的后验概率p(y=1∣x)p(y=1|\bfx)p(y=1∣x),其中y∈{0,1}y\in\{0,1\}y∈{0,1},函数ggg的作用是把线性函数的值域从实数区间挤压到0和1之间在Logistic回归中,激活函数的表达式为:σ(x)=11+e−x\sigma(x)=\frac{1}{1+e^{-x}}σ(x)=1+e−x1​标签y=1y=1y=1的后验概率为p(y=1∣x)=σ(wTx)=11+e−wTx⋯(1)p(y=1|{\bfx})=\sigma({\bfw}^{\rmT}{\bf{x}})=\frac{1}{1+e^{-{\bfw}^{\rmT}{\bf{x}}}}\cdots(1)p(y=1∣x)=σ(wTx)=1+e−wTx1​⋯(1)这里,x=[x1,⋯ ,xD,1]T{\bfx}=[x_1,\cdots,x_D,1]^{\rmT}x=[x1​,⋯,xD​,1]T和w=[w1,⋯ ,wD,b]T{\bfw}=[w_1,\cdots,w_D,b]^{\rmT}w=[w1​,⋯,wD​,b]T分别为D+1维的增广特征向量与增广权重向量标签y=0y=0y=0的后验概率为p(y=0∣x)=1−p(y=1∣x)=e−wTx1+e−wTxp(y=0|{\bfx})=1-p(y=1|{\bfx})=\frac{e^{-{\bfw}^{\rmT}{\bf{x}}}}{1+e^{-{\bfw}^{\rmT}{\bf{x}}}}p(y=0∣x)=1−p(y=1∣x)=1+e−wTxe−wTx​对式(1)进行变换后得到wTx=log⁡p(y=1∣x)1−p(y=1∣x)=log⁡p(y=1∣x)p(y=0∣x){\bfw}^{\rmT}{\bf{x}}=\log\frac{p(y=1|{\bfx})}{1-p(y=1|{\bfx})}=\log\frac{p(y=1|{\bfx})}{p(y=0|{\bfx})}wTx=log1−p(y=1∣x)p(y=1∣x)​=logp(y=0∣x)p(y=1∣x)​上式左边为线性函数,右边为正反后验概率比值(几率)取对数,因此Logistic回归也称为对数几率回归参数计算LR采用交叉熵作为损失函数,使用梯度下降进行优化假设存在N个训练样本{(x(n),y(n))}n=1N\{({\bfx}^{(n)},y^{(n)})\}_{n=1}^N{(x(n),y(n))}n=1N​,采用LR回归模型对每个样本x(n){\bfx}^{(n)}x(n)进行预测,输出其标签为1的后验概率,记为y^(n){\haty}^{(n)}y^​(n),即y^(n)=σ(wTx(n)),1≤n≤N{\haty}^{(n)}=\sigma({\bfw}^{\rmT}{\bf{x}}^{(n)}),1\leqn\leqNy^​(n)=σ(wTx(n)),1≤n≤N由于y(n)∈{0,1}y^{(n)}\in\{0,1\}y(n)∈{0,1},样本(x(n),y(n))({\bfx}^{(n)},y^{(n)})(x(n),y(n))的真实条件概率可以表示为pr(y(n)=1∣x(n))=y(n),p_r(y^{(n)}=1|{\bfx}^{(n)})=y^{(n)},pr​(y(n)=1∣x(n))=y(n),pr(y(n)=0∣x(n))=1−y(n)p_r(y^{(n)}=0|{\bfx}^{(n)})=1-y^{(n)}pr​(y(n)=0∣x(n))=1−y(n)采用交叉熵损失函数,其风险函数为R(w)=−1N∑n=1N(pr(y(n)=1∣x(n))log⁡y^(n)+pr(y(n)=0∣x(n))log⁡(1−y^(n)))=−1N∑n=1N(y(n)log⁡y^(n)+(1−y(n))log⁡(1−y^(n))){\mathcalR}({\bfw})=-\frac{1}{N}\sum_{n=1}^N\left(p_r(y^{(n)}=1|{\bfx}^{(n)})\log{\haty}^{(n)}+p_r(y^{(n)}=0|{\bfx}^{(n)})\log(1-{\haty}^{(n)})\right)\\=-\frac{1}{N}\sum_{n=1}^N\left(y^{(n)}\log{\haty}^{(n)}+(1-y^{(n)})\log(1-{\haty}^{(n)})\right)R(w)=−N1​n=1∑N​(pr​(y(n)=1∣x(n))logy^​(n)+pr​(y(n)=0∣x(n))log(1−y^​(n)))=−N1​n=1∑N​(y(n)logy^​(n)+(1−y(n))log(1−y^​(n)))风险函数关于参数w\bfww的偏导数为∂R(w)∂w=−1N∑n=1N(y(n)y^(n)(1−y^(n))y^(n)x(n)−(1−y(n))y^(n)(1−y^(n))1−y^(n)x(n))=−1N∑n=1N(y(n)(1−y^(n))x(n)−(1−y(n))y^(n)x(n))=−1N∑n=1Nx(n)(y(n)−y^(n))\frac{\partial{\mathcalR}({\bfw})}{\partial{\bfw}}=-\frac{1}{N}\sum_{n=1}^N\left(y^{(n)}\frac{{\haty}^{(n)}(1-{\haty}^{(n)})}{{\haty}^{(n)}}{\bfx}^{(n)}-(1-y^{(n)})\frac{{\haty}^{(n)}(1-{\haty}^{(n)})}{1-{\haty}^{(n)}}{\bfx}^{(n)}\right)\\=-\frac{1}{N}\sum_{n=1}^N\left(y^{(n)}(1-{\haty}^{(n)}){\bfx}^{(n)}-(1-y^{(n)}){\haty}^{(n)}{\bfx}^{(n)}\right)\\=-\frac{1}{N}\sum_{n=1}^N{\bfx}^{(n)}(y^{(n)}-{\haty}^{(n)})∂w∂R(w)​=−N1​n=1∑N​(y(n)y^​(n)y^​(n)(1−y^​(n))​x(n)−(1−y(n))1−y^​(n)y^​(n)(1−y^​(n))​x(n))=−N1​n=1∑N​(y(n)(1−y^​(n))x(n)−(1−y(n))y^​(n)x(n))=−N1​n=1∑N​x(n)(y(n)−y^​(n))由此我们可以采用梯度下降法更新参数最终得到合适的参数w\bfwwpython代码实现生成数据集我们通过下面的代码自行生成一个样本数量为100的数据集importnumpyasnpimportmatplotlib.pyplotasplt#设置随机种子,以便结果可复现np.random.seed(42)#生成随机数据#两个特征的均值和方差mean_1=[2,2]cov_1=[[2,0],[0,2]]mean_2=[-2,-2]cov_2=[[1,0],[0,1]]#生成类别1的样本X1=np.random.multivariate_normal(mean_1,cov_1,50)y1=np.zeros(50)#生成类别2的样本X2=np.random.multivariate_normal(mean_2,cov_2,50)y2=np.ones(50)#合并样本和标签X=np.concatenate((X1,X2),axis=0)y=np.concatenate((y1,y2))#绘制散点图plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Set1,edgecolor='k')plt.xlabel('Feature1')plt.ylabel('Feature2')plt.title('LogisticRegressionDataset')plt.show()12345678910111213141516171819202122232425262728293031'运行运行运行结果如下图所示图中,类别1为右上部分,标签为0;类别2为左下部分,标签为1不使用其他库实现定义激活函数(标准Logistic函数即Sigmoid函数)defsigmoid(x):ifx>0:return1.0/(1.0+np.exp(-x))else:returnnp.exp(x)/(1.0+np.exp(x))12345'运行运行定义LogisticRegression类classLogisticRegression:def__init__(self,learning_rate=0.01,num_iterations=1000):self.learning_rate=learning_rateself.num_iterations=num_iterationsself.weights=Noneself.bias=Nonedeffit(self,X,y):num_samples,num_features=X.shape#初始化权重和偏置self.weights=np.zeros(num_features)self.bias=0#梯度下降for_inrange(self.num_iterations):linear_model=np.dot(X,self.weights)+self.biasy_pred=sigmoid(linear_model)dw=(1/num_samples)*np.dot(X.T,(y_pred-y))db=(1/num_samples)*np.sum(y_pred-y)self.weights-=self.learning_rate*dwself.bias-=self.learning_rate*dbdefpredict_prob(self,X):linear_model=np.dot(X,self.weights)+self.biasy_pred=sigmoid(linear_model)returny_preddefpredict(self,X,threshold=0.5):y_pred_prob=self.predict_prob(X)y_pred=np.zeros_like(y_pred_prob)y_pred[y_pred_prob>=threshold]=1returny_pred1234567891011121314151617181920212223242526272829303132333435'运行运行调用LogisticRegression类解决分类问题#创建Logistic回归模型logreg=LogisticRegression()#训练模型logreg.fit(X,y)#预测样本X_new=np.array([[2.5,2.5],[-6.0,-4.0]])y_pred_prob=logreg.predict_prob(X_new)y_pred=logreg.predict(X_new)print("PredictedProbabilities:",y_pred_prob)print("PredictedLabels:",y_pred)12345678910111213输出结果为预测样本1(2.5,2.5)位于右上部分属于类别1,真实标签为0;预测样本2(-6,-4)位于左下部分属于类别2,真实标签为1,对比输出结果可知,该分类器已训练得合适参数,可完成分类任务使用sklearn库我们可以通过使用sklearn库来简洁地实现LRimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportaccuracy_score#所使用数据集同上X,y#划分训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)#创建Logistic回归模型logreg=LogisticRegression()#训练模型logreg.fit(X_train,y_train)#预测测试集y_pred=logreg.predict(X_test)#计算预测准确率accuracy=accuracy_score(y_test,y_pred)print("Accuracy:",accuracy)1234567891011121314151617181920212223最终测试集上计算得到的准确率accuracy为1,可见该分类器的效果非常好拓展logistic回归可以用于分类非线性可分的数据。尽管logistic回归本身是一个线性分类器,但可以通过引入多项式特征、交互特征、组合特征等方法来扩展其能力,从而处理非线性的分类问题。具体来说,可以通过特征工程的方式将原始特征进行变换,以引入非线性关系。例如,可以通过添加多项式特征,将原始特征的高阶项加入到模型中,例如原始特征的平方项、立方项等。还可以引入交互特征,将不同特征之间的乘积或分割点(例如,做差或做除)作为新的特征。通过引入这些非线性特征,logistic回归可以更好地捕捉到数据中的非线性关系,从而能够更好地分类非线性可分的数据。需要注意的是,在引入非线性特征时,可能需要进行正则化或其他模型调优技巧,以避免过拟合问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-13 07:27 , Processed in 1.292634 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表