zoukankan      html  css  js  c++  java
  • MachineLearning入门-12(算法评估矩阵)

    分类算法矩阵以逻辑回归为例,回归算法矩阵以线性回归为例,使用实际应用中最常用的10折交叉验证来分离数据,并计算展示算法的评估矩阵。

    本节使用scikit-learn的model_selection中的cross_val_score方法来评估算法,这个方法不仅适用于分类算法,也适用于回归算法。


    分类算法矩阵

    下面介绍以下几种用来评估分类算法的评估矩阵:

    • 分类准确度
    • 对数损失函数(Logloss)
    • AUC图
    • 混淆矩阵
    • 分类报告(Classification Report)

    分类准确度

    就是算法自动分类正确的样本数除以所有的样本数得出的结果。通常,准确度越高,分类器越好。

    准确度确实是一个很好、很直观的评价指标,但是有时候准确度高并不代表算法就一定好。

     1 #算法评估
     2 from pandas import read_csv
     3 from sklearn.model_selection import KFold
     4 from sklearn.model_selection import cross_val_score
     5 from sklearn.linear_model import LogisticRegression
     6 
     7 filename='/home/aistudio/work/pima_data1.csv'
     8 names=['preg','plas','pres','skin','test','mass','pedi','age','class']
     9 data=read_csv(filename,names=names)
    10 #将数据分为输入数据和输出数据
    11 array=data.values
    12 x=array[:,0:8]
    13 y=array[:,8]
    14 num_folds=10
    15 seed=7
    16 kfold=KFold(n_splits=num_folds,random_state=seed)
    17 model=LogisticRegression()
    18 
    19 print('Start------------')
    20 result=cross_val_score(model,x,y,cv=kfold)
    21 print('算法评估结果:%.3f%% (%.3f%%)' % (result.mean()*100,result.std()*100))
    22 print('End------------')

    执行结果:

    Start------------
    算法评估结果:76.951% (4.841%)
    End------------

    对数损失函数
    在逻辑回归的推导中,它假设样本服从伯努利分布(0~1分布),然后求得满足该分布的似然函数,再取对数,求极值等。而逻辑回归并没有求似然函数的极值,而是把极大化当作一种思想,进而推导出它的经验风险函数:最小化负的似然函数
    [max F(y,f(x)) -> min -F(y,f(x))]
    从损失函数的视觉来看,他就成了对数(log)损失函数了。
    对数损失函数越小,模型就越好,而且时损失函数越小,模型就越好,而且使损失函数尽量是一个凸函数,便于收敛计算。
     1 #对数损失函数
     2 from pandas import read_csv
     3 from sklearn.model_selection import KFold
     4 from sklearn.model_selection import cross_val_score
     5 from sklearn.linear_model import LogisticRegression
     6 
     7 filename='/home/aistudio/work/pima_data1.csv'
     8 names=['preg','plas','pres','skin','test','mass','pedi','age','class']
     9 data=read_csv(filename,names=names)
    10 #将数据分为输入数据和输出数据
    11 array=data.values
    12 x=array[:,0:8]
    13 y=array[:,8]
    14 num_folds=10
    15 seed=7
    16 kfold=KFold(n_splits=num_folds,random_state=seed)
    17 model=LogisticRegression()
    18 
    19 print('Start------------')
    20 scoring='neg_log_loss'
    21 result=cross_val_score(model,x,y,cv=kfold,scoring=scoring)
    22 print('Logloss:%.3f (%.3f)' % (result.mean(),result.std()))
    23 print('End------------')
    Start------------
    Logloss:-0.493 (0.047)
    End------------

    AUC图

    ROC和AUC是评价分类器的指标。
    ROC是受试者工作特征曲线(Receiver Operating Characteristic Curve)的简写,又称感受性曲线(sensitivity Curve)。得此名的原因在于曲线上各点反应相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不同的判定标准下所得的结果而已。ROC
    是反应敏感性和特异性连续变量的综合指标,用构图法揭示敏感性和特异性的相互关系,通过将连续变量设定出多个不同的临界值,再以敏感性为纵坐标,特异性横坐标绘制呈曲线。

    AUC是ROC曲线下的面积(Area Under ROC Curve)的简称,就是处于ROC Curve下方的那部分面积大小。通常,AUC的值介于0.5到1.0之间,AUC值越大,诊断准确性越高。在ROC曲线上,靠近坐标图左上方的点为敏感性和特异性均较高的临界值。
        实际
        1 0
    预测 1

    True Postive(TP)

    真正

    False Positive(FP)

    假正

    0

    False Negative(FN)

    假负

    True Negative(TN)

    真负


    基于该列联表,定义敏感性指标为:sensitivity=TP/(TP+FN).敏感性指标又称为真正类率(True Positive Rate,TPR),计算的是分类器所识别出的正实列占所有正实例的比例。
    另外,定义负正实例率(False Positive Rate, FPR)的计算公式:FPR=FP/(FP+TN),负正类率计算的是分类器报错认为正类的负实例占所有负实例的比率。
    定义特异性指标为;Specificity=TN/(FP+TN)=1-FPR.特异性指标又称为真负类率(True Negative Rate,TNR)。
     1 #AUC 
     2 from pandas import read_csv
     3 from sklearn.model_selection import KFold
     4 from sklearn.model_selection import cross_val_score
     5 from sklearn.linear_model import LogisticRegression
     6 
     7 filename='/home/aistudio/work/pima_data1.csv'
     8 names=['preg','plas','pres','skin','test','mass','pedi','age','class']
     9 data=read_csv(filename,names=names)
    10 #将数据分为输入数据和输出数据
    11 array=data.values
    12 x=array[:,0:8]
    13 y=array[:,8]
    14 num_folds=10
    15 seed=7
    16 kfold=KFold(n_splits=num_folds,random_state=seed)
    17 model=LogisticRegression()
    18 
    19 print('Start------------')
    20 scoring='roc_auc'
    21 result=cross_val_score(model,x,y,cv=kfold,scoring=scoring)
    22 print('AUC:%.3f (%.3f)' % (result.mean(),result.std()))
    23 print('End------------')
    Start------------
    AUC:0.824 (0.041)
    End------------

    混淆矩阵

    混淆矩阵(Confusion Matrix)主要用于比较分类结果和实际测得值,可以把分类结果显示在一个混淆矩阵里面。
    混淆矩阵是可视化工具,特别适用于监督学习,在无监督学习时一般叫做匹配矩阵。
    混淆矩阵的每列代表预测类别,每列的总数表示预测为该类别的数据的数目;每行代表数据的真实归属类别,每行的数据总数表示该类别的数据数目。每列中的数值表示真实数据被预测为该类的数目。
      预测
    类1 类2 类3
    实际 类1 43 5 2
    类2 2 45 3
    类3 0 1 49
    如上表所示,有150个样本,这些数据分成3类,每类50个。分类结束后得到的混淆矩阵,每行之和为50,表示50个样本。
    第一行说明类1的50个样本有43个分类正确,5个错分为类2,2个错分为类3.
     1 #混淆矩阵
     2 from pandas import read_csv
     3 import pandas as pd
     4 from sklearn.model_selection import train_test_split
     5 from sklearn.model_selection import KFold
     6 from sklearn.model_selection import cross_val_score
     7 from sklearn.linear_model import LogisticRegression
     8 from sklearn.metrics import confusion_matrix
     9 
    10 filename='/home/aistudio/work/pima_data1.csv'
    11 names=['preg','plas','pres','skin','test','mass','pedi','age','class']
    12 data=read_csv(filename,names=names)
    13 #将数据分为输入数据和输出数据
    14 array=data.values
    15 x=array[:,0:8]
    16 y=array[:,8]
    17 test_size=0.33
    18 seed=4
    19 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=test_size,random_state=seed)
    20 model=LogisticRegression()
    21 model.fit(x_train,y_train)
    22 predicted=model.predict(x_test)
    23 matrix=confusion_matrix(y_test,predicted)
    24 classes=['0','1']
    25 dataframe=pd.DataFrame(data=matrix,index=classes,columns=classes)
    26 
    27 print('Start------------')
    28 print(dataframe)
    29 print('End------------')
    Start------------
         0   1
    0  152  19
    1   31  52
    End------------


    
    
    分类报告

    在scikit-learn中提供了一个非常方便的工具,可以给出对分类问题的评估报告,Classification_report()方法能够给出精确率(precision)。召回率(recall),F1值(F1-score)和样本数目(support)。
    TP,FN,FP,TN四种分类情况的定义:
      实际
    1 0
    预测 1

    True Positive (TP)

    真正类

    False Positive (FP)

    负正类

    0

    False Negative (FN)

    假负类

    True Negative (TN)

    真负类


    精确率P=TP/(TP+FP),计算的是所有被检测到的项目中应该被检索到的项目占比。
    召回率R=TP/(TP+FN),计算的是所有检索到的项目占所有应该检索到的项目的比例。
    F1值就是精确率和召回率的调和均值,也就是2*F1=P+R。
    代码如下:
     1 #分类报告
     2 from pandas import read_csv
     3 import pandas as pd
     4 from sklearn.model_selection import train_test_split
     5 from sklearn.model_selection import KFold
     6 from sklearn.model_selection import cross_val_score
     7 from sklearn.linear_model import LogisticRegression
     8 from sklearn.metrics import confusion_matrix
     9 from sklearn.metrics import classification_report
    10 
    11 filename='/home/aistudio/work/pima_data1.csv'
    12 names=['preg','plas','pres','skin','test','mass','pedi','age','class']
    13 data=read_csv(filename,names=names)
    14 #将数据分为输入数据和输出数据
    15 array=data.values
    16 x=array[:,0:8]
    17 y=array[:,8]
    18 test_size=0.33
    19 seed=4
    20 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=test_size,random_state=seed)
    21 model=LogisticRegression()
    22 model.fit(x_train,y_train)
    23 predicted=model.predict(x_test)
    24 
    25 print('Start------------')
    26 report=classification_report(y_test,predicted)
    27 print(report)
    28 print('End------------')

    执行结果如下:

    Start------------
                  precision    recall  f1-score   support
    
             0.0       0.83      0.89      0.86       171
             1.0       0.73      0.63      0.68        83
    
       micro avg       0.80      0.80      0.80       254
       macro avg       0.78      0.76      0.77       254
    weighted avg       0.80      0.80      0.80       254
    
    End------------


    回归算法矩阵
    平均绝对误差(mean Absolute Error, MAE)
    均方误差(Mean Squared Error, MSE)
    决定系数(R2)

    平均绝对误差

    平均绝对误差是所有单个观测值与算术平均值的偏差,的绝对值,的平均值。
    与平均误差相比,平均绝对误差由于离差被绝对值化,不会出现正负相抵消的情况,因而,平均绝对误差能更好的反映预测值误差的实际情况。
    代码如下:

    (今天不知什么情况,百度AI Notebook界面无法拷贝代码,只能截屏了)。


    均方误差

    均方误差是衡量平均误差的方法,可以评价数据的变化程度。
    均方根误差是均方误差的算术平方根。均方误差的值越小,说明用该预测模型描述实验数据的准确度越高。
     1 from pandas import read_csv
     2 from sklearn.model_selection import KFold
     3 from sklearn.model_selection import cross_val_score
     4 from sklearn.linear_model import LinearRegression
     5 
     6 filename='/home/aistudio/work/housing.csv'
     7 #names=['preg','plas','pres','skin','test','mass','pedi','age','class']
     8 names=['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
     9 data=read_csv(filename,names=names,delim_whitespace=True)
    10 array=data.values
    11 
    12 x=array[:,0:13]
    13 y=array[:,13]
    14 n_splits=10
    15 seed=7
    16 kfold=KFold(n_splits,random_state=seed)
    17 model=LinearRegression()
    18 #scoring='neg_mean_absolute_error'
    19 scoring='neg_mean_squared_error'
    20 result=cross_val_score(model,x,y,cv=kfold,scoring=scoring)
    21 print('MSE: %.3f (%.3f)' % (result.mean(),result.std()))
     
    MSE: -34.705 (45.574)
    

    决定系数R2

    决定系数,反映因变量的全部变异能通过回归关系被自变量解释的比例。
    拟合优度越大,自变量对因变量的解释程度越高,自变量引起的变动占总变动的百分比越高,观察点在回归直线附近越密集.如R2为0.8,则表示回归关系可以解释因变量80%的变异。换句话说,如果我们能控制自变量不变,则因变量的变异程度会减少80%。
    决定系数R2的特点:
    • 可决定系数是非负的统计量
    • 可决定系数的取值范围:0《=R2《=1
    • 可决定系数是样本观测值的函数,是因随机抽样而变动的随机变量。为此,对可决系数的统计的可靠性也应进行检验。
     1 from pandas import read_csv
     2 from sklearn.model_selection import KFold
     3 from sklearn.model_selection import cross_val_score
     4 from sklearn.linear_model import LinearRegression
     5 
     6 filename='/home/aistudio/work/housing.csv'
     7 #names=['preg','plas','pres','skin','test','mass','pedi','age','class']
     8 names=['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
     9 data=read_csv(filename,names=names,delim_whitespace=True)
    10 array=data.values
    11 
    12 x=array[:,0:13]
    13 y=array[:,13]
    14 n_splits=10
    15 seed=7
    16 kfold=KFold(n_splits,random_state=seed)
    17 model=LinearRegression()
    18 #scoring='neg_mean_absolute_error'
    19 #scoring='neg_mean_squared_error'
    20 scoring='r2'
    21 result=cross_val_score(model,x,y,cv=kfold,scoring=scoring)
    22 print('R2: %.3f (%.3f)' % (result.mean(),result.std()))
     
    R2: 0.203 (0.595)
    





  • 相关阅读:
    关联原理说明
    一个软件测试工程师的学习体验
    缺陷漏测分析:测试过程改进
    自动化测试的7个步骤
    ACM题目————Subsequence
    ACM题目————Aggressive cows
    ACM题目————列变位法解密
    C++TSL之map容器(悲伤的故事)
    ACM题目————二叉树最大宽度和高度
    ACM题目————装箱问题
  • 原文地址:https://www.cnblogs.com/yuzaihuan/p/12446742.html
Copyright © 2011-2022 走看看