黄山市网站建设_网站建设公司_UI设计师_seo优化
2025/12/29 17:55:16 网站建设 项目流程

文章目录

  • 分类模型的可信度评估
    • 分类模型中的预测准确率
    • 分类模型中的决定系数

分类模型的可信度评估

分类算法的目标时为目标数据预测分类,结果时离散型的数值。但算法实际在分类的过程中,会认为某个数据点有“80%”的可能性属于分类1,有“20%”的可能性属于分类0,在最终的预测结果中,模型会根据“可能性比较大”的方式来分配分类标签。

分类模型中的预测准确率

在scikit-learn中,很多用于分类的模型都有一个predict_proba功能,用于计算模型在对数据集进行分类时,每个样本属于不同分类的可能性是多少。

# 导入必要的库fromsklearn.datasetsimportmake_blobs# 用于生成模拟的聚类数据importmatplotlib.pyplotasplt# 用于数据可视化# 使用make_blobs函数生成数据集# n_samples=200: 生成200个样本点# random_state=1: 设置随机种子为1,确保每次运行生成的随机数据相同,便于结果复现# centers=2: 生成2个聚类中心(两类数据)# cluster_std=5: 每个聚类的标准差为5,控制数据点的分散程度,值越大数据点越分散X,y=make_blobs(n_samples=200,random_state=1,centers=2,cluster_std=5)# 绘制散点图# X[:,0]: 取X的第一列作为x轴坐标(所有行的第0列)# X[:,1]: 取X的第二列作为y轴坐标(所有行的第1列)# c=y: 使用标签y作为颜色映射的依据,不同类别显示不同颜色# cmap=plt.cm.cool: 使用cool色彩映射,是一种从蓝到紫的渐变色系# edgecolors='k': 设置数据点边缘为黑色(k是黑色的简写),使点与点之间更容易区分plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.cool,edgecolors='k')# 显示图形plt.show()

