逻辑回归
逻辑回归(Logistic Regression)是一种广泛使用的统计方法,用于解决分类问题,尤其是二分类问题。尽管名字中有"回归"二字,但它实际上是一种分类算法,因为它试图通过线性回归的方式去预测一个事件的发生概率(即属于某个类别的概率),然后根据设定的阈值(通常是0.5)来分类。
注意哦!逻辑回归其实是分类算法!!!
逻辑回归模型
逻辑回归模型使用逻辑函数(通常是sigmoid函数)将线性回归的预测值转换为概率值。sigmoid函数的公式如下:
其中,z 是线性回归模型的预测值,即 z =β 0+β 1x 1+β 2x 2+⋯+βnxn ,其中 β 0 是截距,β 1,β 2,...,βn 是回归系数,x 1,x 2,...,xn 是特征值。
逻辑回归模型的训练过程主要是找到最佳的回归系数(即 β 值),使得模型的预测概率与实际标签之间的差异最小。这通常通过最大化似然函数(在逻辑回归中,常用的是对数似然函数)来实现,也就是最小化负对数似然损失(Negative Log Likelihood Loss, NLL Loss)。
总的来说:就是通过概率来分类。
实现模型
对于实现一个算法模型,我们一般从以下几个方面来完成:
- 训练模型
- 测试模型
训练模型
- 收集数据
python
- 数据预处理
python
import pandas as pd
data = pd.read_csv('creditcard.csv') #读取数据
data = data.drop('Time',axis=1) #去除无关变量
from sklearn.preprocessing import StandardScaler #导入归一化方法
scaler = StandardScaler()
#对需要归一化处理的数据归一化,避免权重影响
data['Amount'] = scaler.fit_transform(data[['Amount']])
- 绘制图像,查看正负样本个数
python
import matplotlib.pyplot as plt
from pylab import mpl
#字体调整
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False
#对样本中每个类别的数量计数,将其可视化,观察数据
lei_count = pd.value_counts(data['Class'])
plt.title('样本数')
plt.xlabel('类别')
plt.ylabel('数量')
lei_count.plot(kind = 'bar')
plt.show()
- 随机分割数据集与测试集
使用train_test_split方法,在数据中随机抽取数据作为训练集与测试集
python
x = data.drop(["Class"],axis=1)
y = data.Class
from sklearn.model_selection import train_test_split
train_x,test_x,train_y,test_y = \
train_test_split(x,y,test_size=0.3,random_state=0) #test_size表示抽取的的测试集所占的百分比
- 交叉验证,选择较优的惩罚因子
在逻辑回归的算法中,逻辑模型的参数中,有一参数为正则化强度C,越小的数值表示越强的正则化。我们要进行调参数,看看哪个惩罚因子最为合适,使模型拟合效果更好:
python
#交叉验证选择较优的惩罚因子
scores = []
c_param_range = [0.01,0.1,1,10,100] #参数:一般常用的惩罚因子
for i in c_param_range:
lr = LogisticRegression(C = i,penalty='l2',solver='lbfgs',max_iter=1000)
# C表示正则化强度,越小的数值表示越强的正则化。防止过拟合
score = cross_val_score(lr,x_train,y_train,cv = 8,scoring='recall')
#交叉验证,将模型和数据集传入,对其进行划分,每份轮流作为测试集来测试模型。返回一个列表对象
score_mean = sum(score)/len(score)
scores.append(score_mean)
beat_c = c_param_range[np.argmax(scores)] #argmax取出最大值的索引位置
- 训练模型
python
lr = LogisticRegression(C = beat_c,penalty='l2',max_iter=1000)
lr.fit(x_train,y_train) #训练模型
测试模型
- 先用训练数据再次进入模型测试,查看他本身的模型训练效果怎么样:
python
from sklearn import metrics
train_predicted = lr.predict(x_train)
print(metrics.classification_report(y_train,train_predicted)) #绘制混淆矩阵,查看测试参数
---------------------------------------------------------------
precision recall f1-score support
0 1.00 1.00 1.00 199019
1 0.88 0.62 0.73 345
accuracy 1.00 199364
macro avg 0.94 0.81 0.86 199364
weighted avg 1.00 1.00 1.00 199364
- 再用分割的测试集来测试模型:
python
test_predicted = lr.predict(x_test)
print(metrics.classification_report(y_test,test_predicted))
----------------------------------------------
precision recall f1-score support
0 1.00 1.00 1.00 85296
1 0.88 0.62 0.73 147
accuracy 1.00 85443
macro avg 0.94 0.81 0.86 85443
weighted avg 1.00 1.00 1.00 85443
到这为止我们的模型就训练好啦,但是!!通过混淆矩阵我们可以发现,模型对类别为1的召回率只有0.62,这是比较差的,是什么原因导致的呢?
其实,在训练模型时第三步查看样本个数时,我们通过图片可以发现样本数量极度不均衡,致使训练时,类别1的数据训练不够,拟合欠缺,那么我们该如何处理呢?
处理方法有过采样(扩充样本数量)和下采样(数量多的将数据量向数量少的类别数量靠近),可以解决这个问题!我们下篇来介绍。
总结
本篇介绍了:
- 什么是逻辑回归:逻辑回归其实是分类算法!!!
- 逻辑回归算法如何分类:计算每个数据的属于哪个类别的概率,判断属于哪个类。(默认阈值0.5为分界线)
- 训练模型:
- 使用train_test_split方法,在数据中随机抽取数据作为训练集与测试集,使测试更有说服力。
- 交叉验证,选择较优的惩罚因子