目录
使用sklearn构建完整的分类项目
(1)数据集
使用IRIS鸢尾花数据集
from sklearn import datasets
import pandas as pd
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()
有4个特征
- sepal length:花萼长度
- sepal width:花萼宽度
- petal length:花瓣长度
- petal width:花瓣宽度
(2)评价指标
分类结果混淆矩阵
查准率/准确率
查全率/召回率
P-R图直观地显示出学习器在样本总体上的查全率和查准率
如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全“包住” ,则可以断言后者的性能优于前者;如果两个学习器的P-R曲线发生交叉,则难以断言两者孰优孰劣。此时,一个比较合理的判据是比较P-R曲线下面积的大小。
由于面积估算比较困难,设计了一些综合考虑查准率、查全率的性能度量
“平衡点(BEP)” 是差准确=查全率时的取值
F1度量,
F
1
=
2
×
P
×
R
P
+
R
F1=\frac{2\times{P}\times{R}}{P+R}
F1=P+R2×P×R
F
β
F_\beta
Fβ
多次训练/测试,在多个数据集上进行训练/测试,多分类任务两两对应一个混淆矩阵——在多个训练矩阵上综合考察查准率和查全率
- 宏查准率(macro-P)、宏查全率和宏F1
先在各混淆矩阵上分别计算出P和R,再计算平均值 - 微查准率(micro-P)、微查全率和微F1
先将各混淆矩阵的对应元素进行平均,得到TP等的平均值,再基于此计算
ROC曲线
全称是Receiver Operating Characteristic Curve,中文名为“受试者工作特征曲线”
纵轴为真正例率TPR,横轴为假正例率FPR
与P-R曲线一致,如果一个学习器的ROC曲线被另一个学习器完全包住,则断言后者性能更优;在交叉的情况下,考虑AUC
AUC(Area Under Curve)
- AUC=1,完美分类器
- 0.5<AUC<1,优于随机猜测,设定好阈值存在预测价值
- AUC<0.5,比随机猜测要差,可以反预测而行
AUC有一个等价的性质,那就是:测试任意给一个正类样本和一个负类样本,正类样本的score有多大的概率大于负类样本的score。
ROC曲线的绘制,以一个二分类模型输出为例
指定不同的阈值,分别计算FPR和TPR,得到关键点,连接各点,得到如下ROC曲线
还有一种更为直观的方法
https://www.jianshu.com/p/2ca96fce7e81
在本次案例中 ,选择ROC曲线作为最终评价指标。
(3)选择具体的模型并进行训练
逻辑回归Logistic regression
Logistic 函数/sigmoid函数
可以将线性回归的结果转换到(0,1)区间内
一般使用迭代的优化算法:梯度下降法
sklearn实例
from sklearn.linear_model import LogisticRegression
log_iris = LogisticRegression()
log_iris.fit(X,y)
log_iris.score(X,y)
0.96
一些参数
- 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
加入l1正则化,结果还是0.96
线性判别分析(基于概率)
1)基于贝叶斯公式
贝叶斯定理
2)降维分类思想
朴素贝叶斯
对线性判别分析做进一步的模型简化
假设各个特征之间不相关(协方差矩阵中的协方差全部变成0,只保留各自的特征方差)
from sklearn.naive_bayes import GaussianNB
NB_iris = GaussianNB()
NB_iris.fit(X,y)
NB_iris.score(X,y)
0.96
决策树
给定一个观测值,因变量的预测值为它所属的终端结点内训练集最常出现的类
常用以下三种确定分裂的准则
1)信息增益
2)增益率
3)基尼系数
剪枝
剪枝是决策树学习算法对付“过拟合”的主要手段。
采用留出法,预留一部分数据用作“验证集”
- 预剪枝
- 后剪枝
对于连续变量,可以采用二分法对连续属性离散化(C4.5)
from sklearn.tree import DecisionTreeClassifier
tree_iris = DecisionTreeClassifier(min_samples_leaf=5)
tree_iris.fit(X,y)
tree_iris.score(X,y)
- criterion:{“gini”, “entropy”}, default=”gini”
- max_depth:树的最大深度。
- min_samples_split:拆分内部节点所需的最少样本数
- min_samples_leaf :在叶节点处需要的最小样本数。
SVM
最大间隔超平面,找到一个超平面使得距离超平面最近的观测点最远。
一个点距离分类超平面的远近可以表示分类预测的确信程度,符号表示分类是否正确。
函数间隔:即以
γ
^
i
=
y
i
(
w
⋅
x
i
+
b
)
\hat\gamma_i=y_i(w \cdot x_i+b)
γ^i=yi(w⋅xi+b)表示分类的正确性及确信度
几何间隔:对超平面的法向量
w
w
w加约束,如规范化,
∣
∣
w
∣
∣
=
1
\mid\mid w \mid\mid = 1
∣∣w∣∣=1,此时函数间隔成为几何间隔。
γ
i
=
y
i
(
w
∣
∣
w
∣
∣
⋅
x
i
+
b
∣
∣
w
∣
∣
)
\gamma_i=y_i(\frac{w}{\mid\mid w \mid\mid}\cdot x_i+\frac{b}{\mid\mid w \mid\mid})
γi=yi(∣∣w∣∣w⋅xi+∣∣w∣∣b)
几何间隔最大的分离超平面
非线性支持向量机
将数据投影至高维度,变成线性可分的问题
常用的核函数
1 多项式核函数
K
(
X
i
,
X
j
=
(
<
X
i
,
X
j
>
+
c
)
d
)
K(X_i,X_j = (<X_i,X_j>+c)^d)
K(Xi,Xj=(<Xi,Xj>+c)d)
C用来控制低阶项的强度
2 高斯核函数(RBF核函数)
K
(
X
i
,
X
j
)
=
e
x
p
(
−
∣
∣
X
i
−
X
j
∣
∣
2
2
2
σ
2
)
K(X_i,X_j)=exp(-\frac{\mid\mid X_i-X_j \mid\mid_2^2 }{2\sigma^2})
K(Xi,Xj)=exp(−2σ2∣∣Xi−Xj∣∣22)
需要将特征标准化
3 Sigmoid核函数
K
(
X
i
,
X
j
)
=
t
a
n
h
(
α
X
i
T
X
j
+
c
K(X_i,X_j)=tanh(\alpha X_i^TX_j+c
K(Xi,Xj)=tanh(αXiTXj+c)
此时相当于没有隐藏层的简单神经网络
4 余弦相似度
K
(
X
i
,
X
j
)
=
X
i
T
X
j
∣
∣
X
i
∣
∣
∣
∣
X
j
∣
∣
K(X_i,X_j)=\frac{X_i^TX_j}{\mid\mid X_i \mid\mid \mid\mid X_j \mid\mid}
K(Xi,Xj)=∣∣Xi∣∣∣∣Xj∣∣XiTXj
参考文献:
DataWhale开源资料
拓展学习资料:简单理解线性判别分析https://zhuanlan.zhihu.com/p/66088884
Python实现决策树https://zhuanlan.zhihu.com/p/65304798
数学估计方法——最小方差、极大似然与贝叶斯https://zhuanlan.zhihu.com/p/41015902
机器学习之sklearn基本分类方法https://zhuanlan.zhihu.com/p/173945775
机器学习优化算法之贝叶斯优化https://zhuanlan.zhihu.com/p/146329121
机器学习之简单分类模型https://zhuanlan.zhihu.com/p/137215803
全面了解ROC曲线
机器学习基础(1)- ROC曲线理解