一、逻辑回归
1、逻辑回归
逻辑回归属于有监督学习算法,尽管称为回归,但它是一种线性分类器。
2、逻辑回归核心思想——Decision Boundaries Are All You Need
逻辑回归的核心思想即用判别函数(discriminant functions)直接拟合决策边界,因为拟合分类边界通常都比拟合分类密度简单。
通过几何解释(略),判别函数可以表示数据属于某个分类的置信度。
二、逻辑回归要素
1、数据
数据即一系列自变量以及对应的因变量(分类标签)。
2、模型
- 感知器模型(Perceptron)
其中,x为一系列属性,w为属性对应的权重,g(x)称为logits。感知器模型通过g(x)>0?进行二分类,即通过判断数据属于超平面的哪一侧来进行分类。
但是,0-1决策难以优化!
- 逻辑回归模型(Logistic Regression)
其中,y表示的后验概率,是逻辑回归模型的判别函数。逻辑回归模型通过sigmoid函数将logits平滑化,便于优化。
- Softmax回归模型(Softmax Regression)
其中,k为分类总数,表示
的后验概率,是Softamx回归模型判别函数。Softmax回归通过softmax函数将logits平滑化且归一化,可以用于解决多分类问题。
3、损失函数
其中,K为训练数据数,r是标签,为独热向量, y是模型预测值,Loss(y,r)是交叉熵(cross-entropy)损失函数。当K=2时,该损失函数即为逻辑回归的损失函数。
4、优化算法
优化算法采用梯度下降(Gradient-Descend Learning)学习
三、逻辑回归实践(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 | H | L | M |
true value | |||
H | 45 | 0 | 9 |
L | 0 | 35 | 7 |
M | 12 | 6 | 45 |