0511學習記錄(邏輯迴歸)

梯度下降
最優化的一種,優化一個函數使其達到最大值或最小值。

交叉熵
計算邏輯迴歸的損失

sigmoid函數
在這裏插入圖片描述
sigmoid函數對應的圖形就是logistic曲線,logistic曲線對應的函數就是sigmoid函數。
通過logistic曲線就可以知道

1)sigmoid函數是一個閾值函數,不管x取什麼值,對應的sigmoid函數值總是0<sigmoid(x)<1。

2)sigmoid函數嚴格單調遞增,而且其反函數也單調遞增

3)sigmoid函數連續

4)sigmoid函數光滑

5)sigmoid函數關於點(0, 0.5)對稱

6)sigmoid函數的導數是以它本身爲因變量的函數,即f(x)’ = F(f(x))

import numpy as np
import matplotlib.pyplot as plt

# 定義sigmoid函數的原型。
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

z = np.linspace(-10, 10, 200)
plt.plot(z, sigmoid(z))
# 繪製垂直線。
plt.axvline(x=0, ls="dashed", c="k")
# 畫水平線。如果沒有指定水平線,則默認爲y=0。
plt.axhline(ls="dotted", c="k")
plt.axhline(y=0.5, ls="dotted", c="k")
plt.axhline(y=1, ls="dotted", c="k")
plt.show()

在這裏插入圖片描述

案例:使用邏輯迴歸實現二分類任務

import numpy as np

from sklearn.datasets import make_classification # 用來生成分類的數據集。
from sklearn.linear_model import LogisticRegression # sklearn中提供的邏輯迴歸類,可以用來實現分類任務。
from sklearn.model_selection import train_test_split
import matplotlib as mpl
import matplotlib.pyplot as plt

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

# n_samples 生成樣本的數量
# n_features 特徵的數量
# n_informative 含有有用信息的特徵
# n_redundant 含有冗餘信息的特徵。
# n_classes 分類的數量。
# random_state 隨機種子。
# 返回X,y :生成的樣本與對應的標籤(所屬的類別)
#features=informative+redundant(+repead)
X, y = make_classification(n_samples=200, n_features=2, n_informative=2, n_redundant=0, 
        n_classes=2, random_state=0)
# 查看生成的數據。
# print(X[:5])
# print(y[:5])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
# 創建邏輯迴歸類的對象。
# penalty 懲罰項。L2
# C 正則化強度,是alpha的倒數。
# C越小,懲罰力度越大,C越大,懲罰力度越小。
lr = LogisticRegression(penalty="l2", C=2)
lr.fit(X_train, y_train)
y_hat = lr.predict(X_test)
print(f"權重:{lr.coef_}")
print(f"偏置:{lr.intercept_}")
print(f"預測值:{y_test[:25]}")
print(f"實際值:{y_hat[:25]}")

結果:
[[ 0.61701083 -1.19399527]
[ 0.0574174 -0.57239815]
[-0.55891517 0.75535623]
[ 0.36807302 0.06155712]
[ 2.32747048 -2.9285689 ]]
[1 0 0 1 1]
權重:[[ 3.83971612 -0.55307143]]
偏置:[-0.69747916]
預測值:[1 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 0 0 0]
實際值:[1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0]

繪製散點圖

# 獲取類別爲0的樣本。
c1 = X[y == 0]
# 獲取類別爲1的樣本。
c2 = X[y == 1]

# 可以看出整體的樣本分佈,但是,無法觀察出樣本屬於哪個類別。
# plt.scatter(x=X[:, 0], y=X[:, 1])

# 分開來繪製兩個不同類別的樣本,便於觀察。
plt.scatter(x=c1[:, 0], y=c1[:, 1], c="g", label="類別0")
plt.scatter(x=c2[:, 0], y=c2[:, 1], c="r", label="類別1")
plt.legend()
plt.show()

在這裏插入圖片描述
查看測試集中的預測結果

