【笔记】决策边界

决策边界

逻辑回归的原理详见这里

总的来说,可以总结为一个式子

而决策边界就是

其为两个为两个向量的点乘,同时也可以代表一条直线,如果X有两个特征

转换成可以具体实现的式子以后可以得到

具体的实现

(在notebook中)

使用自己编写的回归算法,且依旧使用鸢尾花数据集

  import numpy as np
  import matplotlib.pyplot as plt
  from sklearn import datasets

  iris = datasets.load_iris()

  X = iris.data
  y = iris.target

  X = X[y<2,:2]
  y = y[y<2]

  plt.scatter(X[y==0,0],X[y==0,1],color='red')
  plt.scatter(X[y==1,0],X[y==1,1],color='blue')

图像如下(样本在样本空间中的分布,横纵都为特征)

然后进行分割数据集以及使用封装好的方法,实例化并fit训练数据集

  from model_selection import train_test_split

  X_train,X_test,y_train,y_test = train_test_split(X,y,seed=666)

  from LogisticRegression import LogisticRegression

  log_reg = LogisticRegression()
  log_reg.fit(X_train,y_train)

逻辑回归的系数为

逻辑回归的截距为

设立一个新的函数,将传来的x1,按照上面的式子写出这个x2函数,设置一个在4到8中均匀取值的x1_plot,然后将其传入x2,然后根据数据绘制图像

  def x2(x1):
      return (-log_reg.coef_[0] * x1 - log_reg.interception_) / log_reg.coef_[1]

  x1_plot = np.linspace(4,8,1000)
  x2_plot = x2(x1_plot)

  plt.scatter(X[y==0,0],X[y==0,1],color='red')
  plt.scatter(X[y==1,0],X[y==1,1],color='blue')
  plt.plot(x1_plot,x2_plot)

图像如下

只对X_test的点进行一个相应的绘制

  plt.scatter(X_test[y_test==0,0],X_test[y_test==0,1],color='red')
  plt.scatter(X_test[y_test==1,0],X_test[y_test==1,1],color='blue')
  plt.plot(x1_plot,x2_plot)

图像如下

可以发现,对于逻辑回归算法来说,其得到的决策边界就是一根直线,所以本身还是线性回归算法中的一种,其分类标准本质就是点落在线的上面还是下面,按此分为两类

不过对于多项式来说,就不能简单的求出一根直线的方程了,这样就需要绘制一个不规则的决策边界的方法,在平面中,分布着无数个点,对于每一个点,都使用模型来判断一下其分为哪一类,最后绘制出来的颜色块就是决策边界

图像绘制函数:
简单叙述就是,将X轴和Y轴分为数个点,相应的都使用每个进行预测,对应分配一些颜色属性

from matplotlib.colors import ListedColormap
def plot_decision_boundary(model, axis):

    x0,x1 = np.meshgrid(  
        np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
        np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
    )
    X_new = np.c_[x0.ravel(),x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
    custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])

    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)

使用这个函数来绘制图像

  plot_decision_boundary(log_reg,axis=[4,7.5,1.5,4.5])
  plt.scatter(X[y==0,0],X[y==0,1])
  plt.scatter(X[y==1,0],X[y==1,1])

图像如下

这里使用knn来说明决策边界

使用sklearn中的knn算法,关于knn,可以看这里,实例化以后进行fit训练,然后绘制图像

  from sklearn.neighbors import KNeighborsClassifier

  knn_clf = KNeighborsClassifier()
  knn_clf.fit(X_train,y_train)

  plot_decision_boundary(knn_clf,axis=[4,7.5,1.5,4.5])
  plt.scatter(X[y==0,0],X[y==0,1])
  plt.scatter(X[y==1,0],X[y==1,1])

图像如下

这里开始就使用全部的鸢尾花数据,不过为了可视化,还是取两个特征,使用knn算法,将范围设置的大一些

  knn_clf_all = KNeighborsClassifier()
  knn_clf_all.fit(iris.data[:,:2],iris.target)

  plot_decision_boundary(knn_clf_all,axis=[4,8,1.5,4.5])
  plt.scatter(iris.data[iris.target==0,0],iris.data[iris.target==0,1])
  plt.scatter(iris.data[iris.target==1,0],iris.data[iris.target==1,1])
  plt.scatter(iris.data[iris.target==2,0],iris.data[iris.target==2,1])
  plt.scatter(X[y==1,0],X[y==1,1])

图像如下

将k值设置为50,也就是n_neighbors=50

  knn_clf_all = KNeighborsClassifier(n_neighbors=50)
  knn_clf_all.fit(iris.data[:,:2],iris.target)

  plot_decision_boundary(knn_clf_all,axis=[4,8,1.5,4.5])
  plt.scatter(iris.data[iris.target==0,0],iris.data[iris.target==0,1])
  plt.scatter(iris.data[iris.target==1,0],iris.data[iris.target==1,1])
  plt.scatter(iris.data[iris.target==2,0],iris.data[iris.target==2,1])

图像如下

这样决策边界就规整了清晰了很多,即对于knn算法来说,模型的复杂程度与决策边界的清晰是有很大的关联的

posted @ 2021-01-24 15:33  DbWong_0918  阅读(762)  评论(0编辑  收藏  举报