# 导入高斯朴素贝叶斯分类器# 高斯朴素贝叶斯假设每个特征的条件概率服从高斯分布(正态分布)fromsklearn.naive_bayesimportGaussianNB# 导入train_test_split函数,用于将数据集分割为训练集和测试集fromsklearn.model_selectionimporttrain_test_split# 使用train_test_split函数将数据集划分为训练集和测试集# X: 特征矩阵,包含所有样本的特征数据# y: 目标变量,包含所有样本的类别标签# test_size: 未指定,默认为0.25,表示25%的数据作为测试集,75%作为训练集# random_state=68: 设置随机种子为68,确保每次运行划分结果一致,便于实验复现# 返回值:# X_train: 训练集特征# X_test: 测试集特征# y_train: 训练集标签# y_test: 测试集标签X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=68)# 创建高斯朴素贝叶斯分类器的实例# GaussianNB不需要任何参数即可初始化,但也可设置参数如:# var_smoothing: 添加到方差计算中的稳定性参数,防止除零错误gnb=GaussianNB()# 使用训练数据拟合(训练)朴素贝叶斯分类器# fit方法会计算每个类别下每个特征的平均值和方差# 这些统计量将用于计算新样本的条件概率gnb.fit(X_train,y_train)# 使用训练好的模型预测测试集样本属于每个类别的概率# predict_proba返回一个数组,每行对应一个测试样本,每列对应一个类别# 每行的概率值之和为1# 对于二分类问题,返回两列:[类别0的概率, 类别1的概率]predict_proba=gnb.predict_proba(X_test)# 打印预测概率数组的形状# 形状为 (测试样本数, 类别数)# 例如:(50, 2) 表示有50个测试样本,每个样本有2个类别的概率print(predict_proba.shape)
(50, 2)
print(predict_proba[:5])
[[0.98849996 0.01150004] [0.0495985 0.9504015 ] [0.01648034 0.98351966] [0.8168274 0.1831726 ] [0.00282471 0.99717529]]
# 导入numpy库,用于数值计算和数组操作importnumpyasnp# 设置绘图区域的边界范围# 获取第一个特征(X[:,0])的最小值和最大值,并向外扩展0.5个单位# 这样可以让数据点不会紧贴图形边缘,使图形更美观x_min,x_max=X[:,0].min()-0.5,X[:,0].max()+0.5# 获取第二个特征(X[:,1])的最小值和最大值,并向外扩展0.5个单位y_min,y_max=X[:,1].min()-0.5,X[:,1].max()+0.5# 创建网格坐标矩阵# np.arange(start, stop, step): 生成从start到stop(不包含)的等差数列,步长为step# np.meshgrid(): 从两个一维数组中生成网格坐标矩阵# xx和yy都是二维数组,表示网格中每个点的(x, y)坐标# 步长0.2决定了网格的密度,值越小网格越密,决策边界越平滑xx,yy=np.meshgrid(np.arange(x_min,x_max,0.2),# 生成x轴的网格点np.arange(y_min,y_max,0.2)# 生成y轴的网格点)# 对网格上的每个点进行概率预测# np.c_[xx.ravel(), yy.ravel()]:# - xx.ravel()和yy.ravel()将二维网格展平为一维数组# - np.c_[]按列连接两个数组,生成一个N×2的矩阵,每行是一个网格点的坐标# gnb.predict_proba(): 预测每个网格点属于各个类别的概率# [:,1]: 取所有行的第二列,即属于类别1的概率# 对于二分类问题,gnb.predict_proba()返回两列:[P(类别0), P(类别1)]Z=gnb.predict_proba(np.c_[xx.ravel(),yy.ravel()])[:,1]# 将预测结果重塑为与xx、yy相同的二维形状# 这样Z的每个元素对应网格中相应位置的预测概率Z=Z.reshape(xx.shape)# 绘制决策区域的等高线填充图# contourf(): 绘制填充等高线,用颜色表示不同区域的概率值# xx, yy: 网格坐标# Z: 每个网格点属于类别1的概率值# cmap=plt.cm.summer: 使用summer颜色映射,从绿到黄# alpha=0.8: 设置透明度为0.8,使下方的散点图可以部分显示plt.contourf(xx,yy,Z,cmap=plt.cm.summer,alpha=0.8)# 绘制训练集的散点图# X_train[:,0], X_train[:,1]: 训练集的两个特征作为x、y坐标# c=y_train: 根据真实标签着色# cmap=plt.cm.cool: 使用cool颜色映射(蓝到紫)# edgecolors='k': 数据点边缘为黑色,增强可区分性plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.cool,edgecolors='k')# 绘制测试集的散点图# 参数与训练集相似,但添加alpha=0.6使测试集点半透明# 这样可以区分训练集和测试集,同时看到重叠部分plt.scatter(X_test[:,0],X_test[:,1],c=y_test,cmap=plt.cm.cool,edgecolors='k',alpha=0.6)# 设置x轴和y轴的显示范围# 使用网格的边界作为坐标轴范围plt.xlim(xx.min(),xx.max())plt.ylim(yy.min(),yy.max())# 隐藏坐标轴刻度# 使图形更简洁,专注于决策边界和数据分布plt.xticks(())plt.yticks(())# 显示图形plt.show()


背景颜色(决策区域):

  • 绿色区域:属于类别1的概率较低
  • 黄色区域:属于类别1的概率较高
  • 颜色渐变表示概率的连续变化

数据点颜色:

  • 蓝色点:属于类别0的数据
  • 紫色点:属于类别1的数据
  • 训练集点(实心):用于训练模型的样本
  • 测试集点(半透明):用于评估模型的样本

不是每个分类算法都有predict_proba属性,不过我们还可以使用另一种方式来检查分类的可信度,就是决定系数decision_fuinction

分类模型中的决定系数

