1 import pandas as pd 2 import numpy as np 3 from sklearn.preprocessing import StandardScaler # 標准化 4 from sklearn.model_selection import train_test_split # 數據集拆分 5 from sklearn.linear_model import LogisticRegression 6 from sklearn.metrics import classification_report 7 from sklearn.metrics import roc_auc_score 8 9 # 加載數據 10 data = pd.read_csv("./breast-cancer-wisconsin.data", header=None) 11 # print("data:\n", data) 12 # 指定其列索引名稱 13 columns = [ 14 "Sample code number", 15 "Clump Thickness", 16 "Uniformity of Cell Size", 17 "Uniformity of Cell Shape", 18 "Marginal Adhesion", 19 "Single Epithelial Cell Size", 20 "Bare Nuclei", 21 "Bland Chromatin", 22 "Normal Nucleoli", 23 "Mitoses", 24 "Class" 25 ] 26 # 設置列索引 27 data.columns = columns 28 # print("data:\n", data) 29 30 # 1、篩選出特征與目標值,將不重要、無關的特征干掉 31 # 將id_編碼 給刪除 32 data = data.iloc[:, 1:] 33 print("數據集:\n", data) 34 35 # 2、檢測缺失值,並處理缺失值 36 # res_null = pd.isnull(data).sum() 37 # print("檢測缺失值的結果:\n", res_null) 38 39 # 3、先將"?"替換成np.nan類型 40 data.replace("?", np.nan, inplace=True) 41 42 # 4、檢測 43 res_null = pd.isnull(data).sum() 44 print("檢測缺失值的結果:\n", res_null) 45 46 # 5、處理缺失值 47 # 刪除法 48 # 填充法 49 # 插值法 50 # 刪除法 51 data.dropna(how="any", axis=0, inplace=True) 52 print("刪除缺失值之后的結果為:\n", data.shape) 53 54 # 數據集拆分--- 55 train_x, test_x, train_y, test_y = train_test_split(data.iloc[:, :9].values, data.iloc[:, 9].values, test_size=0.3, 56 random_state=1) 57 58 # 6、標准化處理數據 59 # 標准差標准化 60 # (1)實例化對象 61 stand = StandardScaler() 62 # (2)計算指標並進行數據轉化---只需要標准化特征值 63 train_x = stand.fit_transform(train_x) 64 test_x = stand.fit_transform(test_x) 65 66 # 7、構建邏輯回歸模型進行癌症預測 67 # (1)構建算法實例 68 lr = LogisticRegression() 69 # (2)訓練數據 70 lr.fit(train_x, train_y) 71 # (3)預測 72 y_predict = lr.predict(test_x) 73 74 # 獲取准確率 75 score = lr.score(test_x, test_y) # 准確率為96.1% # 3.9%錯誤率 76 77 # 獲取權重與偏置 78 weight = lr.coef_ 79 bias = lr.intercept_ 80 81 print("預測值:\n", y_predict) 82 print("准確率:\n", score) 83 print("權重:\n", weight) 84 print("偏置:\n", bias) 85 print("*" * 100) 86 87 # 癌症患者---去體檢---檢測為健康---造成結果:錯過最佳治療時間,人命關天。---不能接受的 88 # 健康的人--體檢 ---檢測為癌症 ----造成后果:復檢。 89 90 # 在 二分類情況下,兩種結果的重要性程度不一樣的情況下,准確率將不再是唯一的評判標准 91 # 召回率 --對於分類的評估 92 # 召回率= 預測為正例/真實類別為正例 # 越高越好--查的全 93 res_report = classification_report(y_true=test_y, y_pred=y_predict, labels=[2, 4], target_names=["良性", "惡性"]) 94 print("res_report:\n", res_report) 95 96 # 模型還不錯 召回率為0.96 准確率為0.96 97 # 比如說:樣本數據100個樣本,1個正常,99個癌症患者-----正例為正常的 98 # 預測 100個全部為癌症患者 ----准確率99% 99 # 召回率:0/1 = 0 召回率為0 100 # 此時以癌症患者為正例:准確率為99% 召回率為 99/99 = 1 101 # 應用的時候---全部預測為癌症患者 102 103 # 樣本不均衡情況下,召回率、准確率 又不能完全去衡量 結果 104 # AUC指標--只用在 樣本不均衡的情況 105 # ROC曲線 106 # 在不同閾值的情況下,TPR(召回率) 與FPR 描繪出的曲線就是ROC曲線 107 # AUC ---ROC曲線與TPR與FPR 右下部分組成面積 108 # 對於好的模型---AUC指標>0.5 109 # AUC為 1 ,那么預測完全准確,那么這個模型叫最優模型(理想狀態下) 110 # AUC最壞的情況下,AUC=0.5 111 # AUC --->(0.5,1) 112 # 意義:隨機取一個正樣本,預測為正例樣本的概率 > 反例樣本的概率 113 # 隨機選一個反例樣本,預測為正例的概率 < 閾值 114 # y_true 傳真實類別,正例為1 反例為0 115 # y_score --預測值 116 # 可以使用三目表達式 117 # 參數1 條件 118 # 參數2 條件成立執行它 119 # 參數3 條件為假執行它 120 # test_y = np.where(test_y > 3, 1, 0) 121 # print("test_y:\n", test_y) 122 # res_score = roc_auc_score(y_true=test_y, y_score=y_predict) 123 # print("AUC指標:\n", res_score) # 0.95 124 125 # 假設已經發現樣本不均衡----將樣本變為均衡的
