逻辑回归原理介绍+决策边界

tech2025-02-01  15

损失函数:

真实为 1 就应该 sigmoid 尽量大 真实为 0 就应该1- sigmoid 尽量大 此种情况下损失函数尽可能小

绘制损失函数图像:编程实现:

#绘制损失函数图像 公式上面z 代表损失函数 ,在(0,1)之间 #二分类 类别y 不是 1 就是 0 import numpy as np import matplotlib.pyplot as plt #字体切换为中文 plt.rcParams["font.family"] = 'SimHei' plt.rcParams["font.size"] = 12 s = np.linspace(0.01,0.99,200) for y in [0,1]: yy = -y * np.log(s)-(1-y) * np.log(1-s) plt.plot(s,yy,label = f'y={y}') plt.legend() plt.xlabel("sigmoid(z)") plt.ylabel("j(w)") plt.title("损失函数与sigmoid")

图像解读: 真实为1 的时候 黄线 输出的 sigmoid 就是表示1 的概率 所以损失函数会逐渐变小

损失函数不同 。 逻辑回归实际是分类问题 在引入多项式特征 ,线性回归可以处理 非线性问题

逻辑回归解决二分类问题:…

#逻辑回归实现二分类 : from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from matplotlib import pyplot as plt import warnings warnings.filterwarnings("ignore") from sklearn.model_selection import train_test_split iris = load_iris() iris X = iris.data y = iris.target #这里做二分类: #鸢尾花有三个特征 去除一个特征 ##X,Y 要匹配,所有要对X进行行列选择 ,鸢尾花有4个特征,此处只选择两个特征 #选出y!=0 的行 X = X [y!=0 ,2:] y = y [y != 0 ] #习惯将剩下的两类 一个记为0 一个记为 1 y [y == 1] = 0 y [y == 2] = 1 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 0) lr = LogisticRegression() lr.fit(X_train,y_train) print("权重:",lr.coef_) print("偏置:",lr.intercept_) print("真实值:",y_test) print("预测值:",lr.predict(X_test) ) #可以根据权重写出回归方程

#分类的结果分布 X1 = X[y == 0] X2 = X [y == 1] plt.rcParams["font.family"] = 'SimHei' #分别获取到属于不同类别的 花瓣长度和花瓣宽度,就可以得到样本分布了 plt.scatter(X1[:,0],X1[:,1],c = 'r',label= '类别0') plt.scatter(X2[:,0],X1[:,1],c = 'g',label= '类别1') plt.legend() plt.xlabel("花瓣长度") plt.ylabel("花瓣宽度") plt.title("花瓣的样本分布")

分类的结果可视化:

#绘制分类结果类别可视化 index = np.arange(len(X_test) ) #一开始仅仅写成len(),当然是不对的 plt.figure(figsize=(10,10)) #linestyle 线的格式 ,ms :折点的大小 #注意x,y 的维度 plt.plot(index,y_test,c ='g',marker= 'o',linestyle = '',ms = '15',label = '真实类型') plt.plot(index,lr.predict(X_test),c ='r',linestyle = '',marker= 'x',ms ='15' ,label = '预测类型') plt.legend() plt.title("逻辑回归预测结果") plt.xlabel("样本序号") plt.ylabel("类别")

分类概率并绘制堆叠图:

#获取逻辑回归的概率值 probility = lr.predict_proba(X_test) print(probility) #返回概率值较大的那一列的索引,此为二分类那么就是 0 或者1 np.argmax(probility,axis= 1) #绘制堆叠图 index = np.arange(len(X_test)) plt.bar(index,probility[:,0],color = 'b',label = '0的概率') #如果预测值和真实值一致那么就是 圈 不一致那就是X tick_label = np.where(y_test == lr.predict(X_test),"0",'X') plt.bar(index,probility[:,1],bottom=probility[:,0],color = 'g',label = '1的概率',tick_label = tick_label) #图例放在表格的外面 plt.legend(loc = 'best',bbox_to_anchor=(1,1))

numpy.meshgrid()理解

链接: https://blog.csdn.net/lllxxq141592654/article/details/81532855.

https://blog.csdn.net/lllxxq141592654/article/details/81532855

绘制决策边界

#绘制决策边界: from matplotlib.colors import ListedColormap def plot_decision_boundary(model,X,y): color = ["r","g","b"] marker = ["o","v","x"] #标签去重,得到具体有几类 class_label = np. unique(y) #选择会用到的颜色列表 camp =ListedColormap(color[ : len(class_label)]) #二分类下有两列 按列去各列的最小值 x1_min,x2_min = np.min(X,axis = 0) #二分类下有两列 按列去各列的最大值 x1_max,x2_max = np.max(X,axis = 0) #防止贴着边界 x1 = np.arange(x1_min -1 ,x1_max + 1,0.02) x2 = np.arange(x2_min -1 ,x2_max + 1,0.02) X1,X2 = np.meshgrid(x1 , x2) #转置是因为 [X1.ravel(),X2.ravel()]这里是2行 n列 转置变成 n行2列 Z = model.predict(np.array ( [X1.ravel(),X2.ravel()] ).T ).reshape(X1.shape) #绘制使用颜色填充的等高线: plt.contourf(X1,X2,Z,camp = camp,alpha =0.5 ) #设置透明度 ,背景色不能和分类的颜色相同,不然覆盖了 for i ,class_ in enumerate(class_label) : plt.scatter(x = X[y == class_,0] , y = X[y == class_, 1 ] , c =camp.colors[i] ,marker = marker[i],label = class_) plt.legend() plt.show()

为了画决策边界, 都是两个特征

决策边界可以在一定程度帮我们查看模型是否过于复杂了,过拟合问题

最新回复(0)