本文作者:陳?鼎侯嘀,中南財經(jīng)政法大學(xué)統(tǒng)計與數(shù)學(xué)學(xué)院
文字編輯:任?哲
技術(shù)總編:張馨月
??Logistic回歸分析是一種廣義的線性回歸分析模型偏窝,常用于數(shù)據(jù)挖掘贡必,疾病自動診斷,經(jīng)濟預(yù)測等領(lǐng)域比搭。Logistic回歸在二十世紀初用于生物科學(xué), 隨后被用于許多社會科學(xué)應(yīng)用中南誊。關(guān)于該模型的算法和原理介紹敢辩,大家可以在今天推送的第二篇推文《Logistic回歸理論與模型簡介》里了解。在本文中弟疆,我們將以良/惡性乳腺癌腫數(shù)據(jù)集為例戚长,簡要介紹Logistic回歸的代碼實現(xiàn)。
一怠苔、代碼實現(xiàn)
(一) 讀取數(shù)據(jù)集
??本案例使用“良/惡性乳腺癌腫數(shù)據(jù)集”同廉,該數(shù)據(jù)集收集了699條病人樣本,共11列數(shù)據(jù)。第一列為檢索的患者id迫肖,后9列包括了與癌癥相關(guān)的9個特征指標锅劝,分別為腫塊厚度(Clump Thickness),細胞大小的均勻性(Uniformity of Cell Size)蟆湖,細胞形狀的均勻性(Uniformity of Cell Shape)故爵,邊際附著力(Marginal Adhesion),單個上皮細胞大小(Single Epithelial Cell Size)隅津,裸核(Bare Nuclei)诬垂,淡色染色質(zhì)(Bland Chromatin),正常核(Normal Nucleoli)伦仍,核分裂(mitoses)结窘。類別(class)代表良性/惡性腫瘤,分別以2,4代替充蓝。數(shù)據(jù)中包含16個缺失值隧枫,以"?"標出。首先導(dǎo)入下文需要使用的庫和數(shù)據(jù)集:
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.獲取數(shù)據(jù)
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()
(二) 特征工程
1.處理缺失值
??將數(shù)據(jù)集中帶"?"的數(shù)據(jù)替換成np.nan谓苟,再利用Pandas庫的dropna函數(shù)便能快速地將缺失值刪除官脓。代碼如下:
dataset = dataset.replace("?",np.nan)
dataset = dataset.dropna()
2.劃分數(shù)據(jù)
??分析上述數(shù)據(jù)集,第一列(Sample code number)是我們不需要的涝焙,應(yīng)將其舍去卑笨;最后一列(Class)是我們的預(yù)測分類結(jié)果。利用sklearn.model_selection庫中的train_test_split方法纱皆,實現(xiàn)訓(xùn)練集與測試集的劃分湾趾。
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數(shù)據(jù)集為例》中已經(jīng)闡明,這里不再贅述派草。
3.數(shù)據(jù)標準化
??為避免異常值對模型擬合產(chǎn)生影響搀缠,對每個特征進行標準化。導(dǎo)入sklearn.preprocessing中的StandardScaler近迁,可以方便地對數(shù)據(jù)集按列進行標準化操作艺普。標準化的公式與代碼如下:
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
(三) 進行Logistic回歸
??導(dǎo)入sklearn.linear_model中的Logistic Regression方法,實例化一個Logistic分類器鉴竭,傳入訓(xùn)練集供分類器學(xué)習(xí)歧譬。值得注意的是,在該案例中搏存,我們需要關(guān)注的是查全率而非查準率(放過一個惡性癌癥患者所帶來的成本與風(fēng)險要比誤診一個良性癌癥患者所帶來的成本高得多)瑰步,因此我們利用sklearn.metrics中的classification_report方法,通過查看其查全率來觀察該分類器的預(yù)測效果璧眠。在預(yù)測之前缩焦,我們按住ctrl+B定位到LogisticRegression的源碼中读虏,可以看到sklearn庫中LogisticRegression默認設(shè)置的正則化項系數(shù)為l2(嶺回歸),且正則化力度為1.0袁滥。如下圖所示:
??以下是代碼實現(xiàn):
lg = LogisticRegression()
lg.fit(x_train,y_train)
y_predict = lg.predict(x_test)
print("預(yù)測模型的系數(shù)為:",lg.coef_)
print("測試集的預(yù)測結(jié)果為:",y_predict)
print("準確率為:",lg.score(x_test,y_test))
print("查準率與查重率:",classification_report(y_test, y_predict, labels=[2,4], target_names=["良性","惡性"],))
??其輸出結(jié)果如下圖所示:
??從上圖輸出結(jié)果可以看出盖桥,模型擬合的十分完美,其中惡性腫瘤的查全率(recall)已經(jīng)到了99%题翻。這也證明了前文的論斷:Logistic回歸分析往往在預(yù)測癌癥揩徊,預(yù)測廣告點擊率,電商購物等領(lǐng)域表現(xiàn)良好嵌赠。Logistic回歸與樸素貝葉斯分類器都作為有監(jiān)督學(xué)習(xí)塑荒,其算法都涉及到預(yù)測概率,具有一定的相同之處猾普,但是有如下區(qū)別:1.Logistic回歸屬于判別模型袜炕,樸素貝葉斯分類器屬于生成模型本谜。2.Logistic回歸只能解決二分類問題(多分類問題需依賴softmax與神經(jīng)網(wǎng)絡(luò))初家,樸素貝葉斯分類器可以解決多分類問題。3.Logistic回歸具有超參數(shù)(如帶有嶺回歸的線性模型中的正則化項系數(shù))乌助,其模型可以通過交叉驗證法不斷優(yōu)化溜在,樸素貝葉斯分類器則不行。4.Logistic回歸在預(yù)測患病他托,廣告點擊等方面應(yīng)用廣泛掖肋,樸素貝葉斯分類器常用于于文本分類中。
二赏参、源碼
??將上述過程封裝成函數(shù)志笼,完整代碼如下:
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():
#獲取數(shù)據(jù)
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()
#進行數(shù)據(jù)分割
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)
#進行l(wèi)ogistic預(yù)測
lg = LogisticRegression()
lg.fit(x_train,y_train)
y_predict = lg.predict(x_test)
print("預(yù)測模型的系數(shù)為:",lg.coef_)
print("測試集的預(yù)測結(jié)果為:",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()