在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
精确率:预测结果为正例样本中真实为正例的比例(了解)
召回率:真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)
print("精确率和召回率为:", classification_report(y_test, lr.predict(x_test), labels=[2, 4], target_names=['良性', '恶性']))
假设这样一个情况,如果99个样本癌症,1个样本非癌症,不管怎样我全都预测正例(默认癌症为正例),准确率就为99%但是这样效果并不好,这就是样本不均衡下的评估问题
模型有很多评估方法,为什么还要使用ROC和AUC呢?
因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现样本类不平衡,即正负样本比例差距较大,而且测试数据中的正负样本也可能随着时间变化。
ROC曲线,通过将连续变量设定出多个不同的临界值,从而计算出一系列真正率和假正率,再以假正率为横坐标、真正率为纵坐标绘制成曲线,曲线下面积越大,推断准确性越高。在ROC曲线上,最靠近坐标图左上方的点为假正率和真正率均较高的临界值。
对于分类器,或者说分类算法,评价指标主要有Precision,Recall,F-score。下图是一个ROC曲线的示例。
ROC曲线的横坐标为False Positive Rate(FPR),纵坐标为True Positive Rate(TPR)。其中
T P R = T P T P + F N , F P R = F P F P + T N TPR = \frac{TP}{TP+FN} ,FPR = \frac{FP}{FP+TN} TPR=TP+FNTP,FPR=FP+TNFP
下面着重介绍ROC曲线图中的四个点和一条线
ROC曲线所覆盖的面积称为AUC(Area Under Curve),可以更直观的判断学习器的性能,AUC越大则性能越好。
1、分析数据
y_true = [0, 0, 1, 1];scores = [0.1, 0.4, 0.35, 0.8];
2、列表
样本 | 预测属于P的概率(score) | 真实类别 |
---|---|---|
y[0] | 0.1 | N |
y[1] | 0.4 | N |
y[2] | 0.35 | P |
y[3] | 0.8 | P |
3、将截断点依次取为score值,计算TPR和FPR。
当截断点为0.1时:
说明只要score>=0.1,它的预测类别就是正例。 因为4个样本的score都大于等于0.1,所以,所有样本的预测类别都为P。
scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [1, 1, 1, 1];
正例与反例信息如下:
正例 | 反例 | |
---|---|---|
正例 | TP=2 | FN=0 |
反例 | FP=2 | TN=0 |
由此可得:
TPR = TP/(TP+FN) = 1; FPR = FP/(TN+FP) = 1;
当截断点为0.35时:
scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 1, 1, 1];
正例与反例信息如下:
正例 | 反例 | |
---|---|---|
正例 | TP=2 | FN=0 |
反例 | FP=1 | TN=1 |
由此可得:
TPR = TP/(TP+FN) = 1; FPR = FP/(TN+FP) = 0.5;
当截断点为0.4时:
scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 1, 0, 1];
正例与反例信息如下:
正例 | 反例 | |
---|---|---|
正例 | TP=1 | FN=1 |
反例 | FP=1 | TN=1 |
由此可得:
TPR = TP/(TP+FN) = 0.5; FPR = FP/(TN+FP) = 0.5;
当截断点为0.8时:
scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 0, 0, 1];
正例与反例信息如下:
正例 | 反例 | |
---|---|---|
正例 | TP=1 | FN=1 |
反例 | FP=0 | TN=2 |
由此可得:
TPR = TP/(TP+FN) = 0.5; FPR = FP/(TN+FP) = 0;
4、根据TPR、FPR值,以FPR为横轴,TPR为纵轴画图。
下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率。
步骤:
1、假设已经得出一系列样本被划分为正类的概率,按照大小排序。
2、从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。
3、每次选取一个不同的threshold,得到一组FPR和TPR,即ROC曲线上的一点。以此共得到20组FPR和TPR的值。
4、根据3、中的每个坐标点,画图。
最终AUC的范围在[0.5, 1]之间,并且越接近1越好
from sklearn.metrics import roc_auc_score
sklearn.metrics.roc_auc_score(y_true, y_score)
# 0.5~1之间,越接近于1约好
y_test = np.where(y_test > 2.5, 1, 0)
print("AUC指标:", roc_auc_score(y_test, lr.predict(x_test)))
M S E = 1 m ∑ i = 1 m ( y i − y ^ ) 2 y i 为 预 测 值 y ^ 为 真 实 值 MSE = \frac{1}{m}\sum_{i=1}^{m}(y^i-\hat{y})^2\\y^i为预测值\\ \hat{y}为真实值 MSE=m1i=1∑m(yi−y^)2yi为预测值y^为真实值
聚类(Clustering)
分类(Classification)
算法名称 | 可伸缩性 | 适合的数据类型 | 高维性 | 异常数据抗干扰性 | 聚类形状 | 算法效率 |
---|---|---|---|---|---|---|
WAVECLUSTER | 很高 | 数值型 | 很高 | 较高 | 任意形状 | 很高 |
ROCK | 很高 | 混合型 | 很高 | 很高 | 任意形状 | 一般 |
BIRCH | 较高 | 数值型 | 较低 | 较低 | 球形 | 很高 |
CURE | 较高 | 数值型 | 一般 | 很高 | 任意形状 | 较高 |
K-PROTOTYPES | 一般 | 混合型 | 较低 | 较低 | 任意形状 | 一般 |
DENCLUE | 较低 | 数值型 | 较高 | 一般 | 任意形状 | 较高 |
OPTIGRID | 一般 | 数值型 | 较高 | 一般 | 任意形状 | 一般 |
CLIQUE | 较高 | 数值型 | 较高 | 较高 | 任意形状 | 较低 |
DBSCAN | 一般 | 数值型 | 较低 | 较高 | 任意形状 | 一般 |
CLARANS | 较低 | 数值型 | 较低 | 较高 | 球形 | 较低 |
交叉验证目的:为了让被评估的模型更加准确可信
交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证。
我们之前知道数据分为训练集和测试集,但是**为了让从训练得到模型结果更加准确。**做以下处理
验证集 | 训练集 | 训练集 | 训练集 | 80% |
---|---|---|---|---|
训练集 | 验证集 | 训练集 | 训练集 | 78% |
训练集 | 训练集 | 验证集 | 训练集 | 75% |
训练集 | 训练集 | 训练集 | 验证集 | 82% |
问题:那么这个只是对于参数得出更好的结果,那么怎么选择或者调优参数呢?
通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
K值 | K=3 | K=5 | K=7 |
---|---|---|---|
模型 | 模型1 | 模型2 | 模型3 |
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
# 使用网格搜索和交叉验证找到合适的参数
knn = KNeighborsClassifier()
param = {"n_neighbors": [3, 5, 10]}
gc = GridSearchCV(knn, param_grid=param, cv=2)
gc.fit(x_train, y_train)
print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))
# 训练验证集的结果
print("在交叉验证当中验证的最好结果:", gc.best_score_)
print("gc选择了的模型K值是:", gc.best_estimator_)
print("每次交叉验证的结果为:", gc.cv_results_)
1、扩大数据集
2、对大类数据欠采样
3、对小类数据过采样
4、使用新评价指标
5、选择新算法
6、数据代价加权
7、转化问题思考角度
8、将问题细化分析