1、逻辑回归逻辑推导
import pandas as pd
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
feature = iris.feature_names
data = pd.DataFrame(X,columns=feature)
data['target'] = y
data.head()
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | target | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
# 逻辑回归
'''
penalty {‘l1’, ‘l2’, ‘elasticnet’, ‘none’}, default=’l2’正则化方式
dual bool, default=False 是否使用对偶形式,当n_samples> n_features时,默认dual = False。
C float, default=1.0
solver {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}, default=’lbfgs’
l1_ratio float, default=None
'''
from sklearn.linear_model import LogisticRegression
log_iris = LogisticRegression()
log_iris.fit(X,y)
log_iris.score(X,y)
0.96
各个特征的相关解释:
- sepal length (cm):花萼长度(厘米)
- sepal width (cm):花萼宽度(厘米)
- petal length (cm):花瓣长度(厘米)
- petal width (cm):花瓣宽度(厘米)
(2) 选择度量模型性能的指标(也称为混淆矩阵):
度量分类模型的指标和回归的指标有很大的差异,首先是因为分类问题本身的因变量是离散变量,因此像定义回归的指标那样,单单衡量预测值和因变量的相似度可能行不通。其次,在分类任务中,我们对于每个类别犯错的代价不尽相同,例如:我们将癌症患者错误预测为无癌症和无癌症患者错误预测为癌症患者,在医院和个人的代价都是不同的,前者会使得患者无法得到及时的救治而耽搁了最佳治疗时间甚至付出生命的代价,而后者只需要在后续的治疗过程中继续取证就好了,因此我们很不希望出现前者,当我们发生了前者这样的错误的时候会认为建立的模型是很差的。为了解决这些问题,我们必须将各种情况分开讨论,然后给出评价指标。
- 真阳性TP:预测值和真实值都为正例;
- 真阴性TN:预测值与真实值都为正例;
- 假阳性FP:预测值为正,实际值为负;
- 假阴性FN:预测值为负,实际值为正;
分类模型的指标:
- 准确率:分类正确的样本数占总样本的比例,即: A C C = T P + T N F P + F N + T P + T N ACC = \frac{TP+TN}{FP+FN+TP+TN} ACC=FP+FN+TP+TNTP+TN.
- 精度:预测为正且分类正确的样本占预测值为正的比例,即: P R E = T P T P + F P PRE = \frac{TP}{TP+FP} PRE=TP+FPTP.
- 召回率:预测为正且分类正确的样本占类别为正的比例,即: R E C = T P T P + F N REC = \frac{TP}{TP+FN} REC=TP+FNTP.
- F1值:综合衡量精度和召回率,即: F 1 = 2 P R E × R E C P R E + R E C F1 = 2\frac{PRE\times REC}{PRE + REC} F1=2PRE+RECPRE×REC.
- ROC曲线:以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好。
https://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics
在本次小案例中,我们使用ROC曲线作为最终评价指标。
逻辑回归一般方程式:
其中X为特征矩阵,m为特征个数,n为行数:
通过1+2整合后得出:
而累乘求最大值过程其实等价于取 对数 后累加结果求最大值而加个负号后等价于求最小值,即上面的最优化问题其实等价于求最小值:
1.2正则化项
正则化项,实际上就是模型当中的1-范数 或 2-范数,通常称为损失函数:
为什么要使用正则化项呢?
为了避免模型过拟合。
此前介绍的岭回归,就是线性回归的损失函数加上了1-范数,而Lasso回归则是加入l了w的2-范数。并且,对逻辑回归而言,加入l2范数的正则化项,损失函数就会变成严格的凸函数。
2 线性判别
-
基于概率的分类模型:
(1) 线性判别分析:
线性判别分析是一个比较久远的算法,我将会从两个方向去描述这个算法,因为我觉得每位读者都有自己喜欢的那个理解的方向,分别是基于贝叶斯公式和降维分类的思想。- 基于贝叶斯公式对线性判别分析的理解:
在讨论如何解决多分类问题之前,我们先来说说贝叶斯的那些事吧。在概率统计的领域里有一条神奇的公式叫贝叶斯定理,具体的形式是: P ( Y = k ∣ X = x ) = π k f k ( x ) ∑ l = 1 K π l f l ( x ) {P(Y=k|X=x) = \dfrac{{\pi}_kf_k(x)}{\sum\limits_{l=1}^K{\pi}_lf_l(x)}} P(Y=k∣X=x)=l=1∑Kπlfl(x)πkfk(x) ,我们 先不要被公式的符号吓到,我们先来看看符号具体代表什么意思。我们假设观测有 K {K} K类, π k {\pi_k} πk为随机选择的观测来自第 k {k} k类的 先验概率,也就是样本里面第 k {k} k类的样本个数除以总样本的个数: π k = n k n {\pi_k = \dfrac{n_k}{n}} πk=nnk。再来 f k ( x ) = P ( X = x ∣ Y = k ) {f_k(x) =P(X=x|Y=k)} fk(x)=P(X=x∣Y=k),表示第 k {k} k类观测的X的密度函数,说的直白一点就是在 Y = k {Y=k} Y=k的样本里 X = x {X=x} X=x的样本个数,即 f k ( x ) = P ( X = x ∣ Y = k ) = n ( X = x , Y = k ) n ( Y = k ) {f_k(x) = P(X=x|Y=k) = \dfrac{n_{(X=x,Y=k)}}{n_{(Y=k)}}} fk(x)=P(X=x∣Y=k)=n(Y=k)n(X=x,Y=k),最后, ∑ l = 1 K π l f l ( x ) = P ( X = x ) = n ( X = x ) n {\sum\limits_{l=1}^K{\pi}_lf_l(x)}=P(X=x)=\dfrac{n_{(X=x)}}{n} l=1∑Kπlfl(x)=P(X=x)=nn(X=x),也就是样本中 X = x {X=x} X=x的概率。
在讨论贝叶斯定理后,我们回到分类问题,这个定理跟我们的分类问题有什么关联呢?没错,这个公式 P ( Y = k ∣ X = x ) = π k f k ( x ) ∑ l = 1 K π l f l ( x ) {P(Y=k|X=x) = \dfrac{{\pi}_kf_k(x)}{\sum\limits_{l=1}^K{\pi}_lf_l(x)}} P(Y=k∣X=x)=l=1∑Kπlfl(x)πkfk(x)给出了给定样本条件下, Y = k {Y=k} Y=k这个类别下的概率,这给分类问题提供了一条思路,那就是计算这个 P ( Y = k ∣ X = x ) {P(Y=k|X=x)} P(Y=k∣X=x),而且我们的逻辑回归就是这么干的,但是在 P ( Y = k ∣ X = x ) = π k f k ( x ) ∑ l = 1 K π l f l ( x ) {P(Y=k|X=x) = \dfrac{{\pi}_kf_k(x)}{\sum\limits_{l=1}^K{\pi}_lf_l(x)}} P(Y=k∣X=x)=l=1∑Kπlfl(x)πkfk(x)这个公式中,分母 ∑ l = 1 K π l f l ( x ) = P ( X = x ) {{\sum\limits_{l=1}^K{\pi}_lf_l(x)} = P(X=x)} l=1∑Kπlfl(x)=P(X=x)当样本给定的时候是一个与分类 k {k} k无关的常数,所以我们的问题可以简化为只需要计算分子 π k f k ( x ) {{\pi}_kf_k(x)} πkfk(x),进而比较哪个类别的概率最大就知道属于哪个类别了,因此我们的分类思路就出来啦,这个思路不同于逻辑回归,逻辑回归需要计算具体的 P ( Y = k ∣ X = x ) {P(Y=k|X=x)} P(Y=k∣X=x)概率值,而我们现在的思路是通过贝叶斯定理计算贝叶斯定理的分子,比较分子最大的那个类别为最终类别。
在我们推导复杂算法之前,我们先推导下简单的当自变量个数只有一个的模型,即 p = 1 {p=1} p=1的简单模型。我们记 P ( Y = k ∣ X = x ) = π k f k ( x ) ∑ l = 1 K π l f l ( x ) {P(Y=k|X=x) = \dfrac{{\pi}_kf_k(x)}{\sum\limits_{l=1}^K{\pi}_lf_l(x)}} P(Y=k∣X=x)=l=1∑Kπlfl(x)πkfk(x) 的分子为 g k ( x ) = π k f k ( x ) {g_k(x) = {\pi}_kf_k(x)} gk(x)=πkfk(x)。在这里,我们做个模型假设:假设 f k ( x ) {f_k(x) } fk(x)服从正态分布,即 f k ( x ) ∼ N ( μ , σ k 2 ) {f_k(x) \sim N(\mu,\sigma_k^2)} fk(x)∼N(μ,σk2),而且每个 σ k 2 = σ 2 {\sigma_k^2 = \sigma^2} σk2=σ2,同方差假设。因此 f k ( x ) = 1 2 π σ k e − 1 2 σ 2 ( x − μ k ) 2 {f_k(x) = \dfrac{1}{\sqrt{2\pi}\sigma_k}e^{-\dfrac{1}{2\sigma^2}(x-\mu_k)^2}} fk(x)=2π σk1e−2σ21(x−μk)2,最终我们的 g k ( x ) = π k 1 2 π σ k e − 1 2 σ 2 ( x − μ k ) 2 {g_k(x) = \pi_k\dfrac{1}{\sqrt{2\pi}\sigma_k}e^{-\dfrac{1}{2\sigma^2}(x-\mu_k)^2}} gk(x)=πk2π σk1e−2σ21(x−μk)2,终于算出来啦。这个式子不是很好计算,我们对 g k ( x ) {g_k(x)} gk(x)取个对数,令 δ k ( x ) = l n ( g k ( x ) ) = l n π k + μ σ 2 x − μ 2 2 σ 2 {\delta_k(x) = ln(g_k(x))=ln\pi_k+\dfrac{\mu}{\sigma^2}x-\dfrac{\mu^2}{2\sigma^2}} δk(x)=ln(gk(x))=lnπk+σ2μx−2σ2μ2,到这里我们的模型建立模型,我们只需要把位置的 μ k {\mu_k} μk与 σ 2 {\sigma^2} σ2估计出来就好了。 μ ^ k = 1 n k ∑ i : y i = k x i {\hat{\mu}_k =\dfrac{1}{n_k}\sum\limits_{i:y_i=k}x_i} μ^k=nk1i:yi=k∑xi,也就是当 y = k {y=k} y=k这一类中 x {x} x的平均值; σ ^ 2 = 1 n − K ∑ k = 1 K ∑ i : y i = k ( x i − μ ^ k ) 2 {\hat{\sigma}^2 =\dfrac{1}{n-K}\sum\limits_{k=1}^K\sum\limits_{i:y_i=k}(x_i-\hat{\mu}_k)^2 } σ^2=n−K1k=1∑Ki:yi=k∑(xi−μ^k)2,说白了就是计算每一类的方差,再求平均值。总结下上面的公式就是:
{ δ k ( x ) = l n ( g k ( x ) ) = l n π k + μ σ 2 x − μ 2 2 σ 2 μ ^ k = 1 n k ∑ i : y i = k x i σ ^ 2 = 1 n − K ∑ k = 1 K ∑ i : y i = k ( x i − μ ^ k ) 2 {\begin{cases}\delta_k(x) = ln(g_k(x))=ln\pi_k+\dfrac{\mu}{\sigma^2}x-\dfrac{\mu^2}{2\sigma^2}\\{\hat{\mu}_k =\dfrac{1}{n_k}\sum\limits_{i:y_i=k}x_i}\\{\hat{\sigma}^2 =\dfrac{1}{n-K}\sum\limits_{k=1}^K\sum\limits_{i:y_i=k}(x_i-\hat{\mu}_k)^2}\end{cases}} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧δk(x)=ln(gk(x))=lnπk+σ2μx−2σ2μ2μ^k=nk1i:yi=k∑xiσ^2=n−K1k=1∑Ki:yi=k∑(xi−μ^k)2
至此,我们的模型就建立完成了,我们只需要代入数据求出 δ k ( x ) {\delta_k(x)} δk(x),哪个 k {k} k对应的 δ k ( x ) {\delta_k(x)} δk(x)大,就是哪一类。
(下图虚线是线性判别分析的决策边界,正态曲线哪边高样本就是哪一类)
我们推到出了一个自变量的简单模型,就要泛化为多个自变量的线性判别分析了,即 p > 1 {p>1} p>1。其实原理一样的,只是将一元正态分布扩展为多元正态分布:
f k ( x ) = 1 ( 2 π ) p 2 ∣ Σ ∣ 1 2 e [ − 1 2 ( x − μ k ) T Σ − 1 ( x − μ k ) ] {f_k(x)=\dfrac{1}{(2\pi)^{\tfrac{p}{2}}|\Sigma|^\tfrac{1}{2}}e^{[-\tfrac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k)]}} fk(x)=(2π)2p∣Σ∣211e[−21(x−μk)TΣ−1(x−μk)]
μ k ^ = ( μ k 1 , μ k 2 , . . . . . . , μ k p ) , Σ ^ = 1 p − 1 ∑ j = 1 p ( x j − x ‾ ) ( x j − x ‾ ) T {\hat{\mu_k}=(\mu_{k1},\mu_{k2},......,\mu_{kp}) , \hat{\Sigma}=\dfrac{1}{p-1}\sum\limits_{j=1}^p(x_j-\overline{x})(x_j-\overline{x})^T} μk^=(μk1,μk2,......,μkp),Σ^=p−11j=1∑p(xj−x)(xj−x)T
δ k ( x ) = l n ( π k f k ( x ) ) = l n ( π k ) − ( p 2 l n ( 2 π ) + 1 2 l n ( ∣ Σ ∣ ) ) − 1 2 ( x − μ k ) T Σ − 1 ( x − μ k ) = x T Σ ^ μ ^ k − 1 2 μ ^ k T Σ ^ − 1 μ ^ k + l n π ^ k {\delta_k(x) = ln(\pi_kf_k(x))=ln(\pi_k)-(\dfrac{p}{2}ln(2\pi)+\dfrac{1}{2}ln(|\Sigma|))-\dfrac{1}{2}(x-\mu_k)^T\Sigma^-1(x-\mu_k)=x^T\hat{\Sigma}\hat{\mu}_k-\dfrac{1} {2}\hat{\mu}_k^T\hat{\Sigma}^{-1}\hat{\mu}_k+ln\hat{\pi}_k} δk(x)=ln(πkfk(x))=ln(πk)−(2pln(2π)+21ln(∣Σ∣))−21(x−μk)TΣ−1(x−μk)=xTΣ^μ^k−21μ^kTΣ^−1μ^k+lnπ^k- 降维分类的思想理解线性判别分析:
基于数据进行分类时,一个很自然的想法是:将高维的数据降维至一维,然后使用某个阈值将各个类别分开。下面用图的形式展示:
图中,数据的维度是二维的,我们的想法是把数据降维至一维,然后用阈值就能分类。这个似乎是一个很好的想法,我们总是希望降维后的数据同一个类别自身内部方差小,不同类别之间的方差要尽可能大。这也是合理的,因为同一个类别的数据应该更加相似,因此方差小;不同类别的数据之间应该很不相似,这样才能更容易对数据进行分类,我们简称为:类内方差小,类间方差大,在计算机语言叫“松耦合,高内聚”。在做具体的推导之前,我们对数据的形式和一些基本统计量做一些描述:
特征 X = ( x 1 , x 2 , . . . , x N ) T X = (x_1,x_2,...,x_N)^T X=(x1,x2,...,xN)T,因变量 Y = ( y 1 , y 2 , . . . , y N ) T , 其 中 , y i ∈ { + 1 , − 1 } Y = (y_1,y_2,...,y_N)^T,\;\;其中,y_i \in \{+1,-1 \} Y=(y1,y2,...,yN)T,其中,yi∈{+1,−1},类别c1的特征 X c 1 = { x i ∣ y i = + 1 } X_{c_1} = \{x_i|y_i=+1 \} Xc1={xi∣yi=+1},同理,类别c2的特征 X c 2 = { x i ∣ y i = − 1 } X_{c_2} = \{x_i|y_i=-1 \} Xc2={xi∣yi=−1},属于c1类别的数据个数为 N 1 N_1 N1,属于类别c2的数据个数为 N 2 N_2 N2,其中, N 1 + N 2 = N N_1+N_2 = N N1+N2=N。
特征X投影在w方向至一维: z i = w T x i , ∣ ∣ w ∣ ∣ = 1 z_i = w^Tx_i,\;\;||w|| = 1 zi=wTxi,∣∣w∣∣=1
全样本投影的均值 z ˉ = 1 N ∑ i = 1 N z i = 1 N ∑ i = 1 N w T x i \bar{z} = \frac{1}{N}\sum\limits_{i=1}^{N}z_i = \frac{1}{N}\sum\limits_{i=1}^{N}w^Tx_i zˉ=N1i=1∑Nzi=N1i=1∑NwTxi
全样本投影的协方差 S z = 1 N ∑ i = 1 N ( z i − z ˉ ) ( z i − z ˉ ) T = 1 N ∑ i = 1 N ( w T x i − z ˉ ) ( w T x i − z ˉ ) T S_z = \frac{1}{N}\sum\limits_{i=1}^{N}(z_i-\bar{z})(z_i-\bar{z})^T = \frac{1}{N}\sum\limits_{i=1}^{N}(w^Tx_i-\bar{z})(w^Tx_i-\bar{z})^T Sz=N1i=1∑N(zi−zˉ)(zi−zˉ)T=N1i=1∑N(wTxi−zˉ)(wTxi−zˉ)T
c1样本投影的均值 z 1 ˉ = 1 N 1 ∑ i = 1 N 1 z i = 1 N 1 ∑ i = 1 N 1 w T x i \bar{z_1} = \frac{1}{N_1}\sum\limits_{i=1}^{N_1}z_i = \frac{1}{N_1}\sum\limits_{i=1}^{N_1}w^Tx_i z1ˉ=N11i=1∑N1zi=N11i=1∑N1wTxi
c1样本投影的协方差 S z 1 = 1 N 1 ∑ i = 1 N 1 ( z i − z 1 ˉ ) ( z i − z 1 ˉ ) T = 1 N 1 ∑ i = 1 N 1 ( w T x i − z 1 ˉ ) ( w T x i − z 1 ˉ ) T S_{z_1} = \frac{1}{N_1}\sum\limits_{i=1}^{N_1}(z_i-\bar{z_1})(z_i-\bar{z_1})^T = \frac{1}{N_1}\sum\limits_{i=1}^{N_1}(w^Tx_i-\bar{z_1})(w^Tx_i-\bar{z_1})^T Sz1=N11i=1∑N1(zi−z1ˉ)(zi−z1ˉ)T=N11i=1∑N1(wTxi−z1ˉ)(wTxi−z1ˉ)T
c2样本投影的均值 z 2 ˉ = 1 N 2 ∑ i = 1 N 2 z i = 1 N 2 ∑ i = 1 N 2 w T x i \bar{z_2} = \frac{1}{N_2}\sum\limits_{i=1}^{N_2}z_i = \frac{1}{N_2}\sum\limits_{i=1}^{N_2}w^Tx_i z2ˉ=N21i=1∑N2zi=N21i=1∑N2wTxi
c2样本投影的协方差 S z 2 = 1 N 2 ∑ i = 1 N 2 ( z i − z 2 ˉ ) ( z i − z 2 ˉ ) T = 1 N 2 ∑ i = 1 N 2 ( w T x i − z 2 ˉ ) ( w T x i − z 2 ˉ ) T S_{z_2} = \frac{1}{N_2}\sum\limits_{i=1}^{N_2}(z_i-\bar{z_2})(z_i-\bar{z_2})^T = \frac{1}{N_2}\sum\limits_{i=1}^{N_2}(w^Tx_i-\bar{z_2})(w^Tx_i-\bar{z_2})^T Sz2=N21i=1∑N2(zi−z2ˉ)(zi−z2ˉ)T=N21i=1∑N2(wTxi−z2ˉ)(wTxi−z2ˉ)T
类间差距: ( z ˉ 1 − z ˉ 2 ) 2 (\bar{z}_1-\bar{z}_2)^2 (zˉ1−zˉ2)2
类内方差: S 1 + S 2 S_1 + S_2 S1+S2
由于线性判别分析的目标是同一类别内方差小,不同类别之间距离大,因此损失函数定义为: - 基于贝叶斯公式对线性判别分析的理解:
J
(
w
)
=
(
z
ˉ
1
−
z
ˉ
2
)
2
s
1
+
s
2
=
w
T
(
x
ˉ
c
1
−
x
ˉ
c
2
)
(
x
ˉ
c
1
−
x
ˉ
c
2
)
T
w
w
T
(
s
c
1
+
s
c
2
)
w
w
^
=
a
r
g
m
a
x
w
J
(
w
)
J(w) = \frac{(\bar{z}_1-\bar{z}_2)^2}{s_1+s_2} = \frac{w^T(\bar{x}_{c_1}-\bar{x}_{c_2})(\bar{x}_{c_1}-\bar{x}_{c_2})^Tw}{w^T(s_{c_1}+s_{c_2})w}\\ \;\;\; \hat{w} = argmax_w\;J(w)
J(w)=s1+s2(zˉ1−zˉ2)2=wT(sc1+sc2)wwT(xˉc1−xˉc2)(xˉc1−xˉc2)Tww^=argmaxwJ(w)
记:
S
b
=
(
x
ˉ
c
1
−
x
ˉ
c
2
)
(
x
ˉ
c
1
−
x
ˉ
c
2
)
T
,
S
w
=
(
s
c
1
+
s
c
2
)
S_b = (\bar{x}_{c_1}-\bar{x}_{c_2})(\bar{x}_{c_1}-\bar{x}_{c_2})^T,\;S_w = (s_{c_1}+s_{c_2})
Sb=(xˉc1−xˉc2)(xˉc1−xˉc2)T,Sw=(sc1+sc2),因此
J
(
w
)
=
w
T
S
b
w
w
T
S
w
w
J(w) = \frac{w^TS_bw}{w^TS_ww}
J(w)=wTSwwwTSbw
让J(w)对w求导等于0,求出:
w
=
S
w
−
1
(
x
ˉ
c
1
−
x
ˉ
c
2
)
w = S_w^{-1}(\bar{x}_{c_1}-\bar{x}_{c_2})
w=Sw−1(xˉc1−xˉc2)
(2) 朴素贝叶斯:
在线性判别分析中,我们假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。在之前所看到的偏差-方差理论中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线性判别分析模型的方差小,偏差大。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚至多于线性判别分析,例如鼎鼎大名的新闻分类,垃圾邮件分类等。
# 线性判别分析
'''
参数:
solver:{'svd','lsqr','eigen'},默认='svd'
solver的使用,可能的值:
'svd':奇异值分解(默认)。不计算协方差矩阵,因此建议将此求解器用于具有大量特征的数据。
'lsqr':最小二乘解,可以与收缩结合使用。
'eigen':特征值分解,可以与收缩结合使用。
'''
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda_iris = LinearDiscriminantAnalysis()
lda_iris.fit(X,y)
lda_iris.score(X,y)
0.98
3 决策树
# 使用决策树算法对iris分类:
'''
criterion:{“gini”, “entropy”}, default=”gini”
max_depth:树的最大深度。
min_samples_split:拆分内部节点所需的最少样本数
min_samples_leaf :在叶节点处需要的最小样本数。
'''
from sklearn.tree import DecisionTreeClassifier
tree_iris = DecisionTreeClassifier(min_samples_leaf=5)
tree_iris.fit(X,y)
tree_iris.score(X,y)
0.9733333333333334
- 决策树 :
与前面内容所讲的决策树回归大致是一样的,只是在回归问题中,选择分割点的标准是均方误差,但是在分类问题中,由于因变量是类别变量而不是连续变量,因此用均方误差显然不合适。那问题是用什么作为选择分割点的标准呢?我们先来分析具体的问题:
在回归树中,对一个给定的观测值,因变量的预测值取它所属的终端结点内训练集的平均因变量。与之相对应,对于分类树来说,给定一个观测值,因变量的预测值为它所属的终端结点内训练集的最常出现的类。分类树的构造过程与回归树也很类似,与回归树一样,分类树也是采用递归二叉分裂。但是在分类树中,均方误差无法作为确定分裂节点的准则,一个很自然的替代指标是分类错误率。分类错误率就是:此区域内的训练集中非常见类所占的类别,即:
E = 1 − m a x k ( p ^ m k ) E = 1-max_k(\hat{p}_{mk}) E=1−maxk(p^mk)
上式中的 p ^ m k \hat{p}_{mk} p^mk代表第m个区域的训练集中第k类所占的比例。但是在大量的事实证明:分类错误率在构建决策树时不够敏感,一般在实际中用如下两个指标代替:
(1) 基尼系数:
G = ∑ k = 1 K p ^ m k ( 1 − p ^ m k ) G = \sum\limits_{k=1}^{K} \hat{p}_{mk}(1-\hat{p}_{mk}) G=k=1∑Kp^mk(1−p^mk)
在基尼系数的定义中,我们发现这个指标衡量的是K个类别的总方差。不难发现,如果所有的 p ^ m k \hat{p}_{mk} p^mk的取值都接近0或者1,基尼系数会很小。因此基尼系数被视为衡量结点纯度的指标----如果他的取值小,那就意味着某个节点包含的观测值几乎来自同一个类别。
由基尼系数作为指标得到的分类树叫做:CART。
(2) 交叉熵:
可以替代基尼系数的指标是交叉熵,定义如下:
D = − ∑ k = 1 K p ^ m k l o g p ^ m k D = -\sum\limits_{k=1}^{K} \hat{p}_{mk}log\;\hat{p}_{mk} D=−k=1∑Kp^mklogp^mk
显然,如果所有的 p ^ m k \hat{p}_{mk} p^mk都接近于0或者1,那么交叉熵就会接近0。因此,和基尼系数一样,如果第m个结点的纯度越高,则交叉熵越小。事实证明,基尼系数和交叉熵在数值上时很接近的。
决策树分类算法的完整步骤:
a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j以及固定j后遍历切分点s,选择使得基尼系数或者交叉熵最小的(j,s)
b. 按照(j,s)分裂特征空间,每个区域内的类别为该区域内样本比例最多的类别。
c. 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于5。
d. 将特征空间划分为J个不同的区域,生成分类树。