本文参考链接
https://github.com/datawhalechina/team-learning-data-mining/tree/master/IntegratedLearning
1. 导入数据集
本次使用的是sklearn自带的 IRIS鸢尾花数据集
导包
import numpy as np
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):花瓣宽度(厘米)
2. 选择度量模型性能的指标
度量分类模型的指标和回归的指标不一样。分类问题本身的因变量是离散变量,单单衡量预测值和因变量的相似度行不通。在分类任务中,对于每个类别犯错的代价不尽相同。为了解决这些问题,必须将各种情况分开讨论,然后才能给出评价指标。
- 真阳性TP:预测值和真实值都为正例;
- 真阴性TN:预测值与真实值都为正例;
- 假阳性FP:预测值为正,实际值为负;
- 假阴性FN:预测值为负,实际值为正。
分类模型的指标:
准确率:分类正确的样本数占总样本的比例,即: 𝐴𝐶𝐶=(𝑇𝑃+𝑇𝑁)/(𝐹𝑃+𝐹𝑁+𝑇𝑃+𝑇𝑁)。
精度:预测为正且分类正确的样本占预测值为正的比例,即: 𝑃𝑅𝐸=𝑇𝑃/(𝑇𝑃+𝐹𝑃)。
召回率:预测为正且分类正确的样本占类别为正的比例,即: 𝑅𝐸𝐶=𝑇𝑃/(𝑇𝑃+𝐹𝑁)。
F1值:综合衡量精度和召回率,即: 𝐹1=2(𝑃𝑅𝐸×𝑅𝐸𝐶)/(𝑃𝑅𝐸+𝑅𝐸𝐶)。
ROC曲线:以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好。
在本次小案例中,我们使用ROC曲线作为最终评价指标。
3. 模型训练
3.1 逻辑回归 – logistic regression
from sklearn.linear_model import LogisticRegression
log_iris = LogisticRegression()
log_iris.fit(X,y)
log_iris.score(X,y)
0.96
3.2 线性判别分析
'''
参数:
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.3 朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
NB_iris = GaussianNB()
NB_iris.fit(X, y)
NB_iris.score(X,y)
0.96
3.4 决策树
决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。
跟决策数相关的2个指标
基尼系数:
其中K为类别个数, 𝑝̂ 𝑚𝑘代表第m个区域的训练集中第k类所占的比例,当它的取值接近0或者1时,基尼系数会很小。因此基尼系数被视为衡量结点纯度的指标——如果他的取值小,那就意味着某个节点包含的观测值几乎来自同一个类别。
交叉熵:
如果所有的 𝑝̂ 𝑚𝑘 都接近于0或者1,那么交叉熵就会接近0。因此,和基尼系数一样,如果第m个结点的纯度越高,则交叉熵越小。事实证明,基尼系数和交叉熵在数值上时很接近的。
决策树分类算法的完整步骤:
a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j以及固定j后遍历切分点s,选择使得基尼系数或者交叉熵最小的(j,s)
b. 按照(j,s)分裂特征空间,每个区域内的类别为该区域内样本比例最多的类别。
c. 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于5。
d. 将特征空间划分为J个不同的区域,生成分类树。
'''
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
3.5 支持向量机SVM
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
'''
C:正则化参数。正则化的强度与C成反比。必须严格为正。惩罚是平方的l2惩罚。
kernel:{'linear','poly','rbf','sigmoid','precomputed'},默认='rbf'
degree:多项式和的阶数
gamma:“ rbf”,“ poly”和“ Sigmoid”的内核系数。
shrinking:是否软间隔分类,默认true
'''
svc_iris = make_pipeline(StandardScaler(), SVC(gamma='auto'))
svc_iris.fit(X, y)
svc_iris.score(X,y)
0.9733333333333334