第一部分:基本含义
决策边界(Decision Boundary)是在分类问题中,用来将不同类别的样本分隔开的分界线。简单来说,它是在特征空间中,根据机器学习模型(如支持向量机、逻辑回归等)对数据的分类结果绘制出的边界。这条边界决定了新样本会被分类到哪个类别。
第二部分:二分类问题的决策边界
回顾一下多元线性回归公式:
因此我们可以得到:
进行分类的依据:决策函数:
决策边界的条件:
曲线表达式改造:
绘制决策边界的代码:
#第五部分:开始绘制决策边界
x1=np.linspace(-4,4,1000)
x2=(-clif.coef_[0][0]*x1-clif.intercept_)/clif.coef_[0][1]
#这里的clif.coef_[0][0]代表w1,clif.intercept_代表w0,clif.coef_[0][1]代表w2
#绘制图像,分类点以及决策边界
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.plot(x1,x2)#这条直线
plt.show()
完整代码:
#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.datasets import make_classification
#第二部分:生成数据集
x,y=make_classification(
n_samples=200,
n_features=2,
n_redundant=0,#冗余特征数为0
n_classes=2,
n_clusters_per_class=1,#簇设置为1,生成的数据集会在每个类别内形成一个紧凑的簇,类内的样本分布相对较为集中,不会有多个分散的区域。
random_state=1024
)
#第三部分:划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=233,stratify=y)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()
#开始使用逻辑回归
from sklearn.linear_model import LogisticRegression
clif=LogisticRegression()
clif.fit(x_train,y_train)
score=clif.score(x_train,y_train)
print(score)
#第五部分:开始绘制决策边界
x1=np.linspace(-4,4,1000)
x2=(-clif.coef_[0][0]*x1-clif.intercept_)/clif.coef_[0][1]
#这里的clif.coef_[0][0]代表w1,clif.intercept_代表w0,clif.coef_[0][1]代表w2
#绘制图像,分类点以及决策边界
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.plot(x1,x2)#这条直线
plt.show()
上述的这条蓝线就是我们的决策边界!
更新版本:
我们可以使用专门绘制决策边界的函数:
#第五部分:开始绘制决策边界
#5.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
np.arange(axis_x2_min, axis_x2_max, 0.01))
z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
z = z.reshape(x1.shape)
from matplotlib.colors import ListedColormap
# 适合二分类的颜色映射
custom_cmap = ListedColormap(['#F5B9EF', '#F9F9CB'])
plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlim(axis_x1_min, axis_x1_max)
plt.ylim(axis_x2_min, axis_x2_max)
plt.show()
decision_boundary_plot(x, y, clif)
完整代码汇总:
#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.datasets import make_classification
#第二部分:生成数据集
x,y=make_classification(
n_samples=200,
n_features=2,
n_redundant=0,#冗余特征数为0
n_classes=2,
n_clusters_per_class=1,#簇设置为1,生成的数据集会在每个类别内形成一个紧凑的簇,类内的样本分布相对较为集中,不会有多个分散的区域。
random_state=1024
)
#第三部分:划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=233,stratify=y)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()
#开始使用逻辑回归
from sklearn.linear_model import LogisticRegression
clif=LogisticRegression()
clif.fit(x_train,y_train)
score=clif.score(x_train,y_train)
print(score)
#第五部分:开始绘制决策边界
#5.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
np.arange(axis_x2_min, axis_x2_max, 0.01))
z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
z = z.reshape(x1.shape)
from matplotlib.colors import ListedColormap
# 适合二分类的颜色映射
custom_cmap = ListedColormap(['#F5B9EF', '#F9F9CB'])
plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlim(axis_x1_min, axis_x1_max)
plt.ylim(axis_x2_min, axis_x2_max)
plt.show()
decision_boundary_plot(x, y, clif)
效果更加明显。
第三部分:多分类问题的决策边界
下面先以三分类为例:
新的绘图函数代码:
#第四部分:开始绘制决策边界
#4.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
np.arange(axis_x2_min, axis_x2_max, 0.01))
z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
z = z.reshape(x1.shape)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#F5B9EF', '#8B0000', '#F9F9CB']) # 修改为深红色
plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlim(axis_x1_min, axis_x1_max)
plt.ylim(axis_x2_min, axis_x2_max)
plt.show() # 确保最终显示图像
完整代码:
# 第一部分:导包
from matplotlib import pyplot as plt
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import numpy as np
# 第二部分:获取数据集
iris = datasets.load_iris()
x = iris.data[:, :2]#只用前两个特征来训练
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)
# 画散点图
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)
#plt.show()
# 第三部分:使用 One-vs-One 策略
from sklearn.multiclass import OneVsOneClassifier
clf = OneVsOneClassifier(RandomForestClassifier())
clf.fit(x_train, y_train)
#第四部分:开始绘制决策边界
#4.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
np.arange(axis_x2_min, axis_x2_max, 0.01))
z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
z = z.reshape(x1.shape)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#F5B9EF', '#8B0000', '#F9F9CB']) # 修改为深红色
plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlim(axis_x1_min, axis_x1_max)
plt.ylim(axis_x2_min, axis_x2_max)
plt.show() # 确保最终显示图像
# 调用绘图函数
decision_boundary_plot(x, y, clf)
注意:我们可以看到这个图并不像上面的那个图那样平滑,这就是因为出现了“过拟合”现象。
第四部分:多项式逻辑回归的决策边界
完整代码:
#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.datasets import make_classification
#第二部分:生成数据集
np.random.seed(0)
x=np.random.normal(0,1,size=(200,2))
y=np.array((x[:,0]**2)+(x[:,1]**2)<2,dtype='int')#圆形区域的判断
#第三部分:划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=233,stratify=y)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()
#开始使用逻辑回归
from sklearn.linear_model import LogisticRegression
'''
clif=LogisticRegression()
clif.fit(x_train,y_train)
score=clif.score(x_train,y_train)
print(score)
'''
#第四部分:开始使用多项式回归
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(degree=2)
poly.fit(x_train,y_train)
x_train_poly=poly.transform(x_train)
x_test_poly=poly.transform(x_test)
clif=LogisticRegression()
clif.fit(x_train_poly,y_train)
#训练集的评分
score=clif.score(x_train_poly,y_train)
print("训练集的评分=",score)
#测试集的评分
score=clif.score(x_test_poly,y_test)
print("测试集的评分=",score)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
clf_pipe = Pipeline([
('poly', PolynomialFeatures(degree=2)),#多项式提取模块
('scaler', StandardScaler()),#多项式提取模块
('LogisticRegression', LogisticRegression())#逻辑回归分类器
])
#训练
clf_pipe.fit(x_train, y_train)
#第五部分:开始绘制决策边界
#5.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
np.arange(axis_x2_min, axis_x2_max, 0.01))
z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
z = z.reshape(x1.shape)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#F5B9EF', '#8B0000', '#F9F9CB']) # 修改为深红色
plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlim(axis_x1_min, axis_x1_max)
plt.ylim(axis_x2_min, axis_x2_max)
plt.show() # 确保最终显示图像
decision_boundary_plot(x, y, clf_pipe)