Python數據分析與挖掘----Logistic迴歸

從零開始學python數據分析與挖掘----Logistic迴歸

# 導入第三方模塊
import pandas as pd
import numpy as np
from sklearn import linear_model
from sklearn import model_selection

# 讀取數據
sports = pd.read_csv('C:\\Users\\Administrator.SKY-20180518VHY\\Desktop\\shujufenxi\\第9章 Logistic迴歸分類模型\\Run or Walk.csv',engine='python')
# 提取出所有自變量名稱
predictors = sports.columns[4:]
#print(predictors)
# 構建自變量矩陣
X = sports.loc[:,predictors]

# 提取y變量值
y = sports.activity
# 將數據集拆分爲訓練集和測試集
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size = 0.25, random_state = 1234)

# 利用訓練集建模
sklearn_logistic = linear_model.LogisticRegression()
sklearn_logistic.fit(X_train, y_train)
# 返回模型的各個參數
print(sklearn_logistic.intercept_, sklearn_logistic.coef_)
# 模型預測
sklearn_predict = sklearn_logistic.predict(X_test)
# 預測結果統計
print(pd.Series(sklearn_predict).value_counts())


# 導入第三方模塊
from sklearn import metrics
# 混淆矩陣
cm = metrics.confusion_matrix(y_test, sklearn_predict, labels = [0,1])
print(cm)


Accuracy = metrics.scorer.accuracy_score(y_test, sklearn_predict)
Sensitivity = metrics.scorer.recall_score(y_test, sklearn_predict)
Specificity = metrics.scorer.recall_score(y_test, sklearn_predict, pos_label=0)
print('模型準確率爲%.2f%%:' %(Accuracy*100))
print('正例覆蓋率爲%.2f%%' %(Sensitivity*100))
print('負例覆蓋率爲%.2f%%' %(Specificity*100))
# 混淆矩陣的可視化
# 導入第三方模塊
import seaborn as sns
# 繪製熱力圖
sns.heatmap(cm, annot = True, fmt = '.2e',cmap = 'GnBu')
# 圖形顯示
plt.show()


# y得分爲模型預測正例的概率
y_score = sklearn_logistic.predict_proba(X_test)[:,1]
# 計算不同閾值下,fpr和tpr的組合值,其中fpr表示1-Specificity,tpr表示Sensitivity
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 計算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 繪製面積圖
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加邊際線
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加對角線
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x軸與y軸標籤
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 顯示圖形
plt.show()

import matplotlib.pyplot as plt
# 自定義繪製ks曲線的函數
def plot_ks(y_test, y_score, positive_flag):
    # 對y_test,y_score重新設置索引
    y_test.index = np.arange(len(y_test))
    #y_score.index = np.arange(len(y_score))
    # 構建目標數據集
    target_data = pd.DataFrame({'y_test':y_test, 'y_score':y_score})
    # 按y_score降序排列
    target_data.sort_values(by = 'y_score', ascending = False, inplace = True)
    # 自定義分位點
    cuts = np.arange(0.1,1,0.1)
    # 計算各分位點對應的Score值
    index = len(target_data.y_score)*cuts
    scores = target_data.y_score.iloc[index.astype('int')]
    # 根據不同的Score值,計算Sensitivity和Specificity
    Sensitivity = []
    Specificity = []
    for score in scores:
        # 正例覆蓋樣本數量與實際正例樣本量
        positive_recall = target_data.loc[(target_data.y_test == positive_flag) & (target_data.y_score>score),:].shape[0]
        positive = sum(target_data.y_test == positive_flag)
        # 負例覆蓋樣本數量與實際負例樣本量
        negative_recall = target_data.loc[(target_data.y_test != positive_flag) & (target_data.y_score<=score),:].shape[0]
        negative = sum(target_data.y_test != positive_flag)
        Sensitivity.append(positive_recall/positive)
        Specificity.append(negative_recall/negative)
    # 構建繪圖數據
    plot_data = pd.DataFrame({'cuts':cuts,'y1':1-np.array(Specificity),'y2':np.array(Sensitivity), 
                              'ks':np.array(Sensitivity)-(1-np.array(Specificity))})
    # 尋找Sensitivity和1-Specificity之差的最大值索引
    max_ks_index = np.argmax(plot_data.ks)
    plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y1.tolist()+[1], label = '1-Specificity')
    plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y2.tolist()+[1], label = 'Sensitivity')
    # 添加參考線
    plt.vlines(plot_data.cuts[max_ks_index], ymin = plot_data.y1[max_ks_index], 
               ymax = plot_data.y2[max_ks_index], linestyles = '--')
    # 添加文本信息
    plt.text(x = plot_data.cuts[max_ks_index]+0.01,
             y = plot_data.y1[max_ks_index]+plot_data.ks[max_ks_index]/2,
             s = 'KS= %.2f' %plot_data.ks[max_ks_index])
    # 顯示圖例
    plt.legend()
    # 顯示圖形
    plt.show()
# 調用自定義函數,繪製K-S曲線
plot_ks(y_test = y_test, y_score = y_score, positive_flag = 1)

注:參考《從零開始學Python數據分析與挖掘》

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