[转载] python之sklearn-分类算法-3.4 逻辑回归与二分类

参考链接: Python中的逻辑门

一,逻辑回归的应用场景 

广告点击率是否为垃圾邮件是否患病金融诈骗虚假账号 

二,逻辑回归的原理 

1,输入 

逻辑回归的输入是线性回归的结果:  

2,激活函数 

1)sigmoid函数 

  回归的结果输入到sigmod函数当中 

输出结果:[0,1]区间中的一个概率值,默认为0.5的门限值 

2)注意: 

逻辑回归的最终分类是通过某个类别的概率来判断是否属于某个类别,并且这个类别默认标记为1(正例),另一个标记为0(反例)。默认目标值少的为正例。 

3,损失函数 

1)对数似然损失公式 

逻辑回归的损失,称之为对数似然损失,公式如下:    

2)综合完整损失函数如下: 


3)理解对数似然损失示例如下: 

 如上可知,降低损失需要(正例减少sigmoid返回结果,反例增加sigmod返回结果) 

4,优化方法 

同样使用梯度下降优化算法,去减少损失函数的值,这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本为0类别的概率。 

三,逻辑回归API 

sklearn.linear_model.LogisticRegression(solver=‘liblinear’,penalty=‘i2’,c=1.0) 

solver:优化求解方式(默认开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数) 

  sag:根据数据集自动选择,随机平局梯度下降 penalty:正则化种类c:正则化力度 


 默认将类别数量少的当正例 


四,案例:癌症分类预测 

数据源:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/ 

import pandas as pd

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression

def logisticregression():

    '''逻辑回归癌症预测'''

    # 确定数据columns数值

    columns = ["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"]

    data = pd.read_csv("breast-cancer-wisconsin.data",names=columns)

    # 去掉缺失值

    data.replace(to_replace="?",value=np.nan,inplace=True)

    data.dropna(axis=0,inplace=True,how="any")

    # 提取目标值

    target = data["Class"]

    # 提取特征值

    data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

    # 切割训练集和测试集

    x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

    # 进行标准化

    std = StandardScaler()

    x_train = std.fit_transform(x_train)

    x_test = std.fit_transform(x_test)

    # 逻辑回归进行训练和预测

    lr = LogisticRegression()

    lr.fit(x_train,y_train)

    print("逻辑回归权重:",lr.coef_)

    print("逻辑回归偏置:",lr.intercept_)

    # 逻辑回归测试集预测结果

    pre_result = lr.predict(x_test)

    print(pre_result)

    # 逻辑回归预测准确率

    sore = lr.score(x_test,y_test)

    print(sore)

if __name__ == '__main__':

    logisticregression()


五,二分类的评估方法–(精确率(Precision)与召回率(Recall)) 

1,精确率: 

预测结果为正例样本中真是为整理的比例(查的准)  

2,召回率: 

真是为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)  

3,F1-score 

反应了模型的稳健型  

4,模型评估API 

sklearn.metrics.classification_report(y_true,y_pred,target_names=None) 

y_true: 真实目标值y_pred: 估计器预测目标值target_names: 目标类名称return: 每个类别精准率与召回率 

5,代码 

import pandas as pd

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import classification_report

def logisticregression():

    '''逻辑回归癌症预测'''

    # 确定数据columns数值

    columns = ["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"]

    data = pd.read_csv("breast-cancer-wisconsin.data",names=columns)

    # 去掉缺失值

    data.replace(to_replace="?",value=np.nan,inplace=True)

    data.dropna(axis=0,inplace=True,how="any")

    # 提取目标值

    target = data["Class"]

    # 提取特征值

    data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

    # 切割训练集和测试集

    x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

    # 进行标准化

    std = StandardScaler()

    x_train = std.fit_transform(x_train)

    x_test = std.fit_transform(x_test)

    # 逻辑回归进行训练和预测

    lr = LogisticRegression()

    lr.fit(x_train,y_train)

    # 得到训练集返回数据

    # print("逻辑回归权重:",lr.coef_)

    # print("逻辑回归偏置:",lr.intercept_)

    # 逻辑回归测试集预测结果

    pre_result = lr.predict(x_test)

    # print(pre_result)

    # 逻辑回归预测准确率

    sore = lr.score(x_test,y_test)

    print(sore)

    # 精确率(Precision)与召回率(Recall)

    report = classification_report(y_test,pre_result,target_names=["良性","恶性"])

    print(report)

