sklearn构建完整回归模型
2.2使用sklearn构建完整的分类项目(参考Datawhale集成学习资料)
剩余问题
1、各类分类模型的适用场景及优缺点
2、支持向量机和决策树的理解
一、搜集数据,并选择合适的变量,此处选用鸢尾花数据集
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()
二、选择度量模型的指标
度量分类问题的指标是和度量回归问题的指标有很大的差别,因为其预测变量都是离散变量,像回归模型一般去度量预测值和实际值的相似程度是行不通的,同时在分类任务中,我们对于每个类别犯错的代价不尽相同。
例:在对癌症进行预测时,将实际患癌的患者预测为不患癌症的错误,显然比实际不患癌而预测为患癌的错误后果要严重很多,因为前者的错误会使得患者失去及时有效的治疗机会,关系的是患者的生命。而后者可以在之后的治疗过程中进一步的对情况进行判断。
因此对分类问题进行度量,需要依照情况来分开讨论,给出具体关注的指标。
真阳性TP:预测值和真实值都为正例;
真阴性TN:预测值与真实值都为正例;
假阳性FP:预测值为正,实际值为负;
假阴性FN:预测值为负,实际值为正;
分类模型的指标:
sklearn分类模型评估指标
三、选择具体模型进行训练
1、逻辑回归
在一般的线性模型,预测变量y是有实际意义的,但对于二分类问题,预测变量的取值只有0和1,这种情况下,0和1没有实际意义。同时如果仍然建立一般线性模型,随着自变量取值的不同,预测变量的取值范围是实数域,按照预测结果进行分类,无法设定阈值,因此引入Logistic函数。
该函数值域在[0,1],x轴在0点对应的结果为0.5,可以看成0或1两类问题,大于0.5可以认为是1类问题,反之是0类问题.
利用一般线性模型进行分析。会存在上述问题,因此引入Logistic变换。
概率p变换如下,体现了概率p与因变量之间的非线性关系。以0.5为界限,预测p大于0.5时,我们判断此时y更可能为1,否则y为0。
最后只需要和线性回归一样,拟合出参数即可。
from sklearn.linear_model import LogisticRegression
log_iris = LogisticRegression()
log_iris.fit(X,y)
log_iris.score(X,y)
如果因变量是多元分类问题,可以采用多元logistic回归进行,但一般实际效果不是很好,可以借助其他模型来解决这个问题。
2、贝叶斯判别
简述:贝叶斯判别,是建立在贝叶斯公式的基础上,将样本信息作为已知信息求在已知信息的情况下,该样本属于各个类别的概率乘上各个类别的先验概率作为判定标准,其中哪个类别的概率之积大,就判定为哪个类别。其中先验概率可以通过各类样本数目占总样本数的比例来确定,样本属于各个类别的概率服从于一定分布,分布的参数值虽类别的改变而改变,可以通过样本数据进行估计出来。
3、降维分类的判别分析
简述:降维分类的判别分析,就是将样本的多维特征进行一个坐标旋转,从而使得坐标旋转后,特征转化为一维数据,在旋转时要求,旋转结束后,各类别之间具有较大的距离,各类自己具有较小方差和,实现一种聚类,寻找出最好的旋转向量,然后再对新样本旋转,看距离那个类别近,就判定为该类。
# 线性判别分析
'''
参数:
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)
4、朴素贝叶斯分类
线性判别分析中,假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。在之前所看到的偏差-方差理论中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线性判别分析模型的方差小,偏差大。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚至多于线性判别分析。
# 朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
NB_iris = GaussianNB()
NB_iris.fit(X, y)
NB_iris.score(X,y)
5、决策树
回归问题中,决策树选择分割点的标准是均方误差,但是在分类问题中,由于因变量是类别变量而不是连续变量,因此用均方误差显然不合适,一个很自然的替代指标是分类错误率。分类错误率就是:此区域内的训练集中非常见类所占的类别,即:
决策树分类算法的完整步骤:
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)
6、支持向量机SVM(线性可分,非线性)
(1)线性可分
基本想法:
如图所视,白色和蓝色的点各为一类,我们的目标是找到一个分割平面将两个类别分开。通常来说,如果数据本身是线性可分的,那么事实上存在无数个这样的超平面。这是因为给定一个分割平面稍微上移下移或旋转这个超平面,只要不接触这些观测点,仍然可以将数据分开。一个很自然的想法就是找到最大间隔超平面,即找到一个分割平面距离最近的观测点最远。
推导过程:
(2)非线性
若出现上图这种无法通过线性方式有效分开的情况,我们就需要先对数据进行更高维度的投影,从而实现线性可分。
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)