做网站要搭建什么平台,海口建设网站的公司,PPT做的好的有哪些网站,象山县城乡建设局网站算法评估矩阵#xff08;Algorithm Evaluation Metrics#xff09;用于评估机器学习算法在特定任务上的性能。不同的任务可能会使用不同的评估矩阵#xff0c;因为每个任务的优劣衡量标准都不同。 分类算法矩阵
分类问题或许是最常见的机器学习问题#xff0c;并且有多种评… 算法评估矩阵Algorithm Evaluation Metrics用于评估机器学习算法在特定任务上的性能。不同的任务可能会使用不同的评估矩阵因为每个任务的优劣衡量标准都不同。 分类算法矩阵
分类问题或许是最常见的机器学习问题并且有多种评估矩阵来评估 分类算法。以下几种用来评估分类算法的评估矩阵 · 分类准确度。 · 对数损失函数Logloss。 · AUC图。 · 混淆矩阵。 · 分类报告Classification Report。
分类准确度
分类准确度就是算法自动分类正确的样本数 除以 所有的样本数得出的结果。
分类准确度 算法自动分类正确的样本数 / 所有的样本数 通常准确度越高分类器越好。这是分类算法中最常见也最易被误用的评估参数。准确度确实是一个很好、很直观的评价指标但是有时候准确度高并不代表算法就一定好。 比如对某个地区某天地震的预测 假设有一堆的特征作为地震分类的属性类别却只有两个0不发生地震1发生地震。一个不加思考的分类器对每一个测试用例都将类别划分为 0那它就可能达到 99%的准确度但真的地震时这个分类器却毫无察觉这个分类器造成的损失是巨大的。为什么拥有 99%的准确度的分类器却不是我们想要的因为数据分布不均衡类别1的数据太少完全错分类别1依然可以达到很高的准确度却忽视了需要关注的事实和现象。
代码如下 import pandas as pd
from sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_score, ShuffleSplit#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]
# 分割数据集
n_splits 10# 随机数种子
seed 7
# K折交叉验证,将数据分成10份9份训练1份测试,重复10次,取平均值,得到最终模型,评估模型
kfold ShuffleSplit(n_splitsn_splits, random_stateseed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model LogisticRegression(solverlbfgs, max_iter1000)
# 训练模型
result cross_val_score(model, X, Y, cvkfold)
# 记录方法结束时间
print(算法评估结果准确度%.3f (%.3f) % (result.mean(), result.std()))
运行结果
算法评估结果准确度0.782 (0.052)对数损失函数
在逻辑回归的推导中它假设样本服从伯努利分布01分布然后求得满足该分布的似然函数再取对数、求极值等。而逻辑回归并没有求似然函数的极值而是把极大化当作一种思想进而推导出它的经验风险函数为最小化负的似然函数
[max Fyfx→min-Fyfx]。从损失函数的视角来看它就成了对数Log损失函数了。对数损失函数越小模型就越好而且使损失函数尽量是一个凸函数便于收敛计算。
示例代码 import pandas as pd
from sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_score, ShuffleSplit#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]
# 分割数据集
n_splits 10# 随机数种子
seed 7
# K折交叉验证,将数据分成10份9份训练1份测试,重复10次,取平均值,得到最终模型,评估模型
kfold ShuffleSplit(n_splitsn_splits, random_stateseed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model LogisticRegression(solverlbfgs, max_iter1000)scoring neg_log_loss
# 训练模型
result cross_val_score(model, X, Y, cvkfold, scoringscoring)
# 记录方法结束时间
print(neg_log_loss%.3f (%.3f) % (result.mean(), result.std()))
运行结果
neg_log_loss-0.477 (0.065)AUC图
ROC AUC是用于评估二分类算法性能的指标。ROC曲线是以不同的分类阈值为基础绘制了真阳性率True Positive Rate, TPR也称为召回率与假阳性率False Positive Rate, FPR之间的关系曲线。AUC是ROC曲线下的面积取值范围在0到1之间。AUC越大表示模型的性能越好AUC等于1时表示模型完美分类AUC等于0.5时表示模型的分类能力与随机分类相当。 ROC和AUC是评价分类器的指标。ROC是受试者工作特征曲线 Receiver Operating Characteristic Curve的简写又称为感受性曲线Sensitivity Curve。 得此名的原因在于曲线上各点反映相同的感受性它们都是对同一信号刺激的反应只不过是在几种不同的判定标准下所得的结果而已。ROC是反映敏感性和特异性连续变量的综合指标用构图法揭示敏感性和特异性的相互关系通过将连续变量设定出多个不同的临界值计算出一系列敏感性和特异性再以敏感性为纵坐标、1-特异性为横坐标绘制成曲线。 AUC是ROC曲线下的面积Area Under ROC Curve的简称顾名思义AUC的值就是处于ROC Curve下方的那部分面积的大 小。 通常AUC的值介于0.5到1.0之间AUC的值越大诊断准确性越 高。在ROC曲线上靠近坐标图左上方的点为敏感性和特异性均较高的临界值。 ROC AUC是用于评估二分类算法性能的指标。ROC曲线是以不同的分类阈值为基础绘制了真阳性率True Positive Rate, TPR也称为召回率与假阳性率False Positive Rate, FPR之间的关系曲线。AUC是ROC曲线下的面积取值范围在0到1之间。AUC越大表示模型的性能越好AUC等于1时表示模型完美分类AUC等于0.5时表示模型的分类能力与随机分类相当。 为了解释ROC的概念让我们考虑一个二分类问题即将实例分成正类Positive或负类Negative。对一个二分类问题来说会出现四种情况
如果一个实例是正类并且也被预测成正类即为真正类True Positive如果实例是负类却被预测成正类称之为假正类False Positive。如果实例是负类也被预测成负类称之为真负类True Negative如果实例为正类却被预测成负类则为假负类FalseNegative。
列联表或混淆矩阵如下表所示“1”代表正类“0”代表负类。 基于该列联表定义敏感性指标为sensitivityTP/TPFN。敏感性指标又称为真正类率True Positive RateTPR计算的是分类器所识别出的正实例占所有正实例的比例。
另外定义负正类率False Positive RateFPR的计算公式为FPRFP/FPTN负正类率计算的是分类器错认为正类的负实例占所有负实例的比例。
定义特异性指标为SpecificityTN/FPTN1-FPR。特异性指标又称为真负类率True Negative RateTNR。
代码如下 import pandas as pd
from sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_score, ShuffleSplit#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]
# 分割数据集
n_splits 10# 随机数种子
seed 7
# K折交叉验证,将数据分成10份9份训练1份测试,重复10次,取平均值,得到最终模型,评估模型
kfold ShuffleSplit(n_splitsn_splits, random_stateseed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model LogisticRegression(solverlbfgs, max_iter1000)scoring roc_auc
# 训练模型
result cross_val_score(model, X, Y, cvkfold, scoringscoring)
# 记录方法结束时间
print(roc_auc%.3f (%.3f) % (result.mean(), result.std()))
运行结果
roc_auc0.839 (0.054)ROC AUCReceiver Operating Characteristic Area Under the Curve的评估结果为0.839其中括号内的0.054表示标准差。
在给出的结果中ROC AUC为0.839说明模型的分类性能较好它相对于随机分类有明显的优势。标准差为0.054表示这个评估结果在不同数据集或实验中可能会有一定的波动但整体上来看该模型的性能是比较稳定的。
值得注意的是ROC AUC只适用于二分类问题对于多类别分类问题可以考虑使用一些其他的指标如平均精确率均值Mean Average Precision, mAP等。
混淆矩阵 混淆矩阵Cnfusion Matrix主要用于比较分类结果和实际测得值可以把分类结果的精度显示在一个混淆矩阵里面。混淆矩阵是可视化工具特别适用于监督学习在无监督学习时一般叫作匹配矩阵。混淆矩阵的每列代表预测类别每列的总数表示预测为该类别的数据的数目每行代表数据的真实归属类别每行的数据总数表示该类别的数据的数目。每列中的数值表示真实数据被预测为该类的数目。 如下表所示有150个样本数据这些数据分成 3 类每类 50 个。 分类结束后得到的混淆矩阵每行之和为50表示50个样本。
第一行说明类1的50个样本有43个分类正确5个错分为类22个错分为类3。 代码示例
使用Pandas库读取糖尿病数据集并将数据转换为数组形式。将特征和标签分别赋值给X和Y。使用train_test_split函数将数据集分割为训练集和测试集其中测试集占33%。创建一个逻辑回归模型并使用训练集拟合模型。使用模型对测试集进行预测并计算混淆矩阵。输出混淆矩阵的DataFrame形式。
代码如下 import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrixfrom sklearn.model_selection import cross_val_score, ShuffleSplit, train_test_split#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]
# 分割数据集test_size 0.33
# 随机数种子
seed 7
# 分割数据集
X_train, X_test, Y_train, Y_test train_test_split(X, Y, test_sizetest_size, random_stateseed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model LogisticRegression(solverlbfgs, max_iter1000)# 训练模型
model.fit(X_train, Y_train)# 评估模型
predictions model.predict(X_test)# 混淆矩阵
matrix confusion_matrix(Y_test, predictions)classes [0, 1]# 创建混淆矩阵
dataframe pd.DataFrame(matrix, indexclasses, columnsclasses)
# 绘制热力图
print(dataframe)
运行结果 0 1
0 142 20
1 34 58根据输出的混淆矩阵可以解释如下
阴性类别0的样本中模型正确地预测了142个样本但错误地将20个样本预测为了阳性假阳性。阳性类别1的样本中模型正确地预测了58个样本但错误地将34个样本预测为了阴性假阴性。
通过混淆矩阵我们可以计算出一系列分类算法的评估指标
精确率Precision对于预测为阳性类别1的样本中有58个样本是真正的阳性所以Precision为58 / (58 20) ≈ 0.7436。
召回率Recall对于实际为阳性类别1的样本中有58个样本被正确地预测为阳性所以Recall为58 / (58 34) ≈ 0.6304。
F1分数F1-Score综合考虑Precision和Recall的调和平均值F1-Score 2 * (Precision * Recall) / (Precision Recall) ≈ 0.6832。
准确率Accuracy计算预测正确的样本数占总样本数的比例即 (142 58) / (142 20 34 58) ≈ 0.7765。
这些评估指标能够帮助我们更全面地了解分类算法在这个特定任务上的性能。根据实际需求可以选择合适的评估指标来衡量模型的性能。
分类报告 分类报告classification_report是一个包含精确率、召回率、F1分数等指标的报告用于评估分类模型的性能。通常它会显示每个类别的指标并在最后提供一个加权平均值或宏平均值。 在 scikit-learn 中提供了一个非常方便的工具可以给出对分类问题的评估报告Classification_report方法能够给出精确率(precision、召回率recall、F1值F1-score和样本数目support。在这里简单地介绍一下三个指标数据精确率、召回率、F1值。
在介绍这三个指标数据之前我们先定义TP、FN、FP、TN四种分类 情况我们借助下表来说明。 精确率的 公式PTP/TPFP计算的是所有被检索到的项目中应该被检索到的项目占的比例。
召回率的公式RTP/TPFN计算的是所有检索到的项目占所有应该检索到的项目的比例。
F1值就是精确率和召回率的调和均值也就是2F1PR。
代码如下 import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_reportfrom sklearn.model_selection import train_test_split#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]
# 分割数据集test_size 0.33
# 随机数种子
seed 4
# 分割数据集
X_train, X_test, Y_train, Y_test train_test_split(X, Y, test_sizetest_size, random_stateseed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model LogisticRegression(solverlbfgs, max_iter1000)# 训练模型
model.fit(X_train, Y_train)# 评估模型
predictions model.predict(X_test)report classification_report(Y_test, predictions)print(report)
运行结果 precision recall f1-score support0.0 0.84 0.87 0.86 1711.0 0.71 0.66 0.69 83accuracy 0.80 254macro avg 0.78 0.77 0.77 254
weighted avg 0.80 0.80 0.80 254根据给出的分类报告逻辑回归模型在测试集上的性能如下 对于类别0阴性精确率Precision为0.84召回率Recall为0.87F1分数为0.86。说明模型在预测阴性样本时有较高的精确性和召回率F1分数也较高。 对于类别1阳性精确率为0.71召回率为0.66F1分数为0.69。说明模型在预测阳性样本时精确率和召回率相对较低F1分数也较低。 accuracy准确率为0.80表示模型在测试集上的整体准确率为80%。 macro avg宏平均值是所有类别的平均值精确率为0.78召回率为0.77F1分数为0.77。 weighted avg加权平均值是根据各类别样本数量加权的平均值精确率为0.80召回率为0.80F1分数为0.80。
综合来看该逻辑回归模型在阴性样本上表现较好但在阳性样本上表现相对较差。整体上模型的准确率为80%在不同类别上的F1分数在0.69到0.86之间。根据具体任务的要求可以根据分类报告中的指标来调整模型或优化特征以改善模型的性能。