**过拟合:**学习器把训练样本训练的太好了,把训练样本自身一些特点当成所有潜在样本都具有的一些性质。(用于评估模型的泛化能力)
造成的原因:
算法学习能力比较强
怎么解决呢?
增加训练种类、增加训练集(训练集多了,总不可能全学会了吧)
**欠拟合:**学习器训练的不太好,一般性质都没训练出来。(用于评估模型的泛化能力)
造成的原因:
算法学习能力低下
怎么解决呢?
优化算法、增大训练次数(我算法好一点学多一点、或者我不搞算法,我多两次总会好点)
**性能度量:**衡量模型泛化能力的评价标准。
错误率: 分类错误的样本数量占样本总数的比例。
精度: 预测正确的样本数量占样本总数的比例。
**查准率:**正确预测的样本数量占预测正确的样本的比例 (单位1:预测正确的样本数量)
**查全率:**正确预测的样本数量占正确样本的比例 (单位1:正确的样本)
对于这两个度量,一般来说一个高了另一个就低了。
误差: 学习器的实际预测输出与样本的真实输出之间的差异。
训练误差:学习器在训练集上的误差。
泛化误差:新样本的误差。
定义:以查全率为横轴,查准率为纵轴的二维坐标轴
作用:直观显示学习器在样本总体上的查全率、查准率,在进行比较是可以比较两个曲线与两个坐标轴之间的面积来判断哪一个学习器比较好(面积大的好)。
根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为整理进行预测,每次计算TPR和FPR作为横纵坐标从而绘制得到的二维坐标图。(TPR和FPR计算公式如下)
AUC:ROC曲线与横纵坐标轴的面积,进行判断两个曲线的优劣情况。
这里借鉴一篇博客中PR曲线的实现;
博客地址
关于数据集:乳腺癌数据集的原型是一组病灶造影图片,该数据集的提供者在收集到这些图片的初期,首先对图片进行了分析,从每张图片中提取主要的特征,然后编写图片处理程序,从图片中抽取这些特征。本数据集只关注了10个原始特征,然后又求得每个原始特征的标准差和最大值作为两个衍生特征,这样,最终数据集呈现出的效果便是30个特征。是一个典型的二分类问题!(数据集描述来源:https://blog.csdn.net/m0_54510474/article/details/124581706)
# 乳腺癌数据集
from sklearn.metrics import precision_recall_curve
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
data = load_breast_cancer() # load_breast_cancer()是sklearn的数据集,下面的X,y是数据集的数据和标签
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=66) # 分割数据集
model = LogisticRegression(solver='liblinear') # 采用liblinear优化算法的逻辑回归分类算法
# 训练模型
model.fit(X_train, y_train)
# 表示通过度量样本距离分隔超平面距离的来表示置信度。
scores = model.decision_function(X_test)
# 计算不同概率阈值的精确召回对(每个X_test中会计算出一个scores,根据score计算精确-召回对)
precisions, recalls, thresholds = precision_recall_curve(y_test, scores)
# 绘图
plt.plot(precisions, recalls)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.show()
PR曲线:
函数的讲解:
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(solver='liblinear')
源码:
sklearn.linear_model.LogisticRegression(penalty='l2', *, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)
多余的参数可以看一下这篇博客:回归函数讲解
这里的solver是定义优化算法的,这里采用的是liblinear,针对线性分类的一个工具,适合小数据集。
scores = model.decision_function(X_test)
表示通过度量样本距离分隔超平面距离的来表示置信度。但是具体是啥我好想要而不是很明白,先留在这里,万一过几天懂了呢。
现在初步理解就是与线性分类线的距离,用于计算查准率(Precision)和查全率(Recall)
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_test, scores)
函数源码:
sklearn.metrics.precision_recall_curve(y_true, probas_pred, *, pos_label=None, sample_weight=None)
参数 | 说明 |
---|---|
y_true | array, shape = [n_samples] 真正的二进制标签。 如果标签既不是{-1,1}也不是{0,1},则应该明确给出pos_label。 |
probas_pred | array, shape = [n_samples] 估计的概率或决策函数。 |
pos_label | int or str, default=None 正例类别的标签。当pos_label = None时,如果y_true在{-1,1}或{0,1}中,则pos_label设置为1,否则将引发错误。 |
sample_weight | array-like of shape (n_samples,), default=None |
返回值 | 说明 |
---|---|
precision | array, shape = [n_thresholds + 1] 精度值,以使元素i为score>=thresholds [i]且最后一个元素为1的预测精度。 |
recall | array, shape = [n_thresholds + 1] 降低召回值使元素i为score> = thresholds [i]且最后一个元素为0的预测的召回。 |
thresholds | array, shape = [n_thresholds <= len(np.unique(probas_pred))] 用于计算精度和召回率的决策函数的阈值不断增加。 |
(上述表格转自:sklearn.metrics.precision_recall_curve-scikit-learn中文社区)
ROC曲线借鉴了这篇博客:https://blog.csdn.net/wxfu2010/article/details/113852352
import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
# auc的输入为很简单,就是fpr, tpr值(至于这两个怎么算请看上面基本参数的介绍)
auc = metrics.auc(fpr, tpr)
#画图
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
lw=lw, label='ROC curve (area = %0.2f)' % auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
ROC曲线:
函数的讲解:
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
参数 | 说明 |
---|---|
y_true | 数组,存储数据的标签,维度就是样本数,形如[0,1,1,0,1…]这样的,也可以是-1和1,只要有两个值 |
y_score | 数组,存储数据的预测概率值,维度也是样本数,形如[0.38,0.5,0.8]这样的(总之就是一一对应的) |
pos_label | 整型或字符串,当y_true中只有一个值时,比如都是1或者都是0,无法判断哪个是正样本,需要用一个数字或字符串指出 |
sample_weight | 采样权重,这个官方没有仔细说,是一个可选参数,有待考察 |
drop_intermediate | 丢掉一些阈值,以便画roc曲线图 |
返回值 | 说明 |
---|---|
FPR | 数组,随阈值上涨的假阳性率 |
TPR | 数组,随阈值上涨的真正例率 |
thresholds | 数组,对预测值排序后的score列表,作为阈值,排序从大到小 |