机器学习——逻辑回归(Logistic Regression)

一、逻辑回归

1、逻辑回归

逻辑回归属于有监督学习算法,尽管称为回归,但它是一种线性分类器

2、逻辑回归核心思想——Decision Boundaries Are All You Need

 逻辑回归的核心思想即用判别函数(discriminant functions)直接拟合决策边界,因为拟合分类边界通常都比拟合分类密度简单。

通过几何解释(略),判别函数可以表示数据属于某个分类的置信度。

二、逻辑回归要素

1、数据

数据即一系列自变量以及对应的因变量(分类标签)。

2、模型

  • 感知器模型(Perceptron)

 x=\begin{bmatrix} x_{0}\\ x_{1}\\ ......\\ x_{n} \end{bmatrix}

w=\begin{bmatrix} w_{0}\\ w_{1}\\ ......\\ w_{n} \end{bmatrix} 

g(x)=w^{T}x+w_{0}

 C=\begin{cases} C_{1} & \text{ if } g(x)>0 \\ C_{2} & \text{ otherwise } \end{cases}

 其中,x为一系列属性,w为属性对应的权重,g(x)称为logits。感知器模型通过g(x)>0?进行二分类,即通过判断数据属于超平面的哪一侧来进行分类。

但是,0-1决策难以优化!

  •  逻辑回归模型(Logistic Regression)

 y=sigmoid(w^{T}x+w_{0})=\frac{1}{1+exp(-(w^{T}x+w_{0}))}

其中,y表示P(C_{i}|x)的后验概率,是逻辑回归模型的判别函数。逻辑回归模型通过sigmoid函数将logits平滑化,便于优化。

  • Softmax回归模型(Softmax Regression)

y_{i}=softmax(w_{i}^{T}x+w_{i0})=\frac{exp(w_{i}^{T}x+w_{i0})}{\sum_{j=1}^{k}exp(w_{j}^{T}x+w_{j0})} 

 其中,k为分类总数,y_{i}表示P(C_{i}|x)的后验概率,是Softamx回归模型判别函数。Softmax回归通过softmax函数将logits平滑化且归一化,可以用于解决多分类问题

 3、损失函数

r=\begin{bmatrix} r_{1}\\ r_{2}\\ ......\\ r_{K} \end{bmatrix}

 y=\begin{bmatrix} y_{1}\\ y_{2}\\ ......\\ y_{K} \end{bmatrix}

Loss(y,r)=-\sum_{i=1}^{K}r_{i}logy_{i}=-r^{T}(logy) 

其中,K为训练数据数,r是标签,为独热向量, y是模型预测值,Loss(y,r)是交叉熵(cross-entropy)损失函数。当K=2时,该损失函数即为逻辑回归的损失函数。

4、优化算法

优化算法采用梯度下降(Gradient-Descend Learning)学习

\frac{\vartheta L}{\vartheta w_{j}}=-\sum_{l}(r^{(l)}-x^{(l)})x_{j}^{(l)} 

三、逻辑回归实践(sklearn)

以kaggle数据集"Students' Academic Performance Dataset"为例

1、数据准备

直接下载并使用"Students' Academic Performance Dataset" 数据集,读取数据

import pandas as pd

dataset = pd.read_csv('./Edu_Data.csv')  # 从Edu_Data.csv文件中读取数据集

删除包含缺失值的数据,消除缺失值影响

dataset.dropna(axis=0, how='any', inplace=True)  # 删除数据集中任何含有缺失值的行

 数据预处理。对有数值关系的字符型属性进行序数编码,对无数值关系的字符型属性进行独热编码

import category_encoders as ce

encoder_Ordinal = ce.OrdinalEncoder(
    cols=['StageID', 'GradeID', 'SectionID', 'Semester', 'ParentschoolSatisfaction', 'StudentAbsenceDays']).fit(
    dataset)  # 进行序数编码
encoder_Onehot = ce.OneHotEncoder(
    cols=['gender', 'NationalITy', 'PlaceofBirth', 'Topic', 'Relation', 'ParentAnsweringSurvey'],
    use_cat_names=True).fit(dataset)  # 进行独热编码
dataset_encoded = encoder_Onehot.transform(encoder_Ordinal.transform(dataset))  # 对数据集进行两次编码

2、训练模型

 Hold-out,划分训练集和测试集

from sklearn.model_selection import train_test_split

X = dataset_encoded.drop(['Class'], axis=1)  # 从编码后的数据集中删除Class列,作为特征矩阵X
y = dataset_encoded['Class']  # 从编码后的数据集中提取Class列,作为目标向量y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,
                                                    random_state=9)  # 将X和y按照33%的比例划分为训练集和测试集,设置随机数种子为9

 训练一个Softmax回归模型(多分类逻辑回归模型),正则化惩罚项设置为L2范数,多分类方式设置为多项式,即使用交叉熵

from sklearn.linear_model import LogisticRegression

LR = LogisticRegression(penalty='l2', max_iter=2500,
                        multi_class='multinomial')  # 创建一个LogisticRegression对象,设置惩罚项为l2范数,最大迭代次数为2500,多分类方式为多项式
LR.fit(X_train, y_train)  # 用训练集拟合逻辑回归模型

3、评估模型

 分别输出模型在训练集和测试集下的准确率

print("Score of train-set : {:.4f}".format(LR.score(X_train, y_train)))  # 打印训练集上的准确率
print("Score of test-set : {:.4f}".format(LR.score(X_test, y_test)))  # 打印测试集上的准确率

结果如下:

Score of train-set : 0.8255
Score of test-set : 0.7862

  使用混淆矩阵(confusion-matrix)评估模型。

y_predict = LR.predict(X_test)  # 用测试集预测类别
print(pd.crosstab(y_test, y_predict, rownames=['true value'], colnames=['predict value']))  # 与真实类别进行交叉表分析

结果如下:

predict value

HLM
true value 
H4509
L0357
M12645
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习啊ZzZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值