汽车评估
机器学习 第十四组 “人见人爱,花见花开!”
HNU-机器学习笔记:模型准确度无论是用留出法还是交叉验证亦或是自助法都是无法准确的反应模型能力的!
因为这个准确度会随着数据集划分的不同而改变
所以我们需要使用一些更有说服力的指标去评价一个模型,比如这里的ROC曲线,PR曲线,混淆矩阵!
转化为one-hot的代码
from sklearn.preprocessing import label_binarize
y_test = label_binarize(Ytest, classes=[ 1, 2, 3, 4]) #作为函数第一个接口
n_classes = y_test.shape[1] # 几分类作为函数第三个接口
预测结果的获得代码
y_score = clf.predict_proba(Xtest) # Xtest为划分的测试数据 clf为训练出来的决策树模型
# 模型的搭建不是本文的重点,就不再纠缠了!
注意y_test要转化为one-hot编码
# y_test为one-hot编码的测试数据的真实结果
# y_score为预测结果的概率
# n_classes为one-hot编码的类别数
def get_roc(y_test,y_score,n_classes):
from sklearn.metrics import roc_curve, auc # sklearn版本为0.20.2
import matplotlib.pyplot as plt
colors = ['blue', 'red', 'green', 'black', 'yellow']
# titles需要自己看情况更改,课程作业是汽车评估,所以是4个类别+一个平均值,titles长度为n_classes+1
titles = ['unacc ','acc ','good ','v-good','average']
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
# print(roc_auc[i])
plt.plot(fpr[i], tpr[i],color=colors[i],label=titles[i]+'AUC = %0.6f'% roc_auc[i])
plt.title(titles[i])
plt.xlabel('False Positive Rate') #横坐标是fpr
plt.ylabel('True Positive Rate') #纵坐标是tpr
plt.title('ROC')
plt.legend()
plt.style.use('seaborn') #选择'seaborn'画布分格,使绘图美观一点
plt.show()
# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
plt.plot(fpr["micro"], tpr["micro"],color=colors[0],label=titles[4]+'AUC = %0.6f'% roc_auc["micro"])
plt.legend(loc='lower right')
plt.xlabel('False Positive Rate') #横坐标是fpr
plt.ylabel('True Positive Rate') #纵坐标是tpr
plt.style.use('seaborn') #选择'seaborn'画布分格,使绘图美观一点
plt.show()
从图上可以看出,roc曲线没有roc曲线的梯度特征,而是达到一定高度后直接以斜线的姿势俯冲到了终点,很奇怪!!!
原因就在于求fpr和tpr之前,我们要计算每个类别的概率!如果决策树的叶子节点的纯度太高就会导致概率为[0,0,1,0]这种,出现三个0,一个1的情况。就会出现如图的现象,其实是一个比较好的现象吧!!!
我们不妨通过预剪枝来降低叶子节点的纯度,再来看看其roc图
我们设置如果叶子节点的个数小于15个就剪枝,之后的roc曲线变成了如下
这样的roc曲线就可以我们书本上的曲线是类似的,出现了梯度了!!!
三个参数的获得方法在上面有写过了,就不再重复了
# y_test为one-hot编码的预测结果
# y_score为预测值的概率
# n_classes为ont-hot编码的类别数
def get_PR(y_test,y_score,n_classes):
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score # sklearn版本为0.20.2
import matplotlib.pyplot as plt
precision = dict()
recall = dict()
average_precision = dict()
for i in range(n_classes):
precision[i], recall[i], _ = precision_recall_curve(y_test[:, i], y_score[:, i])
average_precision[i] = average_precision_score(y_test[:, i], y_score[:, i])
precision["micro"], recall["micro"], _ = precision_recall_curve(y_test.ravel(), y_score.ravel())
average_precision["micro"] = average_precision_score(y_test, y_score, average="micro")
# Plot Precision-Recall curve for each class
plt.style.use('seaborn') #选择'seaborn'画布分格,使绘图美观一点
plt.clf()#clf 函数用于清除当前图像窗口
plt.plot(recall["micro"], precision["micro"],
label='micro-average Precision-recall curve (area = {0:0.6f})'.format(average_precision["micro"]))
for i in range(n_classes):
plt.plot(recall[i], precision[i],
label='Precision-recall curve of class {0} (area = {1:0.6f})'.format(i, average_precision[i]))
#xlim、ylim:分别设置X、Y轴的显示范围。
# plt.xlim([0.0, 1.0])
# plt.ylim([0.0, 1.05])
#设置横纵坐标标题
plt.xlabel('Recall', fontsize=16)
plt.ylabel('Precision',fontsize=16)
#设置P-R图的标题
plt.title('Extension of Precision-Recall curve to multi-class',fontsize=16)
plt.legend(loc="lower right")#legend 是用于设置图例的函数
plt.show()
获得测试机预测结果代码
y_predict=clf.predict(Xtest) # clf为训练好的模型,Xtest的测试集数据
# y_test为测试集的结果
# y_predict为测试集的预测结果
def get_Confusion_Matrix(y_test,y_predict):
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
confusion_matrix = confusion_matrix(y_test,y_predict)
f, ax = plt.subplots(figsize=(10, 7))
plt.xticks(rotation='90')
sns.heatmap(confusion_matrix, square=True, linewidths=.5, annot=True)
plt.show()
收藏文章,留下评论,过几天就给你飞一样地感觉!!!