"""实现混淆矩阵,精准率和召回率"""
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()
结果: