#sklearn代码实例
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
第一个字符代表预测表现,第二个字符对于实际表现来说是预测对或错。
TP:预测为1,预测正确,即实际1
FP:预测为1,预测错误,即实际0
FN:预测为0,预测错确,即实际1
TN:预测为0,预测正确即,实际0
(召回率针对原样本,含义是预测正确的样本数占实际为正样本的百分比),分母为实际为正的样本数。
利用混淆矩阵表示就是recall_score=TP/(TP+FN)
#sklearn代码实例
recall_score=recall_score(y_true, y_pred,labels=None,pos_label=1,average='binary', sample_weight=None)
多分类时候指定参数average : string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]
(准确率是指预测正确的样本数占总样本百分比)
利用混淆矩阵表示就是accuracy_score=(TP+TN)/(TP+TN+FP+FN)
#sklearn代码实例
accuracy_score=accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
准确率是分类问题中最简单也是最直观的评价指标, 但存在明显的缺陷。 比
如, 当负样本占99%时, 分类器把所有样本都预测为负样本也可以获得99%的准确
率。 所以, 当不同类别的样本比例非常不均衡时, 占比大的类别往往成为影响准
确率的最主要因素。
它是针对预测结果而言的,它的含义是预测正确的样本数占预测为正样本的百分比,意思就是在预测为正样本的结果中,我们有多少把握可以预测正确,即预测的有多少个为正样本。分母为预测为正的样本数
精确率代表对正样本结果中的预测准确程度,而准确率则代表整体的预测准确程度,既包括正样本,也包括负样本,和样本比例有很大关系。
#sklearn代码实例
precision_score=precision_score(y_true, y_pred[, labels, …])
F1-score是精准率和召回率二者的评估,F1分数同时考虑了精准率和召回率,让二者同时达到最高,取一个平衡。F1分数的公式为 = 2精准率召回率 / (精准率 +召回率)。
#sklearn代码实例
f1_score=f1_score(y_true, y_pred)
classification_report函数会输出包含召回率,精确率,F1值的表
from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
P-R曲线综合考虑了精确率和召回率,P-R曲线的横轴是召回率, 纵轴是精确率。 对于一个排序模型来说, 其P-R曲线上的一个点代表着, 在某一阈值下, 模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本, 此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到低移动而生成的。
曲线分析:
当召回率接近于0时, 模型A的精确率为0.9, 模型B的精确率是1,这说明模型B得分前几位的样本全部是真正的正样本, 而模型A即使得分最高的几个样本也存在预测错误的情况。 并且, 随着召回率的增加, 精确率整体呈下降趋势。 但是, 当召回率为1时, 模型A的精确率反而超过了模型B。
RMSE经常被用来衡量回归模型的好坏,一般情况下, RMSE能够很好地反映回归模型预测值与真实值的偏离程度。 但在实际问题中, 如果存在个别偏离程度非常大的离群点 时, 即使离群点数量非常少, 也会让RMSE指标变得很差。
存在离群点解决办法:
Precision值和Recall值是既矛盾又统一的两个指标, 为了提高Precision值, 分
类器需要尽量在“更有把握”时才把样本预测为正样本, 但此时往往会因为过于保 守而漏掉很多“没有把握”的正样本, 导致Recall值降低。
Precision值代表对正样本结果中的预测准确程度,而accuracy_score则代表整体的预测准确程度,既包括正样本,也包括负样本,和样本比例有很大关系。
Precision值和Recall值是既矛盾又统一的两个指标, 为了提高Precision值, 分 类器需要尽量在“更有把握”时才把样本预测为正样本, 但此时往往会因为过于保 守而漏掉很多“没有把握”的正样本,导致Recall值降低。
每个评估指标都有其价值, 但如果只从单一的评估指标出发去评估模型, 往往会得出片面甚至错误的结论; 只有通过一组互补的指标去评估模型,
才能更好地发现并解决模型存在的问题, 从而更好地解决实际业务场景中遇到的问题。
TPR和FPR都主要关注正样本
真正率FPR为有多少负样本被错误预测为正样本
假正率TPR为有多少正样本被正确预测为正样本
二分类的时候,可以利用roc_curve计算fpr,tpr,和阈值thresholds;,并画出roc曲线,利用roc_auc_score计算auc的值
fpr,tpr,thresholds=roc_curve(y_test,y_pred, pos_label=None, sample_weight=None, drop_intermediate=True)
print (tpr,fpr,thresholds)
roc_auc = auc(fpr, tpr)#计录auc的值,在(0,1)之间
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()
(1)ROC曲线能很容易的查出任意阈值对学习器的泛化性能影响。
(2)有助于选择最佳的阈值。ROC曲线越靠近左上角,模型的查全率就越高。最靠近左上角的ROC曲线上的点是分类错误最少的最好阈值,其假正例和假反例总数最少。
(3)可以对不同的学习器比较性能。将各个学习器的ROC曲线绘制到同一坐标中,直观地鉴别优劣,靠近左上角的ROC曲所代表的学习器准确性最高
AUC面积的一般判断标准,面积在0到1之间,AUC越高,模型区分能力越好
0.5 - 0.7:效果较低,但用于预测股票已经很不错了
0.7 - 0.85:效果一般
0.85 - 0.95:效果很好
0.95 - 1:效果非常好,但一般不太可能
(1)roc_auc_score
根据预测值和真实值确定AUC的值
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
AUC=roc_auc_score(y_true, y_pred)
print (AUC)
(2)roc_curve(二分类有效)
根据曲线上的值确定AUC的值
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)
print (fpr,tpr,thresholds)
print (auc(fpr, tpr))
roc_curve返回这三个变量:fpr,tpr,和阈值thresholds;
from sklearn.metrics import accuracy_score
score方法是模型在训练集上训练,可以得到测试集上测试得分和训练集上训练得分,适用于train_test_split划分数据集后看模型得分,适用于交叉验证,或者用cross_val_score
clf.fit(x_data_train,y_data_train)
test_acc = clf.score(x_data_test,y_data_test)
train_acc = clf.score(x_data_train,y_data_train)
print(train_acc)#训练得分
print(test_acc)#测试得分
accuracy_score方法是将模型预测的标签与真实标签进行对比,预测得分
clf.fit(x_data_train,y_data_train)
y_pred=clf.predict(x_data_test)
print (accuracy_score(y_data_test, y_pred))
绘制train_error 与test_error曲线
from sklearn import tree
import numpy as np
from sklearn import datasets,model_selection
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
iris=datasets.load_iris()
X=iris.data
y=iris.target
X_train,X_test,y_train,y_test=model_selection.train_test_split(X,y,test_size=0.3,random_state=0)
maxdepth = 40
depths=np.arange(1,maxdepth)
training_scores=[]
testing_scores=[]
for depth in depths:
clf = tree.DecisionTreeClassifier(max_depth=depth)
clf.fit(X_train, y_train)
training_scores.append(clf.score(X_train,y_train))
testing_scores.append(clf.score(X_test,y_test))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(depths,training_scores,label="traing score",marker='o')
ax.plot(depths,testing_scores,label="testing score",marker='*')
ax.set_xlabel("maxdepth")
ax.set_ylabel("score")
ax.set_title("Decision Tree Classification"
ax.legend(framealpha=0.5,loc='best')
plt.show()
from sklearn import tree
import numpy as np
import pandas as pd
import pydotplus
from sklearn.metrics import accuracy_score
from sklearn import datasets,model_selection
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score,cross_val_predict,cross_validate
from sklearn.model_selection import validation_curve
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.metrics import recall_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
from sklearn.metrics import roc_auc_score
iris=datasets.load_iris() # scikit-learn 自带的 iris 数据集
X=iris.data
y=iris.target
X_train,X_test,y_train,y_test=model_selection.train_test_split(X,y,test_size=0.3,random_state=0)
clf = tree.DecisionTreeClassifier(criterion='gini').fit(X_train, y_train)
y_pred=clf.predict(X_test)
print (accuracy_score(y_test,y_pred))
print (recall_score(y_test, y_pred, average='macro'))
print (recall_score(y_test, y_pred, average='micro'))
print (recall_score(y_test, y_pred, average='weighted'))
print (recall_score(y_test, y_pred, average=None))#none 返回每一类别的召回率
print (confusion_matrix(y_test, y_pred))
print (classification_report(y_test, y_pred))#F1分数,很好平衡了召回率和精准率,让二者同时达到最高,取一个平衡。
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)
print (fpr,tpr,thresholds)
print (auc(fpr, tpr))
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
AUC=roc_auc_score(y, scores)
print (AUC)
验证曲线和学习曲线详见我的另一篇博客
过拟合是指模型对于训练数据拟合呈过当的情况, 反映到评估指标上, 就是
模型在训练集上的表现很好, 但在测试集和新数据上的表现较差。 欠拟合指的是
模型在训练和预测时表现都不好的情况。 图2.5形象地描述了过拟合和欠拟合的区
别。
数据+模型+正则+集成
参考资料
神经网络中欠拟合和过拟合的优化详见此博客
欠拟合和过拟合的一般解决方法一
欠拟合和过拟合的一般解决方法二