20.评价指标(未完成)
约 758 字大约 3 分钟
2025-09-20
混淆矩阵
包含Precision,Recall,F1-score等指标。
分别为TP, FP, TN, FN四个指标的计算公式。
FP误检,FN漏检,TP真阳性,TN真阴性。
我们想要尽量减少前两个.
- Precision:精准度,在所有疑似检测中,真阳性的比例
Precision=TP+FPTP
检测出误检的程度.
- Recall:召回率,在所有真实的阳性样本中,被检测出来的比例
Recall=TP+FNTP
衡量漏检的程度.
- Accuarcy:整体正确率
Accuracy=T+FT
综合两者的优点,使用F1-score作为评价指标。
F11=21×(precision1+recall1)
F1=precision+recall2×precision×recall
这样可以避免极端值的影响,综合考虑两个维度.
import numpy as npfrom sklearn.datasets import load_iris
iris = load_iris()
x = iris.data
y = iris.targety[y!=0]=1 # 转化为二分类问题from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42)from sklearn.linear_model import LogisticRegression
lreg = LogisticRegression()
lreg.fit(x_train,y_train)
y_pred = lreg.predict(x_test)decision_scores = lreg.decision_function(x_test)
decision_scores # 在>0时,预测为正类,在<0时,预测为负类运行结果
array([ 5.3860077 , -3.14030918, 12.12812343, 5.08727105, 6.09048892, -3.26430588, 2.74028956, 7.35756453, 5.79440594, 3.57564921, 6.82211918, -3.66266886, -3.93673047, -3.48733694, -3.83967201, 5.3949637 , 8.7328849 , 3.57584443, 4.86404477, 8.42499702, -3.34848494, 6.20220746, -3.21405622, 8.33314905, 9.76579307, 7.58216369, 8.89503275, 8.99681916, -3.47897291, -3.21691141])
# 手动实现评价指标
TN = np.sum((y_test == 0) & (y_pred == 0))
TP = np.sum((y_test == 1) & (y_pred == 1))
FN = np.sum((y_test == 1) & (y_pred == 0))
FP = np.sum((y_test == 0) & (y_pred == 1))
TN, TP, FN, FP运行结果
(10, 20, 0, 0)
confusion_matrix = np.array([
[TN,FP],
[FN,TP]
])
confusion_matrix运行结果
array([[10, 0], [ 0, 20]])
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test,y_pred)运行结果
array([[10, 0], [ 0, 20]], dtype=int64)
# 同理
from sklearn.metrics import precision_score,recall_score,f1_score# PR曲线绘制
from matplotlib import pyplot as plt
precision_scores = []
recall_scores = []
thresholds = np.sort(decision_scores)
for threshold in thresholds:
y_pred = (decision_scores >= threshold).astype(int)
precision_scores.append(precision_score(y_test, y_pred))
recall_scores.append(recall_score(y_test, y_pred))
plt.plot(thresholds, precision_scores, label='precision')
plt.plot(thresholds, recall_scores, label='recall')
plt.xlabel('threshold')
plt.legend()
plt.show()
然后我们可以得到PR曲线,获取两个交点一般是比较好的指标.
from sklearn.metrics import precision_recall_curve
precision, recall, thresholds = precision_recall_curve(y_test,decision_scores)
# 在使用 precision_recall_curve 函数时,返回的 precision、recall 和 thresholds 数组的长度是不一样的。
# 具体来说,precision 和 recall 的数组长度比 thresholds 的数组长度多1。这是因为 precision 和 recall 是基于每个阈值计算的,
# 但第一个阈值实际上是默认的阈值,即所有样本都被视为正类或负类的情况。为了使 precision 和 recall 的数组长度与 thresholds 的数组长度匹配,
# 以便于在同一图表中绘制,通常会去掉 precision 和 recall 数组中的最后一个元素。
plt.plot(thresholds, precision[:-1], 'b--', label='Precision')
plt.plot(thresholds, recall[:-1], 'g-', label='Recall')
plt.show()
## ROC曲线
