EduCoder:机器学习—模型评估、选择与验证
第1关:为什么要有训练集与测试集
第2关:欠拟合与过拟合
第3关:偏差与方差
第4关:验证集与交叉验证
第5关:衡量回归的性能指标
第6关:准确度的陷阱与混淆矩阵
编程要求:
根据提示,在 Begin-End 区域填写 python 代码,完成 confusion_matrix 函数实现二分类混淆矩阵的构建。
confusion_matrix 函数中的参数:
-
y_true:数据的真实类别,类型为 ndarray;
-
y_predict:模型预测的类别,类型为 ndarray。
测试说明:
平台会对你编写的代码进行测试,期望您的代码根据输入来输出正确的混淆矩阵,以下为其中一个测试用例(y_true 表示真实类别,y_predict 表示预测类别):
测试输入:
{‘y_true’:[1, 0, 0, 1, 0, 1, 0], ‘y_predict’:[0, 1, 0, 1, 0, 1, 0]}
预期输出:
[[3 1]
[1 2]]
代码如下:
import numpy as np
def confusion_matrix(y_true, y_predict):
'''
构建二分类的混淆矩阵,并将其返回
:param y_true: 真实类别,类型为ndarray
:param y_predict: 预测类别,类型为ndarray
:return: shape为(2, 2)的ndarray
'''
#********* Begin *********#
def TN(y_true,y_predict):
return np.sum((y_true==0) & (y_predict==0))
def FP(y_true,y_predict):
return np.sum((y_true==0) & (y_predict==1))
def FN (y_true,y_predict):
return np.sum((y_true==1)& (y_predict==0))
def TP(y_true,y_predict):
return np.sum((y_true==1)& (y_predict==1))
return np.array([
[TN(y_true,y_predict),FP(y_true,y_predict)],
[FN(y_true,y_predict),TP(y_true,y_predict)]
])
#********* End *********#
第7关:精准率与召回率
编程要求:
根据提示,在 Begin-End 区域填写 python 代码,完成 precision_score 函数和 recall_score 函数分别实现计算精准率和召回率。
precision_score函数中的参数:
-
y_true :数据的真实类别,类型为 ndarray;
-
y_predict :模型预测的类别,类型为 ndarray。
-
recall_score 函数中的参数:
-
y_true:数据的真实类别,类型为 ndarray;
-
y_predict:模型预测的类别,类型为 ndarray
测试说明:
平台会对你编写的代码进行测试,期望您的代码根据输入来输出正确的精准率和召回率,以下为其中一个测试用例( y_true 表示真实类别,y_predict 表示预测类别):
测试输入:
{‘y_true’:[1, 0, 0, 1, 0, 1, 0], ‘y_predict’:[0, 1, 0, 1, 0, 1, 0]}
预期输出:
0.666667, 0.666667
代码如下:
import numpy as np
def precision_score(y_true, y_predict):
'''
计算精准率并返回
:param y_true: 真实类别,类型为ndarray
:param y_predict: 预测类别,类型为ndarray
:return: 精准率,类型为float
'''
#********* Begin *********#
def TN(y_true,y_predict):
return np.sum((y_true==0) & (y_predict==0))
def FP(y_true,y_predict):
return np.sum((y_true==0)& (y_predict==1))
def FN(y_true,y_predict):
return np.sum((y_true==1) & (y_predict==0))
def TP(y_true,y_predict):
return np.sum((y_true==1)& (y_predict==1))
return TP(y_true,y_predict)/(TP(y_true,y_predict)+FP(y_true,y_predict))
#********* End *********#
def recall_score(y_true, y_predict):
'''
计算召回率并召回
:param y_true: 真实类别,类型为ndarray
:param y_predict: 预测类别,类型为ndarray
:return: 召回率,类型为float
'''
#********* Begin *********#
def TP(y_true,y_predict):
return np.sum((y_true==1) & (y_predict==1))
def FN(y_true,y_predict):
return np.sum((y_true==1)& (y_predict==0))
tp=TP(y_true,y_predict)
fn=FN(y_true,y_predict)
try:
return tp/(tp+fn)
except:
return 0.0
#********* End *********#
第8关:F1 Score
编程要求:
根据提示,在 Begin-End 区域填写 python 代码,完成 f1_score 函数实现计算 F1 Score。
f1_score 函数中的参数:
-
precision:模型的精准率,类型为 float;
-
recall:模型的召回率,类型为 float 。
测试说明:
平台会对你编写的代码进行测试,期望您的代码根据输入来返回正确的 F1 Score ,以下为其中一个测试用例(列表中的第一个数字表示精准率,第二个数字表示召回率):
测试输入:
[0.7, 0.2]
预期输出:
0.311111
代码如下:
import numpy as np
def f1_score(precision, recall):
'''
计算f1 score并返回
:param precision: 模型的精准率,类型为float
:param recall: 模型的召回率,类型为float
:return: 模型的f1 score,类型为float
'''
#********* Begin *********#
score=(2*precision*recall)/(precision+recall)
return score
#********* End ***********#
第9关:ROC曲线与AUC
编程要求:
根据提示,在 Begin-End 区域填写 python 代码,完成 calAUC 函数实现计算 AUC 并返回。
calAUC 函数中的参数:
-
prob:模型预测样本为 Positive 的概率列表,类型为 ndarray;
-
labels:样本的真实类别列表,其中 1 表示 Positive ,0 表示 Negtive ,类型为 ndarray 。
测试说明:
平台会对你编写的代码进行测试,期望您的代码根据输入来返回正确的 AUC,以下为其中一个测试用例(字典中的 probs 部分代表模型认为样本是 Positive 的概率,labels 部分代表样本的真实类别,1 表示 Positive, 0 表示 Negtive ):
测试输入:
{‘probs’:[0.1, 0.4, 0.3, 0.8], ‘labels’:[0, 0, 1, 1]}
预期输出:
0.75
代码如下:
import numpy as np
def calAUC(prob, labels):
'''
计算AUC并返回
:param prob: 模型预测样本为Positive的概率列表,类型为ndarray
:param labels: 样本的真实类别列表,其中1表示Positive,0表示Negtive,类型为ndarray
:return: AUC,类型为float
'''
#********* Begin *********#
f=list(zip(prob,labels))
rank=[values2 for values1,values2 in sorted(f,key=lambda x:x[0])]
rankList=[i+1 for i in range(len(rank)) if rank[i]==1]
posNum=0
negNum=0
for i in range(len(labels)):
if(labels[i]==1):
posNum+=1
else:
negNum+=1
auc=(sum(rankList)-(posNum*(posNum+1))/2)/(posNum*negNum)
return auc
#********* End *********#
第10关:sklearn中的分类性能指标
编程要求:
在 Begin-End 区域填写classification_performance(y_true, y_pred, y_prob)函数分别计算模型的准确度、精准率、召回率、F1-Score 和 AUC 并将其返回,其中:
- y_true :样本的真实类别,类型为 ndarray;
- y_pred :模型预测出的类别,类型为 ndarray;
- y_prob :模型预测样本为 Positive 的概率,类型为 ndarray。
测试说明:
平台会对你编写的代码进行测试,期望您的代码根据输入来按顺序返回正确的准确度、精准率、召回率、 F1-Score 和 AUC,以下为其中一个测试用例(字典中的 y_prob 部分代表模型认为样本是 Positive 的概率;y_true 部分代表样本的真实类别,1 表示 Positive, 0 表示 Negtive;y_pred 部分代表模型预测的类别):
测试输入:
{‘y_prob’:[0.7, 0.2, 0.9, 0.8],‘y_true’:[0, 0, 1, 1],‘y_pred’:[1, 0, 1, 1]}
预期输出:
0.750000, 0.666667, 1.000000, 0.800000, 1.000000
代码如下:
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
def classification_performance(y_true, y_pred, y_prob):
'''
返回准确度、精准率、召回率、f1 Score和AUC
:param y_true:样本的真实类别,类型为`ndarray`
:param y_pred:模型预测出的类别,类型为`ndarray`
:param y_prob:模型预测样本为`Positive`的概率,类型为`ndarray`
:return:
'''
#********* Begin *********#
a=accuracy_score(y_true,y_pred)
b=precision_score(y_true,y_pred)
c=recall_score(y_true,y_pred)
d=f1_score(y_true,y_pred)
e=roc_auc_score(y_true,y_prob)
return (a,b,c,d,e)
#********* End *********#