Logistic回归模型

函数

LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, 
class_weight=None, random_state=None, solver= 'liblinear',max_iter=100, 
multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)

penalty:为Logistic回归模型的目标函数添加正则化惩罚项,与线性回归模型类似,默认为l2正则

dual:bool类型参数,是否求解对偶形式,默认为False,只有当penalty参数为'l2'、solver参数为'liblinear'时,才可使用对偶形式

tol:用于指定模型跌倒收敛的阈值

C:用于指定惩罚项系数Lambda的倒数,值越小,正则化项越大

fit_intercept:bool类型参数,是否拟合模型的截距项,默认为True

intercept_scaling:当solver参数为'liblinear'时该参数有效,主要是为了降低X矩阵中人为设定的常数列1的影响

class_weight:用于指定因变量类别的权重,如果为字典,则通过字典的形式{class_label:weight}传递每个类别的权重;如果为字符串'balanced',则每个分类的权重与实际样本中的比例成反比,当各分类存在严重不平衡时,设置为
'balanced'会比较好;如果为None,则表示每个分类的权重相等

random_state:用于指定随机数生成器的种子

solver:用于指定求解目标函数最优化的算法,默认为'liblinear',还有其他选项,如牛顿法'newton-cg'、L-BFGS拟牛顿法'lbfgs'

max_iter:指定模型求解过程中的最大迭代次数, 默认为100

multi_class:如果因变量不止两个分类,可以通过该参数指定多分类问题的解决办法,默认采用'ovr',即one-vs-rest方法,还可以指定'multinomial',表示直接使用多分类逻辑回归模型(Softmax分类)

verbose:bool类型参数,是否输出模型迭代过程的信息,默认为0,表示不输出

warm_start:bool类型参数,是否基于上一次的训练结果继续训练模型,默认为False,表示每次迭代都是从头开始

n_jobs:指定模型运算时使用的CPU数量,默认为1,如果为-1,表示使用所有可用的CPU

当fit_intercept设置为True时,相当于在X数据集上人为地添加了常数列1,
用于计算模型的截距项;LogisticRegression类不仅仅可以针对二元问题做分类,还可以解决多元问题,通过设置参数multi_class为’multinomial’,实现Softmax分类,并利用随机梯度下降法求解参数。

应用

核心部分

# 导入第三方模块
import pandas as pd
import numpy as np
from sklearn import linear_model
# 读取数据
sports = pd.read_csv(r'C:\Users\Administrator\Desktop\Run or Walk.csv')
# 利用训练集建模
sklearn_logistic = linear_model.LogisticRegression()
sklearn_logistic.fit(X_train, y_train)
# 返回模型的各个参数
print(sklearn_logistic.intercept_, sklearn_logistic.coef_)
out:
[ 4.35613952] [[ 0.48533325 6.86221041 -2.44611637 -0.01344578 -0.1607943 0.13360777]]

# 导入第三方模块
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn import linear_model

# 读取数据
sports = pd.read_csv(r'Run or Walk.csv')
# 提取出所有自变量名称
predictors = sports.columns[4:]
# 构建自变量矩阵
X = sports.ix[:,predictors]
# 提取y变量值
y = sports.activity
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size = 0.25, random_state = 1234)

# 利用训练集建模
sklearn_logistic = linear_model.LogisticRegression()
sklearn_logistic.fit(X_train, y_train)
# 返回模型的各个参数
print(sklearn_logistic.intercept_, sklearn_logistic.coef_)

模型预测

# 模型预测
sklearn_predict = sklearn_logistic.predict(X_test)
# 预测结果统计
pd.Series(sklearn_predict).value_counts()
out:
0 12121
1 10026

得到测试上因变量的预测统计,其中判断步行状态的样本有12 121个,跑
步状态的样本有10 026个。单看这两个数据,无法确定模型预测的是否准确,所以需要对模型预测效果做定量的评估。

混淆矩阵

# 导入第三方模块
from sklearn import metrics
# 混淆矩阵
cm = metrics.confusion_matrix(y_test, sklearn_predict, labels = [0,1])
cm
out:
array([[9971, 1120],
[2150, 8906]], dtype=int64)
Accuracy = metrics.scorer.accuracy_score(y_test, sklearn_predict)
Sensitivity = metrics.scorer.recall_score(y_test, sklearn_predict)
Specificity = metrics.scorer.recall_score(y_test, sklearn_predict, pos_label=0)
print('模型准确率为%.2f%%:' %(Accuracy*100))
print('正例覆盖率为%.2f%%' %(Sensitivity*100))
print('负例覆盖率为%.2f%%' %(Specificity*100))
out:
模型准确率为85.24%:
正例覆盖率为80.55%
负例覆盖率为89.90%

以对混淆矩阵做可视化展现,这就要用到seaborn模块中的heatmap函数了,即绘制热力图:

# 导入第三方模块
import seaborn as sns
import matplotlib.pyplot as plt
# 绘制热力图
sns.heatmap(cm, annot = True, fmt = '.2e',cmap = 'GnBu')
# 图形显示
plt.show()

颜色越深的区块代表样本量越多。图中非常醒目地展示了主对角线上的区块颜色要比其他地方深很多,说明正确预测正例和负例的样本数目都很大

ROC

# y得分为模型预测正例的概率
y_score = sklearn_logistic.predict_proba(X_test)[:,1]
# 计算不同阈值下,fpr和tpr的组合值,其中fpr表示1-Specificity,tpr表示Sensitivity
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()

绘制的是模型在预测集上的ROC曲线,曲线下的面积高达0.93,远远超过常
用的评估标准0.8。所以,可以认定拟合的Logistic回归模型是非常合理的,能够较好地刻画数据特征。需要说明的是,在利用子模块metrics中的roc_curve函数计算不同阈值下Sensitivity和1-Specificity时,函数的第二个参数y_score代表正例的预测概率,而非实际的预测值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值