逻辑回归实验分析(鸢尾花数据集,二分类,多分类)

本文介绍了逻辑回归中的Sigmoid函数在二分类任务中的应用,通过实例演示了如何使用鸢尾花数据集进行分类,并展示了概率结果随特征数值变化的过程。此外,还讨论了多分类问题中的softmax和交叉熵损失函数。
摘要由CSDN通过智能技术生成

目录

一、逻辑回归的实验分析

  1. 引入包

 2. sigmoid函数

 3. 鸢尾花数据集

 4. 公式推导

二、概率结果随特征数值的变化 

三、坐标棋盘的制作

四、多分类问题 ,softmax


一、逻辑回归的实验分析

        回归是如何变成分类的呢?参考逻辑回归(Logistic regression算法原理讲解)逻辑回归代码实现

        之前在线性回归中,得到具体的回归值,如果此时任务要做一个二分类怎么办呢?即如果可以将回归值转换为对应的区间,这样就可以完成分类任务了。

        逻辑回归中借助Sigmoid函数完成了数值映射,通过概率值比较来完成分类任务。

  1. 引入包

import os
import numpy as np
import matplotlib
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings
warnings.filterwarnings('ignore')

 2. sigmoid函数

t = np.linspace(-20,20,10000)
sigmoid = 1/(1+np.exp(-t))
plt.figure(figsize=(10,5))
plt.plot([-20,20],[0,0],'k-')
plt.plot([-20,20],[0.5,0.5],'k:')
plt.plot([-20,20],[1,1],'k:')
plt.plot(t,sigmoid,'b-',linewidth = 2, label = r"$\sigma=\frac{1}{1+e^{-t}}$")
plt.xlabel('t')
plt.ylabel('proba')
plt.legend(loc='upper left',fontsize = 20)
plt.axis([-20,20,-0.1,1.1])
plt.title('Figure logistic function')
plt.show()

        3. 鸢尾花数据集

                鸢尾花数据集 3种标签 4个特征 花瓣花萼的长和宽 