决定系数在二元分类任务中,只返回一个值,如果是正数,代表该数据点属于分类1;如果是附属,则代表属于分类2。这里使用向量机分类器SVC的decision_function为例

# 从sklearn.svm模块导入支持向量机分类器SVC# SVC(Support Vector Classification)是一种基于支持向量机(SVM)的分类器fromsklearn.svmimportSVC# 创建SVC分类器实例,使用默认参数初始化# 默认参数包括:# - C=1.0:正则化参数,控制软间隔的惩罚强度# - kernel='rbf':使用径向基函数(高斯核)作为核函数# - gamma='scale':核函数的系数,'scale'表示1/(n_features * X.var())# - 其他参数均为默认值svc=SVC()# 使用训练数据拟合(训练)SVM分类器# fit()方法会:# 1. 根据选择的核函数将数据映射到高维空间# 2. 寻找最优分隔超平面(最大间隔超平面)# 3. 确定支持向量# 4. 计算决策函数参数svc.fit(X_train,y_train)# 计算测试样本到决策超平面的有符号距离# decision_function()返回每个测试样本到决策超平面的有符号距离# 对于二分类问题:# - 正值表示样本被分类为类别1# - 负值表示样本被分类为类别0# - 值越大(正)或越小(负)表示离决策边界越远,分类置信度越高# - 值为0表示样本正好在决策边界上# 对于多分类问题(one-vs-one),返回形状为(n_samples, n_classes*(n_classes-1)/2)dec_func=svc.decision_function(X_test)# 打印前5个测试样本的决策函数值# 这些值可以帮助理解模型对每个样本的分类置信度print(dec_func[:5])
[-1.36071347 1.53694862 1.78825594 -0.96133081 1.81826853] 正数属于分类1, 负数属于分类2
# 计算网格点上每个点的决策函数值# np.c_[xx.ravel(), yy.ravel()]: 将二维网格坐标展平并组合成N×2的矩阵# 每一行是网格中的一个点的(x, y)坐标# svc.decision_function(): 计算每个网格点到SVM决策超平面的有符号距离Z=svc.decision_function(np.c_[xx.ravel(),yy.ravel()])# 将计算得到的决策函数值重新整形为与网格坐标xx相同的二维形状# 这样每个Z[i,j]就对应网格点(xx[i,j], yy[i,j])的决策函数值Z=Z.reshape(xx.shape)# 绘制决策函数值的等高线填充图# contourf()函数用不同颜色填充不同值的区域# xx, yy: 网格坐标# Z: 每个网格点的决策函数值# cmap=plt.cm.summer: 使用summer颜色映射(绿到黄)# alpha=0.8: 设置透明度为0.8,使底层散点图可见plt.contourf(xx,yy,Z,cmap=plt.cm.summer,alpha=0.8)# 绘制训练集的散点图# X_train[:,0], X_train[:,1]: 训练集样本的两个特征作为x和y坐标# c=y_train: 根据真实标签着色# cmap=plt.cm.cool: 使用cool颜色映射(蓝到紫)# edgecolors='k': 数据点边缘为黑色,增强可区分性plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.cool,edgecolors='k')# 绘制测试集的散点图# 参数与训练集类似,但添加alpha=0.6使测试集点半透明# 这样可以区分训练集和测试集,同时看到重叠部分plt.scatter(X_test[:,0],X_test[:,1],c=y_test,cmap=plt.cm.cool,edgecolors='k',alpha=0.6)# 设置x轴和y轴的显示范围# 使用网格的最小值和最大值作为坐标轴范围,确保图形完整显示plt.xlim(xx.min(),xx.max())plt.ylim(yy.min(),yy.max())# 添加图形标题plt.title('SVC decision_function')# 隐藏坐标轴刻度# 使图形更简洁,专注于决策函数和数据分布plt.xticks(())plt.yticks(())# 显示图形plt.show()

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询