逻辑回归分类——信用卡诈骗
邏輯回歸,也叫作 logistic 回歸。雖然名字中帶有“回歸”,但它實際上是分類方法,主要解決的是二分類問題,當然它也可以解決多分類問題,只是二分類更常見一些。
應用場景:
- 廣告點擊率
- 是否為垃圾郵件
- 是否患病
- 金融詐騙
- 虛假賬號
原理
在邏輯回歸中使用了 Logistic 函數,也稱為 Sigmoid 函數。Sigmoid 函數是在深度學習中經常用到的函數之一,函數公式為:
函數的圖形如下所示,類似 S 狀:
?
在 sklearn 中,我們使用 LogisticRegression() 函數構建邏輯回歸分類器,函數里有一些常用的構造參數:
模型評估指標
舉個例子,對于機場安檢中恐怖分子的判斷,就不能采用準確率對模型進行評估。恐怖分子的比例是極低的,因此當用準確率做判斷時,如果準確率高達 99.999%,就說明這個模型一定好么?
其實正因為現實生活中恐怖分子的比例極低,就算不能識別出一個恐怖分子,也會得到非常高的準確率。因為準確率的評判標準是正確分類的樣本個數與總樣本數之間的比例。因此非恐怖分子的比例會很高,就算識別不出來恐怖分子,正確分類的個數占總樣本的比例也會很高,也就是準確率高。實際上應該更關注恐怖分子的識別。
數據預測的四種情況:TP、FP、TN、FN。第二個字母 P 或 N 代表預測為正例還是負例,P 為正,N 為負。第一個字母 T 或 F 代表的是預測結果是否正確,T 為正確,F 為錯誤。
所以四種情況分別為:
精確率 P = TP/ (TP+FP),對應上面恐怖分子這個例子,在所有判斷為恐怖分子的人數中,真正是恐怖分子的比例。
召回率 R = TP/ (TP+FN),也稱為查全率。代表的是恐怖分子被正確識別出來的個數與恐怖分子總數的比例。
有一個指標綜合了精確率和召回率,可以更好地評估模型的好壞。這個指標叫做 F1,用公式表示為:
F1 作為精確率 P 和召回率 R 的調和平均,數值越大代表模型的結果越好。
實例
信用卡詐騙分析
數據鏈接:https://pan.baidu.com/s/14F8WuX0ZJntdB_r1EC08HA 提取碼:58gp
import pandas as pd from matplotlib import pyplot as plt import seaborn as sns import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix, precision_recall_curve import itertoolsclass CreditFraud:# 混淆矩陣可視化def plot_confusion_matrix(self, cm, classes, normalize=False, title='Confusion matrix', cmap=plt.cm.Blues):plt.rcParams['font.sans-serif'] = ['SimHei']plt.figure()plt.imshow(cm, interpolation='nearest', cmap=cmap)plt.title(title)plt.colorbar()tick_marks = np.arange(len(classes))plt.xticks(tick_marks, classes, rotation=0)plt.yticks(tick_marks, classes)thresh = cm.max() / 2for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):plt.text(j, i, cm[i, j],horizontalalignment='center',color='white' if cm[i, j] > thresh else 'black')plt.tight_layout()plt.ylabel('True label')plt.xlabel('Predicted label')plt.show()# 顯示模型評估結果def show_metrics(self, cm):tp = cm[1, 1]fn = cm[1, 0]fp = cm[0, 1]tn = cm[0, 0]print('精確率:{:.3f}'.format(tp / (tp + fp)))print('召回率:{:.3f}'.format(tp / (tp + fn)))print('f1值:{:.3f}'.format(2 * (((tp / (tp + fp)) * (tp / (tp + fn))) / ((tp / (tp + fp)) + (tp / (tp + fn))))))# 繪制精確率-召回率曲線def plot_precision_recall(self, recall, precision):plt.rcParams['font.sans-serif'] = ['SimHei']plt.step(recall, precision, color='b', alpha=0.2, where='post')plt.fill_between(recall, precision, step='post', alpha=0.2, color='b')plt.plot(recall, precision, linewidth=2)plt.xlim([0.0, 1])plt.ylim([0.0, 1.05])plt.xlabel('召回率')plt.ylabel('精確率')plt.title('精確率-召回率 曲線')plt.show()# 顯示交易筆數,欺詐交易筆數def show(self, data):# 設置plt正確顯示中文plt.rcParams['font.sans-serif'] = ['SimHei']# 繪制類別分布plt.figure()ax = sns.countplot(x='Class', data=data)plt.title('類別分布')plt.show()num = len(data)num_fraud = len(data[data['Class'] == 1])print('總交易筆數:', num)print('詐騙交易筆數:', num_fraud)print('詐騙交易比例:{:.6f}'.format(num_fraud / num))# 詐騙和正常交易可視化f, (ax1, ax2) = plt.subplots(2, 1, sharex='True', figsize=(10, 8))bins = 50ax1.hist(data.Time[data.Class == 1], bins=bins, color='deeppink')ax1.set_title('詐騙交易')ax2.hist(data.Time[data.Class == 0], bins=bins, color='deepskyblue')ax2.set_title('正常交易')plt.xlabel('時間')plt.ylabel('交易次數')plt.show()def logic_regress(self, data):self.show(data)# 對Amount進行標準化data['Amount_Norm'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1, 1))# 特征選擇y = np.array(data.Class.tolist())# y = data.Class.valuesdata_new = data.drop(['Time', 'Amount', 'Class'], axis=1)X = np.array(data_new.values)trian_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.1, stratify=y, random_state=33)# 邏輯回歸分類clf = LogisticRegression(n_jobs=-1)clf.fit(trian_x, train_y)predict_y = clf.predict(test_x)# 預測樣本的置信分數score_y = clf.decision_function(test_x)# 計算混淆矩陣cm = confusion_matrix(test_y, predict_y)class_names = [0, 1]# 顯示混淆矩陣self.plot_confusion_matrix(cm, classes=class_names, title='邏輯回歸 混淆矩陣')# 顯示模型評估分數self.show_metrics(cm)# 計算精確率、召回率、閾值用于可視化precision, recall, thresholds = precision_recall_curve(test_y, score_y)self.plot_precision_recall(recall, precision)if __name__ == '__main__':data_ori = pd.read_csv(r'C:\My_data\Study\數據分析實戰\credit_fraud\creditcard.csv')print(data_ori.describe())credit = CreditFraud()credit.logic_regress(data_ori)?
總結
以上是生活随笔為你收集整理的逻辑回归分类——信用卡诈骗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux cat如何自动退出,Linu
- 下一篇: 玩转Mixly – 10、Arduino