【笔记】决策边界
决策边界
逻辑回归的原理详见这里
总的来说,可以总结为一个式子
而决策边界就是
其为两个为两个向量的点乘,同时也可以代表一条直线,如果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算法来说,模型的复杂程度与决策边界的清晰是有很大的关联的
您能读到这儿,我呢是发自真心的感谢您,若要转载,还望请您带上链接