歡迎光臨
每天分享高質量文章

【演算法】逐步在Python中構建Logistic回歸


筆者邀請您,先思考:

1邏輯回歸演算法怎麼理解?

2 如何用Python平臺做邏輯回歸?

logistic回歸是一種機器學習分類演算法,用於預測分類因變數的概率。 在邏輯回歸中,因變數是一個二進制變數,包含編碼為1(是,成功等)或0(不,失敗等)的資料。 換句話說,邏輯回歸模型基於X的函式預測P(Y = 1)。

Logistic回歸假設

  • 二元邏輯回歸要求因變數為二元的。

  • 對於二元回歸,因變數的因子級別1應代表所需的結果。

  • 只應包含有意義的變數。

  • 自變數應相互獨立。 也就是說,模型應該具有很少或沒有多重共線性。

  • 自變數與對數幾率線性相關。

  • Logistic回歸需要非常大的樣本量。

記住上述假設,讓我們看一下我們的資料集。

資料探索

該資料集來自UCI機器學習庫,它與葡萄牙銀行機構的直接營銷活動(電話)有關。 分類標的是預測客戶是否將訂閱(1/0)到定期存款(變數y)。 資料集可以從這裡下載。

import pandas as pd
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt
plt.rc("font", size = 4)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import seaborn as sns
sns.set(style="white")
sns.set(style="whitegrid", color_codes=True)

資料集提供銀行客戶的信息。 它包括41,188條記錄和21個欄位。

data = pd.read_csv("raw_data/banking.csv", essay-header=0)
data = data.dropna()
print(data.shape)
print(list(data.columns))

輸入變數

  1. age(數字)

  2. job:工作型別(分類:管理員,藍領,企業家,女佣,管理人員,退休人員,自雇人員,服務人員,學生,技術員,失業,未知)

  3. marital:婚姻狀況(分類:離婚,已婚,單身,未知)

  4. education:教育(分類:“basic.4y”, “basic.6y”, “basic.9y”, “high.school”, “illiterate”, “professional.course”, “university.degree”, “unknown”)

  5. default:有信用違約嗎?(分類:沒有,有,未知)

  6. housing:有房貸嗎?(分類:沒有,有,未知)

  7. loan:有個人貸款嗎?(分類:沒有,有,未知)

  8. contact:聯繫溝通型別(分類:蜂窩,電話)

  9. month:聯繫的最後一個月份(分類:“jan”,“feb”,“mar”,…,“nov”,“dec”)

  10. day_of_week:一周中最後的聯繫日(分類:“mon”,“tue”,“wed”,“thu”,“fri”)

  11. duration:上次聯繫持續時間,以秒為單位(數字)。重要提示:此屬性會嚴重影響輸出標的(例如,如果持續時間= 0,則y =’否’)。在執行呼叫之前不知道持續時間,也就是說,在呼叫結束之後,y顯然是已知的。因此,此輸入僅應包括在基準目的中,如果打算採用現實的預測模型,則應將其丟棄

  12. campaign:此廣告系列期間和此客戶端執行的聯繫人數量(數字,包括最後一次聯繫)

  13. pdays:從上一個廣告系列上次聯繫客戶端之後經過的天數(數字; 999表示之前未聯繫客戶)

  14. previous:此廣告系列之前和此客戶端之間執行的聯繫人數量(數字)

  15. poutcome:上一次營銷活動的結果(分類:“失敗”,“不存在”,“成功”)

  16. emp.var.rate:就業變化率 – (數字)

  17. cons.price.idx:消費者價格指數 – (數字)

  18. cons.conf.idx:消費者信心指數 – (數字)

  19. euribor3m:euribor 3個月費率 – (數字)

  20. nr.employed:員工人數 – (數字)

預測變數(所需標的)

y – 客戶是否訂購了定期存款? (二進制:“1”表示“是”,“0”表示“否”)

因變數的條形圖

sns.countplot(x = 'y'data=data, palette="hls")
plt.show()

如下圖:

檢查缺失值

print(data.isnull().sum())

客戶工作型別分佈

sns.countplot(y = "job"data=data)
plt.show()

如下圖:

客戶婚姻狀態分佈

sns.countplot(x = "marital"data=data)
plt.show()

如下圖:

信用違約的條形圖

sns.countplot(x="default"data=data)
plt.show()

如下圖:

房貸條形圖

sns.countplot(x="housing"data=data)
plt.show()

如下圖:

個人貸條形圖

sns.countplot(x="loan"data=data)
plt.show()

如下圖:

先前的市場活動結果條形圖

sns.countplot(x="poutcome"data=data)
plt.show()

如下圖:

我們的預測將基於客戶的工作,婚姻狀況,他(她)是否有違約信用,他(她)是否有住房貸款,他(她)是否有個人貸款,以及之前營銷的結果活動。 因此,我們將刪除不需要的變數。

data.drop(data.columns[[0, 3, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19]], axis=1, inplace=True)

資料預處理

創建虛擬變數,即只有兩個值的變數,零和一。
在邏輯回歸模型中,將所有自變數編碼為虛擬變數使得容易地解釋和計算odds比,並且增加繫數的穩定性和顯著性。

data2 = pd.get_dummies(data, columns =['job''marital''default''housing''loan''poutcome'])

