首页 > 技术文章 > sklearn——metrics模型评估指标

dwithy 2019-09-25 15:58 原文

一、简介

sklearn.metrics中包含了许多模型评估指标,例如决定系数R2、准确度等,下面对常用的分类模型与回归模型的评估指标做一个区分归纳,

 

二、分类模型指标

1、准确率

  分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型。

 

对应函数:

  sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)

  • y_true:1为数组,y的真实值。
  •  y_pred:1为数组,y的预测值。
  • normalize:默认为True,显示百分数,若False则返回正确分类的样本数。
  • sample_weight:样本权重。

 

  另外,模型基本都有model.score()方法,也可以查看准确率。

 

代码实例:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

iris = load_iris()  # 读取iris数据
x_trian, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3,
                                                    random_state=0)  # 将数据分为训练集与测试集

tree_model = DecisionTreeClassifier('gini', 'best')  # 构建决策树
tree_model.fit(X=x_trian, y=y_train)  # 传入训练数据
y_pridct = tree_model.predict(x_test)  # 对测试数据进行预测
print(accuracy_score(y_test, y_pridct))  # 计算准确度 
print(tree_model.score(y_test, y_pridct))  # 计算准确度
'''  
结果:
0.9777777777777777
'''
 

 

2、分类评估指标报告

  分类评估指标报告中包含了 precision    recall  f1-score   support 四个指标,基本包括了分类需要看到的指标。

 

对应函数:

  sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False)

  • y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。 
  • y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
  • labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。
  • target_names:字符串列表,与标签匹配的可选显示名称(相同顺序)。
  • sample_weight:类似于shape = [n_samples]的数组,可选项,样本权重。
  • digits:int,输出浮点值的位数。

 

代码示例

from sklearn.metrics import classification_report

y_true=['a','b','c','a','b']
y_pre=['b','b','c','a','b']
target_names=['class_a','class_b','class_c']
print(classification_report(y_true,y_pre,target_names=target_names))

'''
结果:
              precision    recall  f1-score   support

     class_a       1.00      0.50      0.67         2
     class_b       0.67      1.00      0.80         2
     class_c       1.00      1.00      1.00         1

    accuracy                           0.80         5
   macro avg       0.89      0.83      0.82         5
weighted avg       0.87      0.80      0.79         5
'''


结果说明:

  • precision:精确度,预测为正实际也为正占预测数的比率。
  • recall:召回率,实际为正预测也为证占实际数的比率。
  • f1-score:一般形式为$f_{\beta }=\left ( 1+\beta ^{2} \right )\cdot \frac{precision\cdot recall}{\beta ^{2}\cdot precison+recall}$,所以$f_{1 }=\frac{precision\cdot recall}{precison+recall}$
  • support:支持度,即实际类别个数。
  • accuracy:准确度。
  • macro avg与weighted avg:具体请查看这个连接

 

3、混淆矩阵

  将预测结果和真实结果用混淆矩阵展示,可以用于二分类与多分类。

 

对应函数:

  sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)

  • y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。 
  • y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
  • labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。
  • sample_weight:样本权重。

 

代码示例:

  

from sklearn.metrics import precision_score,recall_score,f1_score

y_true=['a','b','c','a','b']
y_pre=['b','b','c','a','b']
target_names=['class_a','class_b','class_c']
print(precision_score(y_true,y_pre))
print(recall_score(y_true,y_pre))
print(f1_score(y_true,y_pre))

'''
结果:
[[1 1 0]
 [0 2 0]
 [0 0 1]]
'''

 

4、精确度、召回率、f1分数

  这三个指标通常用在分类中,sklearn中的函数可以用于二分类与多分类,只要调整参数average就能达到。

 

对应函数:

  precision_score、recall_score、f1_score,这三个有共同的参数,这里以precision为例:

  sklearn.metrics.precision_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)

  • y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。 
  • y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
  • labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。
  • pos_label:对二分类有用,一般不用管。
  • average:可选None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’。'binary'为二分类; ‘micro’, ‘macro’, ‘weighted’可以用于多分类,具体计算方法查看链接请点击这里

 

代码示例:

   

from sklearn.metrics import precision_score,recall_score,f1_score

y_true=['a','b','c','a','b']
y_pre=['b','b','c','a','b']
target_names=['class_a','class_b','class_c']
print(precision_score(y_true,y_pre,average='micro'))
print(recall_score(y_true,y_pre,average='micro'))
print(f1_score(y_true,y_pre,average='micro'))

'''
结果:
0.8
0.8
0.8000000000000002
'''

 

5、ROC曲线与KS曲线

  常用与逻辑回归等二分类,ROC与KS的说明在下一篇的逻辑回归、ROC曲线与KS曲线中有讲解。

 

三、回归模型指标

 1、决定系数R2

  当R2的值约接近1说明效果约好,R2=1-残差平方和/总平方和=回归平方和/总平方和。

 

对应函数:

  sklearn.metrics.r2_score(y_true, y_pred, sample_weight=None, multioutput=’uniform_average’)

  • y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。 
  • y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
  • sample_weight:样本权重。
  • multioutput:多维输入输出,可选‘raw_values’, ‘uniform_average’, ‘variance_weighted’或None。
    默认为’uniform_average’;
    ‘variance_weighted’对所有输出的分数进行平均,并根据每个输出的方差进行加权。
    ‘raw_values’对每一对应列求其R2指数,返回一个与列数相同的一维数组。

代码示例:

from sklearn.metrics import r2_score
from sklearn.linear_model import LinearRegression
import numpy as np

x=np.random.normal(0,1,[1000,1])
y=2*x**2+3

model=LinearRegression()
model.fit(x,y)
y_pre=model.predict(x)

print(r2_score(y,y_pre))



'''
结果:
3.805452379912477e-05
'''

 

2、回归方差(反应自变量与因变量之间的相关程度)

explained_variance_score(y_true, y_pred, sample_weight=None, multioutput='uniform_average')

 

3、平均绝对误差

mean_absolute_error(y_true, y_pred, sample_weight=None, multioutput='uniform_average')

 

4、均方差

mean_squared_error(y_true, y_pred, sample_weight=None, multioutput='uniform_average')

 

5、中值绝对误差

median_absolute_error(y_true, y_pred)

 

推荐阅读