#MSE均方误差
from sklearn.metrics import mean_squared_error
#MAEX
from sklearn.metrics import mean_absolute_error
#R^2决定系数
from sklearn.metrics import r2_score
confusion_matrix(y_true, y_pred, labels=None, sample_weight=None):通过计算混淆矩阵来评估分类的准确性 返回混淆矩阵
from sklearn.metrics import confusion_matrix
计算鸢尾花逻辑回归预测的结果
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 15
iris=load_iris()
X,y=iris.data,iris.target
X=X[y!=0,2:]
y=y[y!=0]
y[y==1]=0
y[y==2]=1
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=2)
lr=LogisticRegression()
lr.fit(X_train,y_train)
y_hat=lr.predict(X_test)
计算混淆矩阵结果
s=confusion_matrix(y_true=y_test,y_pred=y_hat)
print(s)
结果
[[14 2]
[ 2 7]]
accuracy
样本不均衡时有局限性:都判断为数量多的那一类,结果正确率也很高
precision
判断的结果为正例中,有多少是真正例
缺点:预测的结果只有1例正例,并且是正确的,精准率为100%。实际有很多预测错误的负例,即真实的正例
场景:预测股票会涨,真实涨了10次,只预测到2次会涨,预测这两次都对了,那么就是我想要的精准度高,此时召回率不重要
recall
真实的正例中,预测正确的正例有多少。
缺陷:都预测为正例,那么会覆盖真实的正例,召回率为100%
场景:抓坏人,坏人为正例,好人为负例。要的结果是宁可抓错不能放过。
思路:真实的类别中要判断的对的越多越好,即判断对的在真实类别的占比越多越好,召回率高
精准率不关注,即使预测错了他其实是个好人也没事
from sklearn.metrics import accuracy_score #正确率
from sklearn.metrics import precision_score #精准率
from sklearn.metrics import recall_score #召回率
from sklearn.metrics import f1_score #调和平均值F1
#默认1类别为正例,可通过pos_label参数指定
print('正确率',accuracy_score(y_test,y_hat))
print('精准率',precision_score(y_test,y_hat))
print('召回率',recall_score(y_test,y_hat))
print('调和平均值F1',f1_score(y_test,y_hat))
结果
正确率 0.84
精准率 0.7777777777777778
召回率 0.7777777777777778
调和平均值F1 0.7777777777777778
另外,也可以调用逻辑回归模型对象的score方法,获取正确率
score方法与f1_score方法参数不同
print('逻辑回归调用score方法计算正确率',lr.score(X_test,y_test))
结果
逻辑回归调用score方法计算正确率 0.84
from sklearn.metrics import classification_report
print(classification_report(y_true=y_test,y_pred=y_hat))
结果
precision recall f1-score support
0 0.88 0.88 0.88 16
1 0.78 0.78 0.78 9
avg / total 0.84 0.84 0.84 25
AUC(Area Under the Curve):ROC曲线下面积,使用AUC值作为评价标准是因为有时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而AUC作为数值可以直观的评价分类器的好坏,值越大越好。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
plt.rcParams['font.family']= 'simHei' #用来设置字体,正常显示正文
plt.rcParams['axes.unicode_minus'] = False #用来显示负号
plt.rcParams['font.size'] = 16 #设置字体的大小
iris=load_iris()
X,y=iris.data,iris.target
#暂时使用2个花瓣特征和2个类别进行计算
X=X[y != 0 , 2: ]
y=y[y != 0]
y[y==1]=0
y[y==2]=1
#拆分数据集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=2)
lr=LogisticRegression()
#训练模型
lr.fit(X_train,y_train)
#通过模型预测结果
y_hat=lr.predict(X_test)
probability=lr.predict_proba(X_test)
#ROC曲线
from sklearn.metrics import roc_curve
#AUC:auc和roc_auc_score都可以得出结果,所需参数不同
from sklearn.metrics import auc,roc_auc_score
#roc_curve返回三个值,分别是fpr、tpr和阈值;常用三个参数,真实的类别、模型预测为类别1的概率、pos_label=1设置类别1为正例
fpr,tpr,thresholds = roc_curve(y_test,probability[:,1],pos_label=1)
print('fpr值:',fpr)
print('tpr值:',tpr)
print('thresholds值:',thresholds)
#auc函数参数为fpr、tpr
print('AUC面积值:',auc(fpr,tpr))
#roc_auc_score函数参数为真实类别、模型预测为类别1的概率
print('AUC面积得分:',roc_auc_score(y_true=y_test,y_score=probability[:,1]))
结果
fpr值: [0. 0. 0. 0.0625 0.0625 0.125 0.125 0.25 0.3125 0.4375 0.6875 0.8125 1. ]
tpr值: [0. 0.11111111 0.55555556 0.55555556 0.88888889 0.88888889
1. 1. 1. 1. 1. 1.
1. ]
thresholds值: [1.89281389 0.89281389 0.68321182 0.57414373 0.50124062 0.40461479
0.27410305 0.24775845 0.23340897 0.19711588 0.06923229 0.04279423
0.00652175]
AUC面积值: 0.9652777777777778
AUC面积得分: 0.9652777777777778
plt.plot(fpr,tpr,marker='o',label='ROC曲线')
plt.plot([0,0,1],[0,1,1],ls='--',label='完美预测')
plt.legend()
plt.show()
汇总指标:
https://www.cnblogs.com/mdevelopment/p/9456486.html