数据集采用的IRIS鸢尾花数据集,先读取数据
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()
分类的评价标准
对于模型的评价,通常采用通过混淆矩阵计算出的各项指标,针对不同的情况有不同的评价指标。对于均衡的数据,一般采用最常见的指标及总体的准确率判断即可。对于不均衡的数据,一般更关注的是正类样本的识别率。一般的混淆矩阵如下所示:

根据混淆矩阵可以计算出如下指标:
(1)召回率(Recall):实际为正类且被预测为正类样本数占总正类样本数的比率,即实际正类样本的识别率:
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Recall = \frac{TP}{TP+FN}
Recall=TP+FNTP
(2)精确率: 实际为正类且被预测为正类样本数占预测为正类样本数的比例,即实际正类样本在预测正类中的覆盖率:
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
Precision = \frac{TP}{TP+FP}
Precision=TP+FPTP
(3) F1-score:是由recall和precision这两个指标综合得到的评价标准:
F
1
−
s
c
o
r
e
=
2
∗
T
P
2
∗
T
P
+
F
P
+
F
N
F1-score = \frac{2*TP}{2*TP+FP+FN}
F1−score=2∗TP+FP+FN2∗TP
(4)正确率(Accuracy):预测正确的样本占总样本的比例。
P
r
e
c
i
s
i
o
n
=
T
P
+
T
N
T
P
+
T
N
+
F
P
+
F
N
Precision = \frac{TP+TN}{TP+TN+FP+FN}
Precision=TP+TN+FP+FNTP+TN
除了这些指标以外,还有一个很重要的评估方法就是ROC(Receiver Operation Characteristics)曲线,它是通过绘制TP率( T P 率 = T P T P + F N TP率=\frac{TP}{TP+FN} TP率=TP+FNTP )和FP率的关系得到的衡量分类预测精度( F P 率 = F P F P + T N FP率=\frac{FP}{FP+TN} FP率=FP+TNFP),曲线越接近坐标左上角则说明该分类器的效果越好。并且ROC曲线不随数据的正负类比率发生大幅度的改变。

AUC(Area Under Curve)值:AUC值是ROC曲线下方的面积,其取值范围在0到1之间,其值越大说明分类效果越好,其值越小说明分类效果越不好,一般AUC值大于0.8,则认为分类的效果较好。
算这些值可以在python中classification.metrics的实现,其具体的函数在此网址可以找到:
https://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics
常见的分类模型
逻辑回归
该方法是通过logistic 函数将所有取值压缩到0到1之间;这里的目标函数的函数不像线性回归一样能简单求出解析解,因此我们使用迭代的优化算法:梯度下降法等;
# 逻辑回归
'''
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)
基于概率的分类模型
(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
# 线性判别分析
'''
参数:
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)
(2) 朴素贝叶斯:
在线性判别分析中,我们假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。在之前所看到的偏差-方差理论中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线性判别分析模型的方差小,偏差大。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚至多于线性判别分析,例如鼎鼎大名的新闻分类,垃圾邮件分类等。
# 朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
NB_iris = GaussianNB()
NB_iris.fit(X, y)
NB_iris.score(X,y)
决策树
决策树算法是机器学习中有监督学习的一种,也是解决二分类问题中最为常见的一种算法。该算法的核心思想就是从数据的全部特征中找到一个最优特征来作为根节点对决策树进行分割,然后从该特征中找到最优候选值,将数据一分为二,不断反复地实施上述的步骤,停止循环的前提是直至每一个叶节点都足够“纯”即可。不同的决策树算法的主要区别就是寻找这个分割特征的方法。
决策树分类算法的完整步骤:
a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j以及固定j后遍历切分点s,选择使得基尼系数或者交叉熵最小的(j,s)
b. 按照(j,s)分裂特征空间,每个区域内的类别为该区域内样本比例最多的类别。
c. 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于5。
d. 将特征空间划分为J个不同的区域,生成分类树。
# 使用决策树算法对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)
28万+

被折叠的 条评论
为什么被折叠?



