sklearn实现逻辑回归并可视化决策边界(学习笔记)

逻辑回归

构建数据集

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression


def make_data():
    num_points = 200
    centers = [[1, 1], [2, 2]]  # 指定中心
    x, y = make_blobs(n_samples=num_points, centers=centers,
                      cluster_std=0.2, random_state=np.random.seed(10))

make_blobs 用于生成具有聚类特征的样本数据,通常用于测试聚类算法。centers中包含了两个聚类的中心点。

n_samples=200 表示将生成 200 个样本;centers=centers 指定了前面定义的中心点。

cluster_std=0.2表示每个聚类的标准差为 0.2,这将决定生成的样本点相对于中心点的散布程度。

random_state=np.random.seed(10)用于控制随机数生成,以确保每次运行时生成相同的数据

    index_pos, index_neg = (y == 1), (y == 0)
    plt.rcParams['ytick.direction'] = 'in'  # 刻度线方向向内
    plt.rcParams['xtick.direction'] = 'in'  # 刻度线方向向内
    x_pos, x_neg = x[index_pos], x[index_neg]

布尔索引数组 index_pos 和 index_neg分别用于标识标签为 1 和 0 的点。

在调用 make_blobs时,每个聚类将会被分配一个唯一的标签,标签y的范围是从 0 到 n_centers - 1,其中 n_centers是聚类的个数。

生成的 x 的维度取决于make_blobs 函数的 n_features 参数。如果不指定该参数,默认情况下它会生成 2 维的数据。

使用前面创建的布尔索引,从生成的数据 x 中提取出属于正类(标签为 1)和负类(标签为 0)的样本,分别存储在 x_pos 和 x_neg 中。

plt.rcParams 是 Matplotlib 的一个配置字典,允许用户修改全局绘图的默认参数。通过更改这些参数,用户可以在整个绘图会话中保持一致的样式设置,而不需要在每个绘图中重复设置。

    plt.scatter(x_pos[:, 0], x_pos[:, 1], marker='o', label='positive', c='black', s=50)
    plt.scatter(x_neg[:, 0], x_neg[:, 1], marker='s', label='negative', c='black', s=50)
    plt.legend(fontsize=15)
    plt.tight_layout()
    plt.show()
    return x, y

x_pos 和x_neg是二维数组,[:, 0] 选择所有行的第一列(x 坐标),[:, 1]选择所有行的第二列(y 坐标)。

正类样本点的标记形状为圆形,颜色为黑色,样本点的大小为 50

负类样本点的标记形状为方形('s'),颜色也为黑色,样本点的大小为 50

label属性为样本点设置标签,绘图时可用于图例显示。

  • plt.legend( ): 显示图例,图例会根据之前设置的标签(label)来显示正类和负类的标识。

  • fontsize=15: 设置图例文字的字体大小为 15。

  • plt.tight_layout(): 确保图形的各个元素之间有合理的间距。这通常用于避免标签和标题重叠。

可视化决策边界

def decision_boundary(x, y):
    ###########  模型求解并预测
    model = LogisticRegression()
    model.fit(x, y)
    pred = model.predict([[1, 0.5], [3, 1.5]])
    print("样本点(1,0.5)所属的类标为{}\n"
          "样本点(3,1.5)所属的类标为{}".format(pred[0], pred[1]))

    ###########  绘制决策面
    x_min, x_max = x[:, 0].min() - .5, x[:, 0].max() + .5
    y_min, y_max = x[:, 1].min() - .5, x[:, 1].max() + .5
    plt.rcParams['ytick.direction'] = 'in'  # 刻度向内
    plt.rcParams['xtick.direction'] = 'in'  # 刻度向内
    h = .02  # step size in the mesh
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    x_new = np.hstack([xx.reshape(-1, 1), yy.reshape(-1, 1)])
    Z = model.predict(x_new)
    Z = Z.reshape(xx.shape)
    plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired, shading='auto')
  • min() 和 max() 分别计算x和y特征的最小值和最大值。

  • 为了在图中留出一些边距,最小值减去 0.5,最大值加上 0.5,得到 x_min, x_max, y_min, y_max

  • h 代表网格的步长,即生成网格点之间的间隔。

  • meshgrid用来生成网格,生成的xx和yy形状相同,xx每一行都是一样的,yy每一列都是一样的

  • xx.reshape(-1, 1) 将 xx 转换为列向量,yy.reshape(-1, 1) 同样处理 yy。

  • np.hstack 将这两个列向量水平堆叠,生成 x_new, x_new每一行代表一个网格点的坐标。可以理解为遍历网格中的每一个点

  • Z用来预测每个网格点的值

plt.pcolormesh 接受多个参数,以下是一些常用的参数及其说明:

  1. X, Y:

    • X: 网格点的 x 坐标数组,通常是通过 np.meshgrid 生成的二维数组。

    • Y: 网格点的 y 坐标数组,通常也是通过 np.meshgrid 生成的二维数组。

  2. C:

    • C: 一个与 X 和 Y 的形状相匹配的二维数组,表示每个网格点的值。这个数组的值将通过颜色映射来表示。

  3. cmap:

    • cmap: 颜色映射(colormap),用于定义如何将数值映射到颜色。Matplotlib 提供了多种内置的颜色映射,例如 plt.cm.viridis, plt.cm.plasma, plt.cm.coolwarm 等。

  4. shading:

    • shading: 确定像素的填充方式。常用的选项包括:

      • 'flat': 默认值,颜色填充与网格点相对应。

      • 'gouraud': 适用于三角形插值的平滑填充。

      • 'auto': 根据输入数据自动选择填充方式(通常推荐使用)。

  5. 其他参数:

    • alpha: 控制透明度,取值范围是 [0, 1]。

    • vmin, vmax: 用于设置颜色映射的最小值和最大值。

    ###########  绘制原始样本点
    index_pos, index_neg = (y == 1), (y == 0)
    x_pos, x_neg = x[index_pos], x[index_neg]
    plt.scatter(x_pos[:, 0], x_pos[:, 1], marker='o', label='positive', c='black', s=50)
    plt.scatter(x_neg[:, 0], x_neg[:, 1], marker='s', label='negative', c='black', s=50)

    # plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
    plt.legend(fontsize=15)
    plt.tight_layout()
    plt.show()


if __name__ == '__main__':
    x, y = make_data()
    decision_boundary(x, y)

运行结果:

多分类逻辑回归

通常情况下在用逻辑回归处理多分类任务时,都会采样一种称为One-vs-all(也叫作 One-vs-rest)的方法,两者的缩写分别为ova与ovr。这种策略的核心思想就是每次将其中一个类和剩余的其他类看作一个二分类任务进行训练,最后在预测过程中选择输出概率值最大那个类作为该样本点所属的类别。

示例代码:

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

def load_data():
    data = load_iris()
    x, y = data.data, data.target
    return x, y
def train(x, y):
    model = LogisticRegression(multi_class='ovr')
    model.fit(x,y)
    print("得分: ", model.score(x, y))


if __name__ == '__main__':
    x, y = load_data()
    train(x, y)

得分: 0.9533333333333334,代表准确率,即95%的样本被模型正确分类了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值