本文共 3399 字,大约阅读时间需要 11 分钟。
机器学习(十三)逻辑回归
文章目录
一.什么是逻辑回归
我们之前学习的线性回归,主要是应用在连续型数据上,也被称作:多重线性回归。在理解了多重现行线性回归的基础上,我们才能比较容易理解逻辑回归。两者有共同点,也有不同点。
-
相同点:二者的模型形式基本上相同,以单变量为例,二者都具有 w*x+b这种形式
-
不同点:
多重线性回归直接将w*x+b作为因变量,即y =w*x+b,而逻辑回归则通过函数L将w*x+b对应到另一个状态p,即:p =L(w*x+b),然后根据p 与1-p的大小决定因变量的值。
-
某些方面讲,线性回归也有一个L,只是这个L相当于p = 1 * (w*x + b)。因此,我们可以这么理解:如果L是逻辑函数,就是逻辑回归,如果L是多项式函数就是多项式回归……
那么,这个逻辑函数是什么呢?
其实有很多种逻辑函数,但是在深度学习当中,最为常用的事Sigmoid函数:
Sigmoid函数的图像如下图所示:
于是,我们把线性回归函数的矩阵形式作为自变量代入,就得到了逻辑回归的方程式:
其实那里面的theta,就是我们之前说的W。只是表示的符号变了一个。
由于Sigmoid函数大致一看,最大值无限接近1。因此和概率问题有点像,毕竟概率不可能大于一。因此,逻辑回归的输出值也是在[0, 1]之间。其中取p=0.5作为一个界限,一旦输出值小于0.5, 我们干脆就直接取0。 否则,就直接取1。
正是因为这个理念,以Sigmoid函数作为逻辑函数的逻辑回归方程,经常用于二分类问题,因此逻辑回归是用来处理分类问题的。
二.什么是二分类问题
说白了就是二选一的问题。比如说:
-
广告点击率。对于用户而言,要么点击这个广告,要么不点击,就这两个选项。不可能有第三个选项
-
判断用户的性别。不考虑欧美那些政治正确的东西,整体而言,就是女性,男性两种性别。没有第三个选项
-
预测用户是否会购买给定的商品类:要么买,要么不买。
三.逻辑回归的损失函数
与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解。
对数似然损失函数:
完整的损失函数:
这个损失函数是可以推导出来的,详细见: 的第三部分。在这里,我们需要跟线性回归的损失函数做一个对比。在线性回归当中,均方误差不存在多个局部最低点。但是,对数似然损失却有多个局部最小值,就像下面这张图:
利用梯度下降的方式,其实你只能无限接近于那个极小值点,但是,这个极小值点是不是最小值点,你却并不好做判断,而且,很遗憾,现在也没有什么有效办法能解决这个问题。因此,经过不断的总结,人们逐渐想出了一些其他方式,比如:
- 1、多次随机初始化,多次比比较最小小值结果
- 2、求解过程当中,不断调整学习率
不过,以上方式都是治标不治本的方法。只能做到尽量改善
除了以上这两个,还有BGD(批量梯度下降), SGD(随机梯度下降)。具体可以见的第五部分。四.逻辑回归的使用
4.1 相关API
在sklearn中,逻辑回归的API如下:
sklearn.linear_model.LogisticRegressionklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0) #Logistic回归分类器"""penalty:其实是指定哪种正则化,l1还是l2?c:正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数coef_:回归系数"""
4.2 相关案例
这是一个良性/恶性肿瘤的预测案例。相关数据存放在如下链接:
https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/
这个数据当中包含699条样本,共11列数据,第一列为检索的id,后9列分别是与肿瘤相关的医学特征,最后一列表示肿瘤类型的数值。其中包含16个缺失值,用”?”标出。
这组数据包含如下字段,在原链接当中有说明,但是却没有出现在原始数据当中,因此,在read_csv的时候,得利用里面的names参数构造出一个属性列表
'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'
相关代码如下:
from sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.metrics import classification_reportimport numpy as npimport pandas as pddef logistic(): """ 逻辑回归做二分类进行癌症预测(根据细胞的属性特征) :return: NOne """ # 构造列标签名字 column = ['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("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column) print(data) # 缺失值进行处理,将?替换为nan,然后利用np自带的dropna方法把这些无效数据删除 data = data.replace(to_replace='?', value=np.nan) data = data.dropna() # 进行数据的分割,第0列为患者id,因此我们不需要。我们把1~9列设置为训练集,最后一列设置为目标值,样本取25% x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25) # 进行标准化处理 std = StandardScaler() x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # 逻辑回归预测 lg = LogisticRegression(C=1.0) lg.fit(x_train, y_train) print(lg.coef_) y_predict = lg.predict(x_test) print("准确率:", lg.score(x_test, y_test)) print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])) return Noneif __name__ == "__main__": logistic()
转载地址:https://blog.csdn.net/johnny_love_1968/article/details/116138620 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!