#加载数据集
from sklearn.datasets import load_iris
iris = load_iris()
print(iris['DESCR'])

        4. 公式推导

        类别定义:\hat{y} =\begin{Bmatrix} 0 ,if \;\hat{p} < 0.5 \\ 1 ,if \;\hat{p} > 0.5 \end{Bmatrix}   损失:c(\theta) = \left\{\begin{matrix} -log(\hat{p})\;if \; y =1\\ -log(1-\hat{p})\;if \; y =0 \end{matrix}\right.

        损失函数:J(\theta)=-\frac{1}{m}\sum_{i=1}^{n}(y_ilog(\hat{p}^{(i)})+(1-y_i)log(1-\hat{p}^{(i)}))

        梯度计算:\frac{\partial }{\partial _{\theta_j}}J(\theta)=-\frac{1}{m}\sum_{i=1}^{n}(y_i-\alpha(\theta^Tx_i))x_i^j

二、概率结果随特征数值的变化 

#先是二分类 把Virginica种类打上标签为1 其它的为0,先做一个二分类
X = iris['data'][:,3:]
print(X.min())
print(X.max())
y = (iris['target'] == 2).astype(np.int_)
print(y)

 

         这里先做一个传统的二分类任务,先是二分类 把Virginica种类打上标签为1 其它的为0,先做一个二分类

from sklearn.linear_model import LogisticRegression
log_res = LogisticRegression()
log_res.fit(X,y)
#预测
X_new = np.linspace(0,3,1000).reshape(-1,1)
y_proba = log_res.predict_proba(X_new)
print(y_proba)

        直接把概率算出来,前面不是Virginica这种花的概率,后者是Virginica这种花的概率

plt.figure(figsize=(10,5))
decision_boundary_1 = X_new[y_proba[:,1] >= 0.5][0]
print(decision_boundary_1)
decision_boundary = np.append(decision_boundary_1,decision_boundary_1)
print(decision_boundary)
plt.plot(decision_boundary,[-1,2],'k:',linewidth = 2)
plt.plot(X_new,y_proba[:,1],'g-',label = 'Virginica')
plt.plot(X_new,y_proba[:,0],'b-',label = 'not-Virginica')
#plt.axis[0,3,-0.02,1.02]
plt.legend(loc = 'center left',fontsize = 14)
plt.xlabel('peta width')
plt.ylabel('proba')
plt.arrow(decision_boundary_1[0],0.08,-0.3,0,head_width = 0.05,head_length = 0.1,fc='b',ec='b')
plt.arrow(decision_boundary_1[0],0.92,0.3,0,head_width = 0.05,head_length = 0.1,fc='g',ec='g')
plt.text(decision_boundary_1[0]+0.02,0.15,'Decision Boundary',fontsize = 14,color = 'k',ha = 'center')
plt.show()

        我们能看到随着peta width这个特征值越大,是Virginica这个种类的花概率越大。

三、坐标棋盘的制作

        制作出像棋盘一样的图形,有两个特征,选择petal length , petal width这两种。

 x0,x1分别代表棋盘的横纵格子数,那么一共有200X500个,就像像素点。

#坐标棋盘制作
X = iris['data'][:,(2,3)]
y = (iris['target'] == 2).astype(np.int_)
from sklearn.linear_model import LogisticRegression
log_res = LogisticRegression(C=1000) #加入正则化
log_res.fit(X,y)
#构建坐标数据
x0,x1 = np.meshgrid(np.linspace(0.9,7,500),np.linspace(0.8,2.7,200))
X_new = np.c_[x0.ravel(),x1.ravel()]
y_proba = log_res.predict_proba(X_new)

plt.figure(figsize=(10,4))
plt.plot(X[y== 0,0],X[y == 0,1],'bs')
plt.plot(X[y== 1,0],X[y == 1,1],'g^')
#print(x0.shape())
zz = y_proba[:,1].reshape(x0.shape)
contour = plt.contour(x0,x1,zz,cmap = plt.cm.brg) # 等高线

plt.clabel(contour,inline = 1)
plt.axis([2.9,7.0,0.8,2.7])
plt.text(3.5,1.75,'Not Virginica',fontsize= 12,color = 'b')
plt.text(4.9,2.5,'Virginica',fontsize= 12,color = 'g')
plt.show()

四、多分类问题 ,softmax

        softmax计算概率:\hat{p}_k= \alpha s(x)_k = \frac{e^{s_{k}(x)}}{\sum_{j=1}^{k}e^{s_j(x)}}

        损失函数(交叉熵):J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{k}y_{k}^{i}log(\hat{p}_k^{i})

#多分类问题 softmax
X = iris['data'][:,(2,3)]
y = iris['target']
softmax_reg = LogisticRegression(multi_class='multinomial',solver='lbfgs')
softmax_reg.fit(X,y)
print(softmax_reg.predict_proba([[5,2]]))
x0,x1 = np.meshgrid(
    np.linspace(0,8,500).reshape(-1,1),
    np.linspace(0,3.5,200).reshape(-1,1))
X_new = np.c_[x0.ravel(),x1.ravel()]

y_proba = softmax_reg.predict_proba(X_new)
y_predict = softmax_reg.predict(X_new)
 
zz1 = y_proba[:,1].reshape(x0.shape)
zz = y_predict.reshape(x0.shape)

plt.figure(figsize=(10,4))
plt.plot(X[y== 2,0],X[y == 2,1],'g^',label = 'Iris-Virginica')
plt.plot(X[y== 1,0],X[y == 1,1],'bs',label = 'Iris-Versicolor')
plt.plot(X[y== 0,0],X[y == 0,1],'yo',label = 'Iris-Setosa')

from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])

plt.contourf(x0,x1,zz,camp=custom_cmap)
contour = plt.contour(x0,x1,zz1,cmap=plt.cm.brg)
plt.clabel(contour,inline = 1, fontsize = 12)
plt.xlabel('Petal length',fontsize = 14)
plt.ylabel('Petal width',fontsize = 14)
plt.legend(loc = 'center left',fontsize = 14)
plt.axis([0,7,0,3.5])
plt.show()

 

把三种概率都算出来了

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值