刪除Unknown的列

print(data2.columns)
data2.drop(data2.columns[[12, 16, 18, 21, 24]], axis=1, inplace=True)
print(data2.columns)

完美! 正是我們後續步驟的需求。

檢查自變數之間的獨立性

sns.heatmap(data2.corr())
plt.show()

看起來不錯。

將資料拆分為訓練和測試集

X = data2.iloc[:,1:]
y = data2.iloc[:,0]
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)

檢查訓練資料集就足夠了

print(X_train.shape)

(30891, 23)

很好! 現在我們可以開始構建邏輯回歸模型。

Logistic回歸模型

訓練集上擬合邏輯回歸

classifier = LogisticRegression(random_state=0)
classifier.fit(X_train, y_train)

預測測試集結果並創建混淆矩陣

confusion_matrix()函式將計算混淆矩陣並將結果以陣列傳回。

y_pred = classifier.predict(X_test)
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)

結果告訴我們,我們有9046 + 229個正確的預測和912 + 110個不正確的預測。

準確性

print('Accuracy of logistic regression classifier on test set: {:.2f}'.format(classifier.score(X_test, y_test)))

Accuracy of logistic regression classifier on test set: 0.90

分類器可視化

本節的目的是可視化邏輯回歸類規則器的決策邊界。 為了更好地對決策邊界進行可視化,我們將對資料執行主成分分析(PCA),以將維度降低到2維。

from sklearn.decomposition import PCA
X = data2.iloc[:,1:]
y = data2.iloc[:,0]
pca = PCA(n_components=2).fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(pca, y, random_state=0)

plt.figure(dpi=120)
plt.scatter(pca[y.values==0,0], pca[y.values==0,1], alpha=0.5, label='YES', s=2, color='navy')
plt.scatter(pca[y.values==1,0], pca[y.values==1,1], alpha=0.5, label='NO', s=2, color='darkorange')
plt.legend()
plt.title('Bank Marketing Data Set\nFirst Two Principal Components')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.gca().set_aspect('equal')
plt.show()

如下圖:

def plot_bank(X, y, fitted_model):
    plt.figure(figsize=(9.8,5), dpi=100)
    for i, plot_type in enumerate(['Decision Boundary''Decision Probabilities']):
        plt.subplot(1,2,i+1)
        mesh_step_size = 0.01  # step size in the mesh
        x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1
        y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1
        xx, yy = np.meshgrid(np.arange(x_min, x_max, mesh_step_size), np.arange(y_min, y_max, mesh_step_size))
        if i == 0:
            Z = fitted_model.predict(np.c_[xx.ravel(), yy.ravel()])
        else:
            try:
                Z = fitted_model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:,1]
            except:
                plt.text(0.40.5'Probabilities Unavailable', horizontalalignment='center',
                         verticalalignment='center', transform = plt.gca().transAxes, fontsize=12)
                plt.axis('off')
                break
        Z = Z.reshape(xx.shape)
        plt.scatter(X[y.values==0,0], X[y.values==0,1], alpha=0.8, label='YES', s=5, color='navy')
        plt.scatter(X[y.values==1,0], X[y.values==1,1], alpha=0.8, label='NO', s=5, color='darkorange')
        plt.imshow(Z, interpolation='nearest', cmap='RdYlBu_r', alpha=0.15,
                   extent=(x_min, x_max, y_min, y_max), origin='lower')
        plt.title(plot_type + '\n' +
                  str(fitted_model).split('(')[0]+ ' Test Accuracy: ' + str(np.round(fitted_model.score(X, y), 5)))
    plt.gca().set_aspect('equal');
    plt.tight_layout()
    plt.legend()
    plt.subplots_adjust(top=0.9, bottom=0.08, wspace=0.02)
model = LogisticRegression()
model.fit(X_train,y_train)
plot_bank(X_test, y_test, model)
plt.show()

如下圖:

如您所見,PCA降低了Logistic回歸模型的準確性。 這是因為我們使用PCA來減少維度,因此我們從資料中刪除了信息。 我們將在以後的帖子中介紹PCA。
用於製作此文章的Jupyter筆記本可在此處獲得。 我很樂意收到有關上述任何內容的反饋或問題。

作者:Susan Li
原文鏈接:
https://datascienceplus.com/building-a-logistic-regression-in-python-step-by-step/

版權宣告:作者保留權利,嚴禁修改,轉載請註明原文鏈接。

資料人網是資料人學習、交流和分享的平臺http://shujuren.org 。專註於從資料中學習到有用知識。
平臺的理念:人人投稿,知識共享;人人分析,洞見驅動;智慧聚合,普惠人人。
您在資料人網平臺,可以1)學習資料知識;2)創建資料博客;3)認識資料朋友;4)尋找資料工作;5)找到其它與資料相關的乾貨。
我們努力堅持做原創,聚合和分享優質的省時的資料知識!
我們都是資料人,資料是有價值的,堅定不移地實現從資料到商業價值的轉換!

點擊閱讀原文,進入資料人網,獲取資料知識。

公眾號推薦:

鏈達君,專註於分享區塊鏈內容。

艾鴿英語,專註於分享有趣的英語內容。

赞(0)

分享創造快樂