机器学习算法之逻辑回归(对数几率回归)- 做分类的
一、概述:
逻辑(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 support 0 1.00 1.00 1.00 6160 1 1.00 1.00 1.00 1957 accuracy 1.00 8117 macro 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+FP precision = \frac{TP}{TP + FP} precision=TP+FPTP
查全率
- 关注的问题是筛选的样本中有多少比例的正样本被筛选出来=查正确的样本/真正 是这个类型的总样本数。
recall=TPTP+FN recall = \frac{TP}{TP + FN} recall=TP+FNTP
错误率与精度
- 错误率:分错的样本战样本总数的比例
- 精度: 1- E
八、逻辑回归的优点
- 逻辑回f归对线性关系的拟合效果非常好
- 逻辑回归计算快
- 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
- 逻辑回归还有抗噪能力强
关注的问题是筛选的样本中有多少比例的正样本被筛选出来=查正确的样本/真正 是这个类型的总样本数。
recall=TPTP+FN recall = \frac{TP}{TP + FN} recall=TP+FNTP
错误率与精度
- 错误率:分错的样本战样本总数的比例
- 精度: 1- E
八、逻辑回归的优点
- 逻辑回f归对线性关系的拟合效果非常好
- 逻辑回归计算快
- 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
- 逻辑回归还有抗噪能力强

本文介绍了逻辑回归的概念,包括几率、逻辑和回归的含义。逻辑回归常用于二分类问题,通过Sigmoid函数将连续值转化为概率。文章详细讨论了损失函数、梯度下降求解参数的过程,并在SKlearn库中展示了实现步骤,包括数据预处理和模型评估,强调了逻辑回归在处理线性关系和分类概率方面的优势。
&spm=1001.2101.3001.5002&articleId=115123688&d=1&t=3&u=f166bcce90844ab680ed617ebe1c62a3)
1277
&spm=1001.2101.3001.11663&articleId=115123688&d=1&t=3&u=5c20e3a6f3134f79a2ed51ceacd6fe62)

被折叠的 条评论
为什么被折叠?



