您現在的位置是:首頁 > 棋牌

Logistic迴歸分析--以良惡性乳腺癌腫資料集為例

  • 由 生活有百味 發表于 棋牌
  • 2021-06-17
簡介metrics import classification_report import pandas as pd import numpy as np def logistic(): #獲取資料 column_list = [‘Sample

迴歸分析中的迴歸是什麼含義

本文作者:陳 鼎,中南財經政法大學統計與數學學院文字編輯:任 哲技術總編:張馨月

Logistic迴歸分析是一種廣義的線性迴歸分析模型,常用於資料探勘,疾病自動診斷,經濟預測等領域。Logistic迴歸在二十世紀初用於生物科學, 隨後被用於許多社會科學應用中。關於該模型的演算法和原理介紹,大家可以在今天推送的

第二篇

推文《Logistic迴歸理論與模型簡介》裡瞭解。在本文中,我們將以良/惡性乳腺癌腫資料集為例,簡要介紹Logistic迴歸的程式碼實現。

一、程式碼實現

(一) 讀取資料集

本案例使用“良/惡性乳腺癌腫資料集”,該資料集收集了699條病人樣本,共11列資料。第一列為檢索的患者id,後9列包括了與癌症相關的9個特徵指標,分別為腫塊厚度(Clump Thickness),細胞大小的均勻性(Uniformity of Cell Size),細胞形狀的均勻性(Uniformity of Cell Shape),邊際附著力(Marginal Adhesion),單個上皮細胞大小(Single Epithelial Cell Size),裸核(Bare Nuclei),淡色染色質(Bland Chromatin),正常核(Normal Nucleoli),核分裂(mitoses)。類別(class)代表良性/惡性腫瘤,分別以2,4代替。資料中包含16個缺失值,以“?”標出。首先匯入下文需要使用的庫和資料集:

from sklearn。linear_model import LogisticRegression from sklearn。preprocessing import StandardScaler from sklearn。model_selection import train_test_split from sklearn。metrics import classification_report import pandas as pd import numpy as np #1。獲取資料 column_list = [‘Sample code number’,‘Clump Thickness’, ‘Uniformity of Cell Size’,‘Uniformity of Cell Shape’,‘Marginal Adhesion’,‘Single Epithelial Cell Size’,‘Bare Nuclei’,‘Bland Chromatin’,‘Normal Nucleoli’,‘Mitoses’,‘Class’] dataset = pd。read_csv(“https://archive。ics。uci。edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin。data” ,names = column_list) pd。set_option(‘display。max_columns’,None) dataset。head()

image

(二) 特徵工程

1.處理缺失值

將資料集中帶“?”的資料替換成np。nan,再利用Pandas庫的dropna函式便能快速地將缺失值刪除。程式碼如下:

dataset = dataset。replace(“?”,np。nan) dataset = dataset。dropna()

2.劃分資料

分析上述資料集,第一列(Sample code number)是我們不需要的,應將其捨去;最後一列(Class)是我們的預測分類結果。利用sklearn。model_selection庫中的train_test_split方法,實現訓練集與測試集的劃分。

y= dataset[‘Class’] x = dataset。iloc[:,2:10] x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0。25)

x_train,x_test,y_train,y_test的含義在推文《樸素貝葉斯演算法——以20Newsgroups資料集為例》中已經闡明,這裡不再贅述。

3.資料標準化

為避免異常值對模型擬合產生影響,對每個特徵進行標準化。匯入sklearn。preprocessing中的StandardScaler,可以方便地對資料集按列進行標準化操作。標準化的公式與程式碼如下:

std = StandardScaler() x_train = std。fit_transform(x_train) x_test = std。transform(x_test)

(三) 進行Logistic迴歸

匯入sklearn。linear_model中的Logistic Regression方法,例項化一個Logistic分類器,傳入訓練集供分類器學習。值得注意的是,在該案例中,我們需要關注的是查全率而非查準率(放過一個惡性癌症患者所帶來的成本與風險要比誤診一個良性癌症患者所帶來的成本高得多),因此我們利用sklearn。metrics中的classification_report方法,透過檢視其查全率來觀察該分類器的預測效果。在預測之前,我們按住ctrl+B定位到LogisticRegression的原始碼中,可以看到sklearn庫中LogisticRegression預設設定的正則化項係數為l2(嶺迴歸),且正則化力度為1。0。如下圖所示:

image

以下是程式碼實現:

lg = LogisticRegression() lg。fit(x_train,y_train) y_predict = lg。predict(x_test) print(“預測模型的係數為:”,lg。coef_) print(“測試集的預測結果為:”,y_predict) print(“準確率為:”,lg。score(x_test,y_test)) print(“查準率與查重率:”,classification_report(y_test, y_predict, labels=[2,4], target_names=[“良性”,“惡性”],))

其輸出結果如下圖所示:

image

從上圖輸出結果可以看出,模型擬合的十分完美,其中惡性腫瘤的查全率(recall)已經到了99%。這也證明了前文的論斷:Logistic迴歸分析往往在預測癌症,預測廣告點選率,電商購物等領域表現良好。Logistic迴歸與樸素貝葉斯分類器都作為有監督學習,其演算法都涉及到預測機率,具有一定的相同之處,但是有如下區別:1。Logistic迴歸屬於判別模型,樸素貝葉斯分類器屬於生成模型。2。Logistic迴歸只能解決二分類問題(多分類問題需依賴softmax與神經網路),樸素貝葉斯分類器可以解決多分類問題。3。Logistic迴歸具有超引數(如帶有嶺迴歸的線性模型中的正則化項係數),其模型可以透過交叉驗證法不斷最佳化,樸素貝葉斯分類器則不行。4。Logistic迴歸在預測患病,廣告點選等方面應用廣泛,樸素貝葉斯分類器常用於於文字分類中。

二、原始碼

將上述過程封裝成函式,完整程式碼如下:

from sklearn。linear_model import LogisticRegression from sklearn。preprocessing import StandardScaler from sklearn。model_selection import train_test_split from sklearn。metrics import classification_report import pandas as pd import numpy as np def logistic(): #獲取資料 column_list = [‘Sample code number’,‘Clump Thickness’, ‘Uniformity of Cell Size’,‘Uniformity of Cell Shape’,‘Marginal Adhesion’,‘Single Epithelial Cell Size’,‘Bare Nuclei’,‘Bland Chromatin’,‘Normal Nucleoli’,‘Mitoses’,‘Class’] dataset = pd。read_csv(“https://archive。ics。uci。edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin。data” ,names = column_list) pd。set_option(‘display。max_columns’,None) print(dataset。head()) #刪除缺失值 dataset = dataset。replace(“?”,np。nan) dataset = dataset。dropna() #進行資料分割 y = dataset[‘Class’] x = dataset。iloc[:,2:10] x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0。25) #進行標準化 std = StandardScaler() x_train = std。fit_transform(x_train) x_test = std。transform(x_test) #進行logistic預測 lg = LogisticRegression() lg。fit(x_train,y_train) y_predict = lg。predict(x_test) print(“預測模型的係數為:”,lg。coef_) print(“測試集的預測結果為:”,y_predict) print(“準確率為:”,lg。score(x_test,y_test)) print(“查準率與查重率:”,classification_report(y_test, y_predict, labels=[2,4], target_names=[“良性”,“惡性”],)) if __name__ == ‘__main__’: logistic()

Top