分类算法的评价

 

"""实现混淆矩阵,精准率和召回率"""
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

digits=datasets.load_digits()
X=digits.data
y=digits.target.copy()

y[digits.target==9]=1
y[digits.target!=9]=0

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=666)
log_reg=LogisticRegression()
log_reg.fit(X_train,y_train)
print(log_reg.score(X_test,y_test))

y_log_predict=log_reg.predict(X_test)

def TN(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return np.sum((y_true==0)&(y_predict==0))

def FP(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return np.sum((y_true==0)&(y_predict==1))

def FN(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return np.sum((y_true==1)&(y_predict==0))

def TP(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return np.sum((y_true==1)&(y_predict==1))

def confusion_matrix(y_true,y_predict):
    np.array([
        [TN(y_true,y_predict),FP(y_true,y_predict)],
        [FN(y_true,y_predict),TP(y_true,y_predict)]
    ])
print(confusion_matrix(y_test,y_log_predict))

def precision_score(y_true,y_predict):
    tp=TP(y_true,y_predict)
    fp=FP(y_true,y_predict)
    try:
        return tp/(tp+fp)
    except:
        return 0.0
print(precision_score(y_test,y_log_predict))

def recall_score(y_true,y_predict):
    tp=TP(y_true,y_predict)
    fn=FN(y_true,y_predict)
    try:
        return tp/(tp+fn)
    except:
        return 0.0
print(recall_score(y_test,y_log_predict))

"""scikit-learn中的混淆矩阵,准确率和召回率"""
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score

print(precision_score(y_test,y_log_predict))
print(recall_score(y_test,y_log_predict))

结果: 

E:\pythonspace\KNN_function\venv\Scripts\python.exe E:/pythonspace/KNN_function/try.py
0.9755555555555555
None
0.9473684210526315
0.8
0.9473684210526315
0.8

Process finished with exit code 0

 

接着上面的代码:

"""F1_score"""
from sklearn.metrics import f1_score
print(f1_score(y_test,y_log_predict))

结果:

0.8674698795180723

改变决策边界:

"""实现混淆矩阵,精准率和召回率"""
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics  import f1_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score

digits=datasets.load_digits()
X=digits.data
y=digits.target.copy()

y[digits.target==9]=1
y[digits.target!=9]=0

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=666)
log_reg=LogisticRegression()
log_reg.fit(X_train,y_train)
y_predict=log_reg.predict(X_test)

print(f1_score(y_test,y_predict))
print(precision_score(y_test,y_predict))
print(recall_score(y_test,y_predict))
""""""
decision_score=log_reg.decision_function(X_test)
y_predict_2=np.array(decision_score>=5,dtype='int')
print(precision_score(y_test,y_predict_2))
print(recall_score(y_test,y_predict_2))

结果:

E:\pythonspace\KNN_function\venv\Scripts\python.exe E:/pythonspace/KNN_function/try.py
0.8674698795180723
0.9473684210526315
0.8
0.96
0.5333333333333333

Process finished with exit code 0

 

Precision-Recall曲线

 

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score

digits=datasets.load_digits()
X=digits.data
y=digits.target.copy()

y[digits.target==9]=1
y[digits.target!=9]=0

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=666)
log_reg=LogisticRegression()
log_reg.fit(X_train,y_train)
decision_score=log_reg.decision_function(X_test)

threasholds=np.arange(np.min(decision_score),np.max(decision_score),0.1)
precisions=[]
recalls=[]
for threashold in threasholds:
    y_predict=np.array(decision_score>=threashold,dtype='int')
    precisions.append(precision_score(y_test,y_predict))
    recalls.append(recall_score(y_test,y_predict))

plt.plot(threasholds,precisions)
plt.plot(threasholds,recalls)
plt.show()

"""Precision-Recall曲线"""
plt.plot(precisions,recalls)
plt.show()

"""scikit-learn中的Precision-Recall曲线"""
from sklearn.metrics import precision_recall_curve
precision,recall,threashold=precision_recall_curve(y_test,decision_score)
print(precision.shape)
plt.plot(threashold,precision[:-1])
plt.plot(threashold,recall[:-1])
plt.show()

结果: 

 

接着上面的代码:

"""scikit-learn中的ROC曲线"""
from sklearn.metrics import roc_curve
fprs,tprs,threasholds=roc_curve(y_test,decision_score)
plt.plot(fprs,tprs)
plt.show()

 结果:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值