逻辑斯蒂回归分类算法
首先来看一个线性回归来进行分类的问题: 怎样判断肿瘤是否恶性?
很明显线性回归用于分类问题无法处理边界点的位置。
同时,线性回归健壮性不够,一旦有噪声,立刻“投降”
使用逻辑斯蒂回归 —— 分类问题
Sigmoid函数(压缩函数)
sigmoid函数中,e-z 中 z 的正负决定了 g(z) 的值最后是大于 0.5 还是小于 0.5;即 z 大于 0 时,g(z) 大于 0.5,z 小于 0 时,g(z)小于 0.5
当 z 对应的表达式为分类边界时,恰好有分类边界两侧对应 z 正负不同,也就使得分类边界两边分别对应 g(z)>0.5 和 g(z)<0.5,因此根据 g(z) 与 0.5 的大小关系,就可以实现分类
来看两个示例:
我们将线性回归拟合出来的值用压缩函数进行压缩,压缩完成后用 0.5 做一个概率的判定边界,就能把样本分成两类,即正样本和负样本
逻辑斯谛回归损失函数
- 平方损失函数的问题
如果使用梯度下降法求解算法可能无法得到全局最优解,最小二乘法求解不适用于多元函数。
我们期待的损失函数为一个凸函数,可以使用梯度下降求解最优质值。
考虑到对数函数中可以根据零点将数据定义划分为正类和负类:
因此,在逻辑回归分类算法中,我们的损失函数定义如下:
因此,在逻辑回归分类算法中,我们的损失函数定义如下:
梯度下降法求解
代码案例
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_iris
import matplotlib as mpl
import matplotlib.pyplot as plt
if __name__ == "__main__":
#引入sklearn里面的数据集,iris鸢尾花
iris = load_iris()
df = pd.DataFrame(data = iris.data, columns = iris.feature_names)
df['class'] = iris.target
df['class'] = df['class'].map({
0:iris.target_names[0], 1:iris.target_names[1], 2:iris.target_names[2]})
#path = 'iris.data'
#data = pd.read_csv(path, header=None)
#对类别进行编码
df[4] = pd.Categorical(data[4]).codes
#划分训练集测试集
x,y = np.split(data.values, (4,), axis=1)
x = x[:, :2]
#创建训练模型
lr = Pipeline( [('sc',StandardScaler()),('poly',PolynomialFeatures(degree=2)),('clf',LogisticRegression())] )
lr.fit(x, y.ravel())
y_hat = lr.predict(x)
y_hat_prob = lr.predict_proba(x)
np.set_printoptions(suppress=True)
#print('y_hat = \n', y_hat)
#print('y_hat_prob = \n', y_hat_prob)
print('准确率:%.2f%%' % (100 * np.mean(y_hat == y.ravel())))
# 画图
N, M = 500, 500 # 横纵各采样多少个值
x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围
x2_min, x2_max = x[:, 1].min(), x[:, 1].max() # 第1列的范围
t1 = np.linspace(x1_min, x1_max, N)
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2) # 生成网格采样点
x_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点
mpl.rcParams['font.sans-serif'] = ['simHei']
mpl.rcParams['axes.unicode_minus'] = False
y_hat = lr.predict(x_test) # 预测值
y_hat = y_hat.reshape(x1.shape) # 使之与输入的形状相同
plt.figure(facecolor='w')
plt.pcolormesh(x1, x2, y_hat) # 预测值的显示
plt.scatter(x[:, 0], x[:, 1], c=np.squeeze(y), s=50) # 样本的显示
plt.xlabel('花萼长度', fontsize=14)
plt.ylabel('花萼宽度', fontsize=14)
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.grid()
plt.title("Logistic回归-鸢尾花", fontsize=17)
plt.show()
转载:https://blog.csdn.net/weixin_42796403/article/details/113815647
查看评论