0513學習記錄(邏輯迴歸)

混淆矩陣
TP,TN,FP,FN

import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 混淆矩陣,可以獲取評估結果。
from sklearn.metrics import confusion_matrix
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False

X, y = make_classification(n_samples=200, n_features=2, n_informative=2, n_redundant=0,
        n_classes=2, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
lr = LogisticRegression(penalty="l2", C=2)
lr.fit(X_train, y_train)
train_predict = lr.predict(X_train)
test_predict = lr.predict(X_test)
# 輸出混淆矩陣的值。labels指定預測的標籤,前面的爲正例,後面的爲負例。
print(confusion_matrix(y_true=y_test, y_pred=test_predict, labels=[1, 0]))
# matrix就是二維ndarray數組類型。
matrix = confusion_matrix(y_true=y_test, y_pred=test_predict, labels=[1, 0])
# 混淆矩陣圖。
plt.matshow(matrix, cmap=plt.cm.Blues, alpha=0.5)
# 依次遍歷矩陣的行與列。
for i in range(matrix.shape[0]):
    for j in range(matrix.shape[1]):
        # va:指定垂直對齊方式。
        # ha:指定水平對齊方式。
        plt.text(x=j, y=i, s=matrix[i, j], va='center', ha='center')
plt.xlabel('預測值')
plt.ylabel('實際值')

結果:
[[27 0]
[ 3 20]]
在這裏插入圖片描述

評估指標
正確率(accuracy)=(TP+TN)/ (TP+TN+FP+FN)
精準率(precision)=TP / (TP+FP) #我們預測對的正例(TP)佔我們所有預測正例的百分比
召回率(recall)= TP / (TP+FN) #我們預測對的正例佔實際所有正例數的百分比(體現覆蓋度)
F1 = (2precisionrecall) / (accuracy+recall)

# accuracy_score 獲取正確率
# precision_score 獲取精準率
# recall_score 獲取召回率
# f1_score 獲取精準率與召回率的調和平均值
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 返回一個字符串(str)類型,內容就是分類的報告,包括正例與負例的精準率,召回率與調和平均值。
from sklearn.metrics import classification_report

train_accuracy = np.sum(y_train == train_predict) / y_train.shape[0]
test_accuracy = np.sum(y_test == test_predict) / y_test.shape[0]
print("自行計算正確率:")
print(f"訓練集正確率:{train_accuracy}")
print(f"測試集正確率:{test_accuracy}")
# 分類模型也提供了score方法,獲取的就是正確率(accuracy_score)。
# 但是,注意:score方法與accuracy_score方法參數的內容不同。
print("使用score方法來獲取正確率")
print(f"訓練集正確率:{lr.score(X_train, y_train)}")
print(f"測試集正確率:{lr.score(X_test, y_test)}")
print("使用accuracy_score方法計算正確率")
print(f"訓練集正確率:{accuracy_score(y_train, train_predict)}")
print(f"測試集正確率:{accuracy_score(y_test, test_predict)}")
print(f"精準率:{precision_score(y_test, test_predict)}")
print(f"召回率:{recall_score(y_test, test_predict)}")
print(f"F1(調和平均值):{f1_score(y_test, test_predict)}")
print(classification_report(y_true=y_test, y_pred=test_predict, labels=[1, 0]))

結果:
自行計算正確率:
訓練集正確率:0.96
測試集正確率:0.94
使用score方法來獲取正確率
訓練集正確率:0.96
測試集正確率:0.94
使用accuracy_score方法計算正確率
訓練集正確率:0.96
測試集正確率:0.94
精準率:0.9
召回率:1.0
F1(調和平均值):0.9473684210526316
precision recall f1-score support

       1       0.90      1.00      0.95        27
       0       1.00      0.87      0.93        23

accuracy                           0.94        50

macro avg 0.95 0.93 0.94 50
weighted avg 0.95 0.94 0.94 50

AUC
TPR=TP / (TP+FN)
FPR=FP / (FP+TN)

import numpy as np
from sklearn.metrics import roc_curve, auc, roc_auc_score
y = np.array([0, 0, 1, 1])
#目標樣本的標籤值(分類值)
scores = np.array([0.2, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=1)
print(f"fpr:{fpr}")
print(f"tpr:{tpr}")
print(f"thresholds:{thresholds}")

print(f"AUC面積值:{auc(fpr, tpr)}")
print(f"AUC面積得分:{roc_auc_score(y_true=y, y_score=scores)}")
import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, auc
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False

X, y = make_classification(n_samples=200, n_features=10, n_classes=2, random_state=0, flip_y=0.3)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
lr = LogisticRegression(penalty="l2", C=2)
lr.fit(X_train, y_train)
y_hat = lr.predict(X_test)
score = lr.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_true=y_test, y_score=score[:, 1], pos_label=1)

plt.figure(figsize=(10, 6))
plt.plot(fpr, tpr, label="ROC")
plt.plot([0,1], [0,1], lw=2, ls="--", label="隨機猜測")
plt.plot([0, 0, 1], [0, 1, 1], lw=2, ls="-.", label="完美預測")
plt.xlim(-0.01, 1.02)
plt.ylim(-0.01, 1.02)
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel('False Positive Rate(FPR)', fontsize=16)
plt.ylabel('True Positive Rate(TPR)', fontsize=16)
plt.grid()
plt.title(f"ROC曲線-AUC值爲{auc(fpr, tpr):.3f}", fontsize=16)
plt.legend()
plt.show()

fpr:[0. 0. 0.5 0.5 1. ]
tpr:[0. 0.5 0.5 1. 1. ]
thresholds:[1.8 0.8 0.4 0.35 0.2 ]
AUC面積值:0.75
AUC面積得分:0.75
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章