plt.figure(figsize=(15, 5))
# 繪製真實的樣本類別。
plt.plot(y_test, "o", ms=15, c="g", label="真實類別")
# 繪製預測的樣本類別。
plt.plot(y_hat, "x", ms=15, c="r", label="預測類別")
plt.legend()
plt.xlabel("樣本序號")
plt.ylabel("類別")
plt.title("邏輯迴歸分類預測結果")
plt.show()

在這裏插入圖片描述

預測值的概率(信心值)

# 針對參數指定的樣本,返回樣本屬於每一個類別的概率值(信心指數)。
probability = lr.predict_proba(X_test)
print(probability[:10])
# 將概率轉換成真實的類別。axis=1,表示按行進行統計。
print(np.argmax(probability, axis=1))
# 此處,也可以這樣做:
# index = np.arange(X_test.shape[0])
index = np.arange(len(X_test))
# 獲取屬於第0個類別的概率。
pro_0 = probability[:, 0]
# 獲取屬於第1個類別的概率。
pro_1 = probability[:, 1]
# 根據預測值是否等於真實值(預測結果是否正確),來計算不同的符號,用來稍後圖形的顯示。
tick_label = np.where(y_test == y_hat, "O", "X")
plt.figure(figsize=(15, 5))
# 以概率值作爲柱形圖的高度。
plt.bar(index, height=pro_0, color="g", label="類別0概率值")
# bottom 指定柱形圖底邊(柱形圖的底面)基於多少值開始繪製。通過指定bottom爲開始繪製的柱形的高度,
# 這樣就可以繪製堆疊圖。
# tick_label 在每個柱形圖下面顯示標籤的內容。
# 正確顯示O,錯誤顯示X。
plt.bar(index, height=pro_1, color='r', bottom=pro_0, label="類別1概率值", tick_label=tick_label)
# bbox_to_anchor 指定圖例的位置。
plt.legend(loc="best", bbox_to_anchor=(1, 1))
plt.xlabel("樣本序號")
plt.ylabel("各個類別的概率")
plt.title("邏輯迴歸分類概率")
plt.show()

結果:
[[2.26967957e-04 9.99773032e-01]
[1.99960672e-02 9.80003933e-01]
[9.99920665e-01 7.93354750e-05]
[1.96321586e-03 9.98036784e-01]
[8.32304028e-02 9.16769597e-01]
[4.84431401e-01 5.15568599e-01]
[6.80773352e-01 3.19226648e-01]
[2.05090867e-02 9.79490913e-01]
[1.14664261e-01 8.85335739e-01]
[7.95921813e-02 9.20407819e-01]]
[1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 0
1 1 0 1 0 1 1 0 1 0 0 1 0]
在這裏插入圖片描述
決策邊界
劃分成若干行若干列(細顆粒度),給每個顆粒決策顏色

# 顏色圖類型,可以指定不同的顏色。
from matplotlib.colors import ListedColormap

# 定義顏色圖對象,自定義顏色列表。
cmap = ListedColormap(["r", "g"])
# 定義標記,用來區分不同的類別。
marker = ["o", "v"]
# 獲取兩個特徵x1與x2的最小值與最大值。
x1_min, x2_min = np.min(X_test, axis=0)
x1_max, x2_max = np.max(X_test, axis=0)
x1 = np.linspace(x1_min - 1, x1_max + 1, 100)
x2 = np.linspace(x2_min - 1, x2_max + 1, 100)
# 進行網格交叉,獲取x1與x2中每一個值的組合。
X1, X2 = np.meshgrid(x1, x2)
Z = lr.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape)
# 使用填充的等高線圖繪製決策邊界。
plt.contourf(X1, X2, Z, cmap=cmap, alpha=0.5)
for i, class_ in enumerate(np.unique(y)):
    plt.scatter(x=X_test[y_test == class_, 0], y=X_test[y_test == class_, 1],
            c=cmap(i), label=class_, marker=marker[i])
plt.legend()
plt.show()

在這裏插入圖片描述
ravel:扁平化

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