机器学习之逻辑回归(对数几率回归)
机器学习算法之逻辑回归(对数几率回归)- 做分类的
一、概述:
逻辑(logistic)回归, 又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域
1、几率
几率:一个时间发生的概率 / 不发生的概率
2、逻辑
逻辑:指的是logistic function
3、回归
回归:来源于线性回归的 Z = XW,使用线性回归去拟合逼近一个‘界’,使得按照这个界进行数据分类后得到的损失函数最小,以概率0.5为分界线,将数据分为正例和反例,使得Z> 0对应于‘正例’(趋近于概率为1),Z< 0对应于‘反例’(趋近于概率为0),使用回归的思想去解决分类问题
二、作用
总的来说,逻辑回归是用来预测离散值输出只有0和1的离散型输出,做二分类(1/0)任务,并给出相应的概率
三、模型
灵感过程
想要解决一个分类问题,从简单的二分类先开始
数据标签是(1/0)
可以使用最简单的单位阶跃函数
在解决问题的迭代优化是需要使用到微分和导数,但是阶跃函数不连续,因此使用link function代替,使其连续可导, 横坐标是Z, 纵坐标是y, 定义域是服务穷到正无穷,值域是0-1(可对应于概率值0-1),link function 对于逻辑回归来说,就是Sigmoid函数:
Sigmoid函数的性质
- Sigmoid函数是一个S型的函数,当自变量z趋近正无穷时,因变量g(z)趋近于1,而当z趋近负无穷时, g(z)趋近于0,它能够将任何实数映射到(0,1)区间,使其可用于将任意值函数转换为更适合二分类的函 数。
四、损失函数
逻辑回归的损失函数由极大似然估计法得出,过程可以写作:
负对数似然函数:
cost=−∑(y∗log(h)−(1−y∗)log(1−h))cost = -\sum (y^{*}log(h) - (1-y^{*})log(1-h)) cost=−∑(y∗log(h)−(1−y∗)log(1−h))
J(Θ)=−∑[yi∗log(yθ(xi))−(1−yi∗)log(1−yθ(xi)]J(\Theta ) = -\sum [y_{i}^{*}log(y_{\theta }(x_{i}))- (1 - y_{i}^{*})log(1 -y_{\theta }(x_{i})] J(Θ)=−∑[yi∗log(yθ(xi))−(1−yi∗)log(1−yθ(xi)]
其中, 表示求解出来的一组参数, m是样本的个数, x是样本 上真实的标签, 是样本 上,基于 参数 计算出来的逻辑回归的返回值, 是样本 各个特征的取值。我们的目标,就是求解出使 最小的 取 值。 在损失函数中, , 都是已知量, 是未知量。 接下来,我只用找 最小值时的参数 。
五、梯度下降求解参数过程
- 梯度:在多元函数上对各个自变量求偏导数,再把这个偏导数用向量的方式写出来,就是梯度。
- 逻辑回归的数学目的是求解能够让模型最优化,拟合程度最好的参数$ \theta $ 的值,即求解能够让损失函数$ J(\theta) $ 最小化的 值
六、SKlearn中的逻辑回归
详细步骤:
首先进行数据清洗
处理类别型特征变量
对于类别型特征变量的处理
名义变量:没有大小关系,并列的 , 要将它单独的拆出来,由列拆成单独的一列 —— 采用独热编码,将一个特征变成三个特征
from sklearn.preprocessing import OneHotEncoder # 实例化 one = OneHotEncoder() trans = one.fit_transform(df[['race', 'sex']]) # 查看每一列代表的是什么 one.get_feature_names() # 将装换后的数据转变成dataframe类型 df2 = pd.DataFrame(trans.toarray()) df2.rename({0: 'Amer-Indian-Eskimo', 1: 'Asian-Pac-Islander', 2: 'Black',3: 'Other', 4: 'White', 5: 'Female', 6: 'Male'}, axis=1, inplace=True) # 拼接回原表 df = pd.merge(left=df, right=df2, left_index=True, right_index=True)
有序变量:小学, 初中,高中,大学:直接从小到大给0, 1, 2, 3
from sklearn.preprocessing import OrdinalEncoder Or = OrdinalEncoder() or_ = df[['workclass', 'education', 'marital_status', 'occupation', 'relationship', 'native_country']] trans_ = Or.fit_transform(or_) # 查看每一个代表什么 Or.categories_ df1 = pd.DataFrame(trans_) df1.rename({0: 'workclass', 1: 'education', 2: 'marital_status',3: 'occupation', 4: 'relationship', 5: 'native_country'}, axis=1, inplace=True) df = pd.merge(left=df, right=df1, left_index=True, right_index=True)
有距变量: 分箱之后的变量,比如说身高0—1.65的- 低,1.65-1.8 - 中等,1.8以上,利用分箱给0, 1, 2或者里面的数值都可以
对数据进行量纲标准化
from sklearn.preprocessing import StandardScaler X = StandardScaler().fit_transform(df)
进行训练集的划分
from sklearn.model_selection import train_test_split xtrain, xtest, ytrain, ytest = train_test_split(X, Y, test_size = 0.3, random_state = 40)
导入逻辑回归的模块,进行预测
from sklearn.linear_model import LogisticRegression LR = LogisticRegression(penalty='l2', tol=0.01, max_iter=20,C = 1.0) # 参数 :penalty:{l2},正则化项,默认是l2正则,会压缩一些特征,防止过拟合 # tol = 0.0001,梯度下降的参数 # C = 1.0 :正则化项的系数,表示正则化项很强,加满 # fit_intercept = True: 要不要截距项 LR.fit(xtrain, ytrain) LR.predict(xtest)
查看精确度,查准率和查全率
# 查看精确率 LR.score(xtest, ytest) # 查看查准率和查全率 from sklearn.metrics import classification_report print(classification_report(ytest, LR.predict(xtest)))precision recall f1-score support0 1.00 1.00 1.00 61601 1.00 1.00 1.00 1957accuracy 1.00 8117macro avg 1.00 1.00 1.00 8117 weighted avg 1.00 1.00 1.00 8117 # 查看混淆矩阵 from sklearn.metrics import confusion_matrix print(confusion_matrix(ytest, LR.predict(xtest))) [[ 51 5][ 6 109]] # 查看标签是1的查全率 from sklearn.metrics import recall_score recall_score(ytest, LR.predict(xtest)) # 查看标签是0的查全率 recall_score(ytest, LR.predict(xtest), pos_label=0) # 将正则变成l1正则 LR_l1 = LogisticRegression(penalty='l1', tol=0.0001,solver='liblinear', # 对应梯度下降的一种方法max_iter=100,C = 1.0).fit(xtrain, ytrain)
重要参数:
正则化项:penalty=‘I2’ 或者 penalty=‘I1’
- L1:会将参数压缩为0 L2:只会让参数尽量小,不会为0
C正则化强度的倒数:C=1.0
- 必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的 比值是1:1
- C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越 来越小
梯度下降的最大迭代次数(代替步长):max_iter=100
# 检查步长 train_score = [] test_scroe = [] test_recall = [] for i in range(100):LR_ = LogisticRegression(penalty='l1', tol=0.01,solver='liblinear', # 对应梯度下降的一种方法max_iter=i,C = 1.0).fit(xtrain, ytrain)ts = LR_.score(xtrain, ytrain)# 求平均的准确率tts = LR_.score(xtest, ytest)tr = recall_score(ytest, LR_.predict(xtest), pos_label=0)train_score.append(ts)test_scroe.append(tts)test_recall.append(tr)plt.plot(range(100), train_score, c='r') plt.plot(range(100), test_scroe, c='g') plt.plot(range(100), test_recall, c='b')
七、模型评估
混淆矩阵
真实\预测 | 1 | 0 |
---|---|---|
1 | TP | FN |
0 | FP | TN |
查准率
- 关注的问题是筛选的样本中是正样本的比例=查正确的样本/预测结果是这个类型的 总样本数。
precision=TPTP+FPprecision = \frac{TP}{TP + FP} precision=TP+FPTP
查全率
- 关注的问题是筛选的样本中有多少比例的正样本被筛选出来=查正确的样本/真正 是这个类型的总样本数。
recall=TPTP+FNrecall = \frac{TP}{TP + FN} recall=TP+FNTP
错误率与精度
- 错误率:分错的样本战样本总数的比例
- 精度: 1- E
八、逻辑回归的优点
- 逻辑回f归对线性关系的拟合效果非常好
- 逻辑回归计算快
- 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
- 逻辑回归还有抗噪能力强
关注的问题是筛选的样本中有多少比例的正样本被筛选出来=查正确的样本/真正 是这个类型的总样本数。
recall=TPTP+FNrecall = \frac{TP}{TP + FN} recall=TP+FNTP
错误率与精度
- 错误率:分错的样本战样本总数的比例
- 精度: 1- E
八、逻辑回归的优点
- 逻辑回f归对线性关系的拟合效果非常好
- 逻辑回归计算快
- 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
- 逻辑回归还有抗噪能力强
机器学习之逻辑回归(对数几率回归)相关推荐
- 逻辑斯蒂回归(对数几率回归)
首先,对数几率回归和线性回归的一点直观上的理解: 线性回归目的是找到一条直线(或者超平面)尽可能地接近所有的训练数据点,而对数几率回归(二元)的目的是找到一条直线(或者超平面)尽可能地分开两种不同类别 ...
- 机器学习-对数几率回归(逻辑回归)算法
文章目录 简介 激活函数 损失函数 优化算法 代码 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 简介 对数几率回归(Logistic Regre ...
- 机器学习入门学习笔记:(2.3)对数几率回归推导
理论推导 在以前的博客(机器学习入门学习笔记:(2.1)线性回归理论推导 )中推导了单元线性回归和多元线性回归的模型. 将线性回归模型简写为:y=ωTx+by = \omega^Tx+b: ...
- 小白学机器学习西瓜书-第三章对数几率回归
小白学机器学习西瓜书-第三章对数几率回归 3.3 对数几率回归 3.3.1 对数几率函数 3.3.1 估计参数 上一部分我们介绍了线性回归,包括简单的二元回归和多元回归,这两个主要解决的是拟合预测的问 ...
- 机器学习(二)线性模型——线性回归、对数几率回归、线性判别分析
一.线性回归 线性回归(linear regression:试图学得一个线性模型以尽可能准确地预测实值输出标记. 1.最简单的形式:输入属性的数且只有一个, 最小二乘法:基于均方差误差最小化来进行模型 ...
- 个人总结:从 线性回归 到 逻辑回归 为什么逻辑回归又叫对数几率回归?
逻辑回归不是回归算法,是分类算法,可以处理二元分类以及多元分类. 线性回归 线性回归的模型是求出特征向量Y和输入样本矩阵X之间的线性关系系数θ,满足Y = Xθ.此时Y是连续的,所以是回归模型. 对应 ...
- 机器学习 | 对数几率回归
机器学习 | 对数几率回归 名词解释 对数几率回归 名词解释 回归:预测连续的值,例如预测气温 分类:预测离散的值,例如垃圾分类 线性回归:通过一个线性组合预测连续的值,是回归模型 对数几率回归:用S ...
- 机器学习-对数几率回归
目录 前言 一.对数几率回归的机器学习三要素 二.对数几率回归 2.1 算法原理 2.1.1 广义线性模型 2.1.2 对数几率回归 2.2 利用极大似然估计推导损失函数 2.2.1 确定概率密度(质 ...
- 对数几率回归-机器学习
数据集百度网盘,就是西瓜书3.0a的数据. 首先,加载数据,load_data(file)函数. def load_data(file):s =[]with open(file) as f:for l ...
最新文章
- (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)...
- 深度学习笔记:Tensorflow手写mnist数字识别
- php的old函数,laravel单元测试之phpUnit中old()函数报错解决
- php中ajax方法的理解,基本的PHP和AJAX
- 服务发现和注册和Eureka
- 当你使用微信和QQ时,请不要忘记ICQ这个伟大的公司!
- 【动态规划】计蒜客:蒜头君闯关(最长递增子序列的变体)
- 模块调用时对参数值的更改
- [Ubuntu Error]鼠标指针闪烁的解决方法
- Python中and(逻辑与)计算法则
- Spring使用XML的方式实现AOP的开发——Spring AOP(六)
- maya! board_教你玩转MAYA的四十二精华造诣(第二期)
- 夜深人静写算法(十二)- 凸包
- VC 轻松实现非客户区按钮
- 有关javabean的说法不正确的是_关于JavaBean,下列的叙述哪一项是不正确的?( )...
- java对数组进行排序
- TCP 的演化史-sack 与 reordering metric
- php递归函数return问题
- hiredis的代码示例
- 【数据挖掘】葡萄酒质量分析及异常值检测
热门文章
- 如何在离开计算机后加密锁定,如何对企业电脑硬盘文件进行加密?
- Docker的镜像制作与整套项目一键打包部署
- AU软件导出mp3为pcm文件
- html银白色,纯CSS打造银色MacBookAir(二)_html/css_WEB-ITnose
- Robust Consistent Video Depth Estimation_具有鲁棒一致性的视频深度估计
- 门控时钟电路(Intergrated clock gating)
- for循环的学习心得
- 【excel技巧读书笔记005】快速隔行填充
- Mybatis的特性详解——动态SQL
- 微信小程序中实现获奖名单滚动播放