Logistic回归分析——以良/恶性乳腺癌肿数据集为例

本文作者:陈 鼎,中南财经政法大学统计与数学学院
文字编辑:任 哲
技术总编:张馨月

  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,可以方便地对数据集按列进行标准化操作。标准化的公式与代码如下:

x^* =\frac{x-\bar{x}}{\sigma}

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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342