赞
踩
本文研究的问题为二分类问题,一般研究的问题有两类:一是判断问题好与坏的情况;二是将某种物质进行分类。例如医学上,可通过某些体检指标来判断是否确证某种病症。若采用之前的回归模型来描述,将0.5作为阈值——函数值小于0.5则表示未得病;大于0.5则表示得病的话,可能会造成较大的误差。所以通常采用logit函数将函数值压缩到0-1之间,其表达式如下所示:
y
=
1
1
+
e
−
z
y = \frac{1}{1 + e^{-z} }
y=1+e−z1
令:
z
=
β
0
+
β
1
x
1
+
⋯
+
β
p
x
p
z = \beta_{0}+\beta _{1}x_{1} + \cdots + \beta_{p}x_{p}
z=β0+β1x1+⋯+βpxp
则可以得到:
p
=
h
β
(
x
)
=
1
1
+
e
−
(
β
0
+
β
1
x
1
+
⋯
+
β
p
x
p
)
p = h_{\beta} (x)= \frac{1}{1 + e^{-(\beta_{0}+\beta _{1}x_{1} + \cdots + \beta_{p}x_{p})}}
p=hβ(x)=1+e−(β0+β1x1+⋯+βpxp)1
此处的p表示正向的概率,
h
β
(
x
)
h_{\beta}(x)
hβ(x)可称为logistic模型,即为本期文章的重点。继续看下面的公式:
p
1
−
p
=
e
β
0
+
β
1
x
1
+
⋯
+
β
p
x
p
\frac{p}{1-p} = e^{ \beta_{0}+\beta _{1}x_{1} + \cdots + \beta_{p}x_{p}}
1−pp=eβ0+β1x1+⋯+βpxp
此时若我们将两边取对数,则可得:
l
o
g
(
p
1
−
p
)
=
β
0
+
β
1
x
1
+
⋯
+
β
p
x
p
log(\frac{p}{1 - p}) = \beta_{0}+\beta _{1}x_{1} + \cdots + \beta_{p}x_{p}
log(1−pp)=β0+β1x1+⋯+βpxp
此时又回到了线性回归的模型形式,这很神奇捏。
p
1
−
p
\frac{p}{1 - p}
1−pp 称为发生比,表示发生正向事件的概率占发生反向事件的概率的百分比。logistic模型中的参数
β
\beta
β正是通过这个方程求解出来的,但是如使用一般的OLS算法无法求解,一般采用极大似然估计法以及梯度下降算法迭代进行求解。这个过程我们不做推导,可自行查阅相关文献。
接下来让我们来看看python是如何实现logistic模型的建立:
数据集:根据6个跟运动状态有关的自变量,三个与方向有关,三个与加速度有关,根据该数据集构建logistic模型用于判断该用户是跑步还是步行。
使用模块:sklearn的子模块:linear_model中的LogisticRegression类。
代码:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model from sklearn import model_selection sports = pd.read_csv(r'Run or Walk.csv') predictors = sports.columns[4:] X = sports[:][predictors] 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().fit(X_train, y_train) # 返回模型的各个参数 print('logistic模型的β系数:\n',sklearn_logistic.intercept_, sklearn_logistic.coef_)
解析: 读取文件、分割选取自变量和因变量、分割训练集测试集的基本操作不做叙述,重点来看logistic模型的求解:
通过调用LogisticRegression()类中的函数fit()对训练集的因变量和自变量进行训练,得出模型的表达式的参数
β
\beta
β结果如下所示:
logistic模型的β系数:#常系数以及变量前的系数:
[4.36637441] [[ 0.48695898 6.87517973 -2.44872468 -0.01385936 -0.16085022 0.13389695]]
最终可建立模型:
h
β
(
x
)
=
1
1
+
e
−
(
4.37
+
0.49
x
1
+
6.86
x
2
−
2.45
x
3
−
0.01
x
4
−
0.16
x
5
+
0.13
x
6
)
h_{\beta}(x) = \frac{1}{1 + e^{-(4.37 + 0.49x_{1} + 6.86x_{2} - 2.45x_{3} - 0.01x_{4} - 0.16x_{5} + 0.13x_{6})}}
hβ(x)=1+e−(4.37+0.49x1+6.86x2−2.45x3−0.01x4−0.16x5+0.13x6)1
模型系数的意义:
以
x
1
x_{1}
x1为例,其系数为0.49,表示在其他因素均不变的情况下,
x
1
x_{1}
x1的数值每增加一个单位,会使得跑步发生比变化0.49倍。
模型的预测:
sklearn_predict = sklearn_logistic.predict(X_test)
res = pd.Series(sklearn_predict).value_counts()
print('预测结果:\n', res)
输出结果:
预测结果:
0 12119
1 10028
dtype: int64
使用predict()函数进行预测,得到的结果分别显示被判断为了跑步或走路的样本的个数。
定义:
混淆矩阵是2×2的矩阵,其基本形式如下所示。
实际为0 | 实际为1 | |
---|---|---|
预测为0 | A, 预测正确为0 | B, 错将1预测为0 |
预测为1 | C, 错将0预测为1 | D, 预测正确为1 |
A可用TN表示,B可用FN表示;C可用FP表示,D可用TP表示。定义了这些数值,我们可以定义如下几个指标:
A
c
c
u
r
a
c
y
=
A
+
D
A
+
B
+
C
+
D
,
衡
量
模
型
对
整
体
数
据
的
预
测
效
果
Accuracy =\frac{A + D}{A + B + C + D},衡量模型对整体数据的预测效果
Accuracy=A+B+C+DA+D,衡量模型对整体数据的预测效果
S
e
n
s
i
t
i
v
i
t
y
=
D
B
+
D
,
正
例
覆
盖
率
Sensitivity = \frac{D}{B + D},正例覆盖率
Sensitivity=B+DD,正例覆盖率
S
p
e
c
i
f
i
c
i
t
y
=
A
A
+
C
,
反
例
覆
盖
率
Specificity = \frac{A}{A + C},反例覆盖率
Specificity=A+CA,反例覆盖率
P
r
e
c
i
s
i
o
n
=
D
C
+
D
,
正
例
命
中
率
Precision = \frac{D}{C + D}, 正例命中率
Precision=C+DD,正例命中率
代码:
# 混淆矩阵
cm = metrics.confusion_matrix(y_test, sklearn_predict, labels = [0, 1])
print('混淆矩阵:\n', cm)
# 混淆矩阵热力图
import seaborn as sns
sns.heatmap(cm, annot=True, fmt = '.2e', cmap = 'GnBu')
输出结果:混淆矩阵的热力图如下所示。该热力图颜色越深的地方其数值越大,且图中对角线上的颜色最深,表明预测正确的占比较大。
ROC曲线则是通过可视化结果来判断模型的好坏。它的指标有两个:一是x轴的1 - Specificity;二是y轴的Sensitivity。利用python我们可以轻松地绘制出ROC曲线以及其面积AUC数值如下所示:
代码:
# ROC曲线和AUC数值 # y得分为模型预测正例的概率 plt.figure() y_score = sklearn_logistic.predict_proba(X_test)[:, 1] fpr, tpr, threshold = metrics.roc_curve(y_test, y_score) # 计算AUC的值 roc_auc = metrics.auc(fpr, tpr) import matplotlib.pyplot as plt #绘制面积图 plt.stackplot(fpr, tpr, colors='steelblue', alpha = 0.5, edgecolor = 'black') # 添加ROC曲线的轮廓 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) plt.xlabel('1-Specificity') plt.ylabel('Specificity') plt.show()
输出结果:该ROC曲线下的面积即为AUC的数值,为0.93。其值越接近1表明该模型的拟合效果越好。
后记
分类模型除logistic模型外,fisher判别分析、SVM支持向量机、决策树等大量的机器学习算法都可解决分类问题。在真实的项目中或数学建模竞赛时,通常是利用python自动化编程的优势,将所有可能用到的模型进行训练、测试,并使用模型评估的方法对该算法下的结果进行评估,最终选择最为优秀的模型进行应用,这也是机器学习算法选择的基本思路。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。