if __name__ == '__main__':

    logisticregression()


六,ROC曲线与AUC指标 


 问题:如何衡量样本不均衡下的评估? 


1,ROC曲线与FPR 

TPR = TP / (TP + FN) 

  所有真实类别为1的样本中,预测类别为1的比例 FPR = FP / (TP + FN) 

  所有真实类别为0的样本中,预测类别为1的比例  

2,ROC曲线 

ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别时1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5 。  

3,AUC指标 

AUC的概率意义时随机取一对正负样本,正样本得分大于负样本的概率。AUC的最小值为0.5,最大值为1,取值越高越好。AUC=1,完美分类器,采用这个预测模型时,不管设定什么门限值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。0.5<AUC<1,优于随机猜测. 这个分类器(模型)妥善设定限制的话,能有预测价值。AUC=0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。AUC<0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测,因此不存在AIC<0.5的情况 


 最终AUC的范围在[0.5,1],并且越接近1越好。 


4,AUC计算API 

from sklearn.metrics import roc_auc_score 

sklearn.metrics.roc_auc_score(y_true,y_score) 

  计算ROC曲线面积,即AUC值y_true:每个样本的真是类别,必须为0(反例),1(正例)标记y_score:每个样本预测的概率值  

import pandas as pd

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import classification_report,roc_auc_score

def logisticregression():

    '''逻辑回归癌症预测'''

    # 确定数据columns数值

    columns = ["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"]

    data = pd.read_csv("breast-cancer-wisconsin.data",names=columns)

    # 去掉缺失值

    data.replace(to_replace="?",value=np.nan,inplace=True)

    data.dropna(axis=0,inplace=True,how="any")

    # 提取目标值

    target = data["Class"]

    # 提取特征值

    data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

    # 切割训练集和测试集

    x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

    # 进行标准化

    std = StandardScaler()

    x_train = std.fit_transform(x_train)

    x_test = std.fit_transform(x_test)

    # 逻辑回归进行训练和预测

    lr = LogisticRegression()

    lr.fit(x_train,y_train)

    # 得到训练集返回数据

    # print("逻辑回归权重:",lr.coef_)

    # print("逻辑回归偏置:",lr.intercept_)

    # 逻辑回归测试集预测结果

    pre_result = lr.predict(x_test)

    # print(pre_result)

    # 逻辑回归预测准确率

    sore = lr.score(x_test,y_test)

    print(sore)

    # 精确率(Precision)与召回率(Recall)

    report = classification_report(y_test,pre_result,target_names=["良性","恶性"])

    print(report)

    # 查看AUC指标

    y_test = np.where(y_test>2.5,1,0)

    print(y_test)

    auc_score = roc_auc_score(y_test,pre_result)

    print(auc_score)


if __name__ == '__main__':

    logisticregression()


5,总结 

AUC只能用来评价二分类AUC非常适合评价样本不平衡中的分类器性能AUC会比较预测出来的概率,而不仅仅是标签类AUC指标大于0.7,一般都是比较好的分类器 

七,Scikit-learn的算法实现总结 

scikit-learn把梯度下降求解的单独分开,叫SGDclassifier和SGDRegressor,他们的损失都是分类和回归对应的损失,比如分类:有log loss, 和 hingle loss(SVM)的,回归如:比如 均方误差, 其它的API是一样的损失,求解并不是用梯度下降的,所以一般大规模的数据都是用scikit-learn其中SGD的方式求解。

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

推荐阅读更多精彩内容