一.性能度量
衡量模型泛化能力的标准就是性能度量.(模型泛化能力是指机器学习模型在未见过的数据上的表现能力。一个模型的泛化能力好意味着它能够在训练集以外的数据上表现良好,即能够对新的数据进行准确的预测。模型泛化能力的好坏是衡量一个模型优劣的重要指标之一。一个模型如果只能在训练集上表现好,但在测试集或实际应用中表现差,说明它的泛化能力不足。为了提高模型的泛化能力,可以采取一些方法,如增加训练数据的多样性、降低模型的复杂度、使用正则化等。)
1.错误率与准确率
在分类问题中,错误率是分类错误的样本数占样本总数的比例;
准确率是分类正确的样本数占样本总数的比例
可以使用accuracy_score来计算分类结果的准确率,代码如下:
from sklearn.metrics import accuracy_score
y_true = [1,1,1,1,1,0,0,0,0,0,1,1,1,1]
y_pred = [0,0,1,1,0,1,1,1,0,0,1,1,0,0]
# 返回准确率
print('准确率:',accuracy_score(y_true,y_pred,normalize=True))
error_rate = 1 - accuracy_score(y_true, y_pred, normalize=True)
print('错误率:', error_rate)
# 返回正确分类的数量
print('Accuracy Score(normalize=False):',accuracy_score(y_true,y_pred,normalize=False))
运行结果:
2.查准率(p)和查全率(r)
查准率:在所有的预测正样本中有多少是真正的正样本.
查全率:所有的正样本中有多少正样本被预测出来.
查准率代码示例:
from sklearn.metrics import precision_score
y_true = [1,1,1,1,1,0,0,0,0,0,1,1,1,1]
y_pred = [0,0,1,1,0,1,1,1,0,0,1,1,0,0]
# 返回查准率
print('Precision Score:',precision_score(y_true,y_pred))
结果展示:
查全率代码展示:
from sklearn.metrics import recall_score
y_true = [1,1,1,1,1,0,0,0,0,0,1,1,1,1]
y_pred = [0,0,1,1,0,1,1,1,0,0,1,1,0,0]
# 返回召回率
print('Recall Score:',recall_score(y_true,y_pred))
结果展示:
3.P-R曲线
步骤:
-
使用分类模型对测试集中的样本进行预测,并得到每个样本的预测概率或预测结果。
-
根据不同的阈值,将样本划分为正类和负类。例如,对于二分类问题,可以选择一个阈值,大于该阈值的样本被划分为正类,小于该阈值的样本被划分为负类。
-
计算在每个阈值下的精确率和召回率。精确率表示被正确划分为正类的样本占所有被划分为正类的样本的比例,召回率表示被正确划分为正类的样本占所有真实正类样本的比例。
-
绘制PR曲线。将不同阈值下的精确率作为纵轴,召回率作为横轴,绘制得到PR曲线。
-
P-R曲线代码示例:
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_recall_curve, auc
# 生成二分类数据集
X, y = make_classification(n_samples=10000, n_features=20, n_informative=10, n_classes=2, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建逻辑回归模型
#lr = LogisticRegression()
#创建knn回归模型
lr = KNeighborsClassifier(n_neighbors=5)
# 在训练集上训练模型
lr.fit(X_train, y_train)
# 在测试集上进行预测
y_scores = lr.predict_proba(X_test)[:, 1] # 预测概率值
# 计算精确率和召回率
precision, recall, thresholds = precision_recall_curve(y_test, y_scores)
# 计算PR曲线下的面积
pr_auc = auc(recall, precision)
# 绘制PR曲线
plt.plot(recall, precision, label='PR curve (area = %0.2f)' % pr_auc)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('P-R')
plt.legend(loc="lower right")
plt.show()
结果展示:
PR curve(area = 0.97)预测效果挺好
4.计算F1值:
F1值是精确率(Precision)和召回率(Recall)的综合度量。
F1值综合考虑了精确率和召回率,是一个综合评估模型性能的指标。它可以帮助我们在不同的模型或不同的阈值下进行比较,并选择最优的模型或阈值。
F1值越接近1,表示模型的预测效果越好,同时兼顾了精确率和召回率的平衡。在某些情况下,我们更关注模型的准确性,而在其他情况下,我们可能更关注模型的召回率。因此,F1值可以帮助我们找到一个平衡点,使得模型在不同需求下都能取得较好的性能。
代码展示:
# 将标签转换为二分类问题
y_test_binary = np.where(y_test == 1, 1, 0)
y_pred_binary = np.where(y_scores > 0.5, 1, 0)
# 计算F1值
f1 = metrics.f1_score(y_test_binary, y_pred_binary)
print("F1值:", f1)
结果展示:
F1值越接近1,表示模型的预测效果越好,说明该模型预测效果挺好
5.总结
在机器学习中,性能度量是评估和度量模型预测能力的重要指标。在进行实验时,可以使用以下几种常见的性能度量来评估模型的性能:
1. 准确率(Accuracy):准确率是最常用的性能度量指标,表示模型正确预测的样本数占总样本数的比例。准确率越高,模型的预测能力越好。
2. 精确率(Precision)和召回率(Recall):精确率和召回率是在二分类问题中常用的性能度量指标。精确率表示模型预测为正类的样本中真正为正类的比例,召回率表示真正为正类的样本中被模型预测为正类的比例。精确率和召回率可以通过混淆矩阵计算得到。
3. F1值(F1-Score):F1值是精确率和召回率的调和平均值,综合考虑了模型的精确率和召回率。F1值越高,模型的预测能力越好。
在进行实验时,可以根据具体的问题选择合适的性能度量指标。同时,还可以使用不同的模型,比如使用逻辑回归模型,可以比较一下模型的预测效果。