版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章
决策树与随机森林本章主要内容9.1决策树9.2回归树9.3随机森林9.4课后习题9.1决策树9.1.1决策树的原理决策树:用于解决分类问题生活中的例子:母亲给女儿介绍一个男朋友,女儿根据各种信息判断是否同意去相亲叶子节点中间节点根节点9.1.2如何建立一棵决策树思路一:基于信息熵建树ID3、C4.5CART思路二:基于基尼系数建树9.1.2如何建立一棵决策树——信息熵信息熵是用来衡量一个随机变量出现的期望值。信息的不确定性越大,熵的值也就越大,出现的各种情况也就越多。例如“下一届国际足联男子世界杯冠军”这个句话的信息熵就大于“下一届国际乒联男子世界杯冠军”,因为前者在事件没有发生时的不确定性很高,冠军可能的情况包括法国队、巴西队、阿根廷队、德国队、英格兰队、意大利队......,而后者在事件没有发生时的不确定性很低,冠军可能的情况只有中国队。信息熵的计算公式为:
,其中X是所有发生的可能性,x是某一种可能性。以“2022年国际足联男子世界杯冠军”这个事件为例,假设共有8支队伍有可能夺冠,每支队伍夺冠的可能性都是1/8。则“2022年国际足联男子世界杯冠军”这件事的信息熵为:决策树的两种子方法ID3和C4.5就是使用信息熵作为建树的理论依据。9.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值步骤1:info(c)部分计算,即针对标签(是否买电脑)的信息熵计算:买电脑的样本为9,即买电脑的概率是9/14,不买电脑的概率是5/14。因此:info(c)=-9/14log2(9/14)-5/14log2(5/14)≈0.9409.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值步骤2:info(c|年龄)的计算,即针对年龄特征和标签的条件信息熵的计算:在年龄特征,一共分为三种情况:<30、30-40、>40
情况1:当年龄<30时,一共有5个样本,其中2个买电脑了,3个没买,即info(c|x<30)=-2/5log2(2/5)-3/5log2(3/5)
情况2:当30<=年龄<=40时,一共有4个样本,其中3个买电脑了,1个没买,即info(c|30<=x<=30)=-3/4log2(3/4)-1/4log2(1/4)情况3:当年龄>40时,一共有5个样本,其中3个买电脑了,2个没买,即info(c|x>40)=-3/5log2(3/5)-2/5log2(2/5)9.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值步骤3:计算Gain(年龄)Gain(年龄)=
info(c)
-5/14*info(c|x<30)
-4/14*info(c|30<=x<=40)
-5/14*info(c|x>40)
≈0.1509.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值步骤4:根据前三步计算方法,分别计算出:
Gain(年龄)
≈0.150
Gain(收入)
≈0.090
Gain(学生)
≈0.016
Gain(信用)
≈0.048其中“年龄”的信息增益是最大的9.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值第五步:根据第四步结果:选择信息增益最大的特征“年龄”作为根节点根据年龄将样本进行了区分:年龄小于30的节点落在了左侧面年龄在30到40之间的节点落在了中间年龄大于40的节点落在了右侧。9.1.2如何建立一棵决策树——ID3建树过程
9.1.2如何建立一棵决策树——ID3建树过程
针对这个表继续计算,每个特征的信息增益,Gain(收入)≈0.971Gain(学生)≈0.420Gain(信用)≈0.020。因此使用“收入”进行下一步分裂此次判断已经有了最终结果,即“买”或“不买”,这就是叶子节点。其他节点以此类推9.1.2如何建立一棵决策树——C4.5建树过程ID3算法并不是完美的,在上面的例子中将“年龄”、“收入”、“学生”、“信用”作为特征构建决策树。如果将“序号”也含在特征中,看看“序号”的信息增益。如果将“序号”也含在特征中,看看“序号”的信息增益。info(c)≈0.940Info(c|x=1)=-1/1*log2(1/1)-0/1*log2(0/1)=0Info(c|x=2)=-1/1*log2(1/1)-0/1*log2(0/1)=0Info(c|x=3)=-1/1*log2(1/1)-0/1*log2(0/1)=0......Info(c|x=14)=-1/1*log2(1/1)-0/1*log2(0/1)=0所以Gain(序号)=info(c)-0≈0.940这时发现序号的信息增益最大,应该首先以序号为根节点进行判断,可是这没有意义,序号列信息增益大的原因完全是因为序号的种类“太琐碎了”,从而导致条件信息熵是0。9.1.2如何建立一棵决策树——C4.5建树过程为了解决这个中由于某一个属性取值种类太多造成的问题,又引入了信息增益率的概念。信息增益率的公式为:GainRatio(X)=Gain(X)/SplitInfo(X)。其中SplitInfo(X)是针对X特征本身的信息熵计算SplitInfo(年龄),年龄3种可能的概率分别是
小于30岁:5/1430到40岁:4/14大于40岁:5/14
则SplitInfo(年龄)=-5/14*log2(5/14)-4/14*log2(4/14)-5/14*log2(5/14)≈0.189由ID3计算过程可知:Gain(年龄)≈0.150所以GainRatio(年龄)=0.150/0.189≈0.7949.1.2如何建立一棵决策树——C4.5建树过程
序号列的信息增益率呢?序号列一共有14种取值,每种取值概率都是1/14,因此SplitInfo(序号)=-1/14*log2(1/14)-1/14*log2(1/14)......-1/14*log2(1/14)≈3.8由前面(PPT第12页)计算可知:Gain(序号)=0.940所以GainRatio(序号)=0.940/3.8≈0.247选择信息增益率大的特征作为优选的判断特征。年龄的信息增益率(0.794)大于序号的信息增益率(0.247),因此年龄列比序号列更适合优先作为判断节点。其他特征的信息增益率及比较方法相同,每次迭代选取信息增益率最大的特征作为判断属性,建立决策树,这种算法叫做C4.5算法。现在选用信息熵作为建树依据的方法多数都是选择C4.5作为默认算法。9.1.2如何建立一棵决策树——CART建树过程除了信息熵,基尼系数(Gini)也可以作为建树的依据,基尼系数也可以体现出事物的不确定性(不纯度)。基尼系数的公式:其中I是所有的可能,i是某一种可能。某一属性Gini系数增益的公式为:针对“年龄”列进行统计:
Gini(买|年龄)=1-(2/8)2
-(3/8)2
-(3/8)2
≈0.656Gini(不买|年龄)=1-(3/6)2
-(1/6)2
-(2/6)2
≈0.611Gain(年龄)=9/14*Gini(买|年龄)+5/14*Gini(不买|年龄)
≈0.6409.1.2如何建立一棵决策树——CART建树过程基尼系数的公式:其中I是所有的可能,i是某一种可能。某一列Gini系数增益的公式为:针对“收入”列进行统计:Gini(买|收入)=1-(2/9)2-(5/9)2-(2/9)2≈0.592Gini(不买|收入)=1-(2/5)2-(1/5)2-(2/5)2≈0.64Gain(收入)=9/14*Gini(买|收入)+5/14*Gini(不买|收入)
=9/14*0.592+5/14*0.64
≈0.6099.1.2如何建立一棵决策树——CART建树过程基尼系数的公式:其中I是所有的可能,i是某一种可能。某一列Gini系数增益的公式为:针对“学生”列进行统计:Gini(买|学生)=1-(5/9)2-(4/9)2≈0.494Gini(不买|学生)=1-(2/5)2-(3/5)2≈0.48Gain(学生)=9/14*Gini(买|学生)+5/14*Gini(不买|学生)≈0.4899.1.2如何建立一棵决策树——CART建树过程基尼系数的公式:其中I是所有的可能,i是某一种可能。某一列Gini系数增益的公式为:针对“信用”列进行统计:Gini(买|信用)=1-(3/9)2-(6/9)2≈0.444Gini(不买|信用)=1-(3/5)2-(2/5)2≈0.48Gain(信用)=9/14*Gini(买|信用)+5/14*Gini(不买|信用)
≈0.4579.1.2如何建立一棵决策树——CART建树过程选择基尼增益小的特征作为判断特征,显然“信用”的信息增益系数最小,表示不纯度最小,所以通过信用特征来判断的结果能相对较“纯”。Gain(年龄)
≈0.640Gain(收入)≈0.609Gain(学生)≈0.489Gain(信用)≈0.457各子节点依据以上方式继续迭代9.1.2如何建立一棵决策树——信息熵VS基尼系数无论是信息熵、信息增益、信息增益率还是基尼系数,中心思想都是找到判断事务条件的不纯度。越“纯”的条件,判断得越“靠谱”。在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,决策树的生长会更加“精细”,但更容易过拟合,但当模型拟合程度不足的时候,可以使用信息熵。实战中一般先选基尼系数,效果不好再换成信息熵9.1.3sklearn中的决策树实现#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#X为原始数据中不包括target列部分,是由历史数据中“非结果列”组成的数据X=df.loc[:,(df.columns!='target')]#Y为原始数据中target列部分,是由历史数据中“结果列”组成的数据Y=df.loc[:,df.columns=='target']9.1.3sklearn中的决策树实现#第二步:数据预处理#缺失值处理df.dropna()#其他数据预处理将在第6次课介绍9.1.3sklearn中的决策树实现#第三步,建模#将历史数据按照8:2的比例分随机分为训练集和测试集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)#导入决策树工具包fromsklearn.treeimportDecisionTreeClassifierasDT#创建模型clf=DT()#训练模型clf.fit(Xtrain,Ytrain)9.1.3sklearn中的决策树实现#第四步,用测试集检验模型预测效果#使用predict方法,根据Xtest预测测试集的结果result=clf.predict(Xtest)#将测试集真实结果和预测结果进行对比df=pd.DataFrame({'真实结果':Ytest.loc[:,'target'],'预测结果':pd.Series(result,index=Ytest.index)})print(df)9.1.3sklearn中的决策树实现#第四步,用测试集检验模型预测效果#可以使用一些指标来评价模型表现,例如使用R2值评价多元线性回归score=clf.score(Xtest,Ytest)print(score)#其他指标(混淆矩阵、recall、AUC值等)与逻辑回归中的实现方法完全一致,不再赘述9.1.3sklearn中的决策树实现——决策树模型的重要属性#feature_importances:查看每个特征在构建决策树时的重要程度。实现方法如下:#查看每个特征的重要程度df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#feature_importances_返回建模时,每个特征的重要程度fi=pd.Series(clf.feature_importances_,index=df.columns[0:-1])print(fi)9.1.4决策树调参——决策树的剪枝什么是剪枝?如果数据够复杂,建立的决策树也会很复杂,各种判断条件和判断结果“枝繁叶茂、层出不穷”,这样做会出现连个问题。第一、过拟合,因为训练得“太细”,导致整个模型过分依赖训练数据;第二、计算性能低,因为树结构太复杂,计算时需要占用大量资源,导致计算效率下降。为了避免树结构过于复杂,可以采用剪枝的方法。剪枝顾名思义,就是删除树中的一部分节点和叶子。左图为剪枝前的决策树,右图为剪之后的决策树。9.1.4决策树调参——决策树中可以实现剪枝的参数max_depth,参数内容是整数。max_depth就是指定树的最大深度,超过这个深度的中间节点和叶子节点统统砍掉,砍掉部分将变成一个叶子节点,这个节点的分类结果是砍掉部分样本数最多的分类。调参时也可以使用学习曲线+交叉验证的方法。min_samples_split,内容是整数,也是一个剪枝参数,一个节点必须要包含至少min_samples_split个样本,否则不再进行分枝。还有一个类似的参数:min_samples_leaf,也是一个剪枝参数,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则不会在分枝,注意min_samples_leaf既可以是一个整数,表示样本个数,也可以是一个浮点小数,表示样本的比例。调参时也可以使用学习曲线+交叉验证的方法。如果说max_depth是在原有树基础上大刀阔如的砍掉太深的节点,那min_samples_split和min_samples_leaf就是在建树的过程中就小心翼翼的把握着树的结构,所以用max_depth剪枝的方法叫后剪枝,即在建树后剪枝;min_samples_split和min_samples_leaf叫先剪枝,即在建树的过程中就控制树的结构。二者可以配合使用。9.1.4决策树调参——决策树其他重要参数criterion,参数内容是是两个可选数值:gini(基尼系数)和entropy(信息熵),也就是之前介绍的两种建树方法,默认值是基尼系数。在实战中,一般先用基尼系数,如果结果不满意,再换成信息熵。random_state,参数内容是数值型。在使用维度较高(特征较多)的数据建树时,sklearn并不是将所有的特征都纳入建树过程,而是随机的挑选一些建树,random_state就是一种随机状态,不同随机状态挑选的特征不同,也就相当于建立了不同的决策树。Splitter,参数内容是两个可选值,best和random。上面提到random_state是在众多特征中挑选一部分特征建树,如果splitter参数选择的是best,那么选择的特征将更倾向于“重要的特征”(详见feature_importance_属性),如果splitter参数选择的是random,那就是“彻底”的随机选择特征建树了class_weight:
可以是None、balanced、或者字典类型。主要用于指定样本各类别的的权重,这样可以防止类不平衡问题(例如对于银行欺诈行为的统计数据,可能1000个人当中只有1个骗子,如果按照原始数据建模,骗子的数据会非常少,很难真正找到骗子的特征,而且即使对于骗子预测失败,把所有人都当好人,模型的准确率依然很好,因为有999个好人,准确率就是99.9%)。可以选用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高;还可以使用None,所有类别的权重都一样,也可以通过字典型指定各个样本的权重;。9.1.5决策树的重要属性和方法(1)属性feature_importances_(2)apply()方法9.2回归树9.2.1回归树的工作原理决策树主要是用于解决分类预测问题,决策树的建树方法还可以用于解决回归问题。这就会可以使用回归树。假设有根据历史数据建立如下回归树,目标是通过x1和x2的值预判y的取值:当一个被预测样本x1=40,x2=38,求这个样本的y值。这个被预测样本应该落在左数第二个叶子节点上,这个叶子上有三个历史y值,应该选哪个作为结果呢?答案是这个叶子节点所有历史y值的平均值,即26。9.2.1回归树的工作原理——回归树的损失函数回归树为什么使用叶子节点所有样本的平均值作为预测结果呢?这是通过回归树损失函数优化过程求得的。假设使用均方误差作为损失函数评断的依据,则损失函数如公式:其中f(xi)是通过回归树对样本xi进行预测的值,yi是样本xi的真实数值,i从1到n表示n个样本。设f(xi)为其中m表示某个叶子号,Cm表示m号叶子返回的值,I表示是某片叶子是否和这个样本发生关系,如果不发生关系I相当于0。所以f(xi)返回了所有和这个样本相关叶子节点的返回值。将f(xi)代入损失函数得
,此时的J便是回归树的损失函数。目标为求J最小值时Cm取值
9.2.1回归树的工作原理——回归树的损失函数损失函数这个公式的意思是对于一个样本i,找到所有(M个)和它有关的叶子,计算叶子返回值和真实值的方差,然后计算所有(n个)样本的均方差。既然我们理解了这个公式的意思是,可以给它进行一个变形。我们可以针对某一个叶子,计算叶子返回值C和这个叶子所有相关样本真实值的方差,然后再累加所有叶子节点上的方差,再除以样本数,结果同样是所有样本的均方误差。此时损失函数变为什么样的Cm能让这个损失函数最小呢?我们可以针对损失函数关于Cm求导,因为前面的M和n都是常数,所以求导时可以忽略不计,则损失函数J关于关于Cm求导,为:此时损失函数优化的目标就变成了求此导数等于0时的解。假设叶子中和样本i相关的样本有Nm个,则原公式变为
,求解得:由此可见当Cm取值为叶子中相关样本值的平均值时损失函数可以取极值。9.2.2回归树建树过程假设有如下数据:第一步:将原始数据按照X1小打到排序,则原数据表变为如下:9.2.2回归树建树过程第一步生成的新数据表:第二步:以X1列中前2个数的平均值(5和10的平均值)7.5为分界线,将样本分成两部分,X1<7.5的样本在左,X1>7.5的样本在右9.2.2回归树建树过程第三步:计算所有样本方差此时,左面叶子的返回值是20,右面叶子的返回值是其他样本y值的平均值
。然后将第一步得到新表中各个样本根据x1取值放入指定叶子,例如第一行样本x1等于5,小于7.5,所以被分到左边叶子,计算该样本y值与该叶子返回值之间的方差(20-20)2,即0;第二行样本x1为10,大于7.5,所以被分到右边叶子,计算该样本y值与叶子返回值之间的方差(15-)2
;第三行样本x1为20,大于7.5,所以落在叶子,计算该样本y值18与叶子返回值的方差是(18-
)2。以此类推,计算所有样本的均方差。9.2.2回归树建树过程步骤四:以x1列第2和第3个数的平均值(10和20的平均值是15)为分界线,将数据分成两部分,x1<15的落在左侧,x1>15的落在右侧,同样计算所有样本的均方差。步骤五:将X1列所有可能分枝的均方差都求出来步骤六:将X2和X3列所有可能分枝的均方差都求出来步骤七:找出均方差最小的分枝可能进行分枝,将数据的各个样本分到左侧和右侧节点。步骤八:针对左侧节点和右侧节点的数据,按照步骤一到步骤六,计算所有可能分枝的均方差,找到最小均方差的分枝方法继续分枝。步骤九:在新的分枝中不断再分枝,直到符合停止分枝的条件(如分到了叶子节点、树层数限制、分枝样本条件数限制等)。9.2.3回归树的实现#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\boston_lishi.csv',index_col='id')#X为原始数据中不包括target列部分,是由历史数据中“非结果列”组成的数据X=df.loc[:,(df.columns!='target')]#Y为原始数据中target列部分,是由历史数据中“结果列”组成的数据Y=df.loc[:,df.columns=='target']9.2.3回归树的实现#第二步:数据预处理#缺失值处理df.dropna()#其他数据预处理将在第6次课介绍9.2.3回归树的实现#第三步建模与模型评估#导入回归树工具包fromsklearn.treeimportDecisionTreeRegressorasDT#创建模型reg=DT()#除之前多次演示的模型表现评估方法外,也可以直接使用交叉验证进行评估fromsklearn.model_selectionimportcross_val_score#可以通过scoring="neg_mean_squared_error",使用均方误差(其实是“负均方误差”)来衡量回归模型表现score_test=cross_val_score(reg,X,Y,cv=10,scoring="neg_mean_squared_error")print("模型整体均方误差:{0}".format(score_test.mean()))9.3随机森林集成算法所谓集成算法是建立多个评估器(单独的分类模型或者回归模型),综合考虑这些模型的预测结果,以此来获取比单个模型更好的回归或分类表现。在集成算法中,每一个单个评估器叫做弱评估器或基评估器,多个弱评估器和基评估器整合而成强评估器或者集成评估器。通常来说,集成算法包括装袋法(Bagging)和提升法(Boosting)。9.3.1随机森林工作原理随机决策森林是一种装袋法,装袋法是将各个弱评估器放在一起,每一个弱评估器计算出一个结果,然后各个弱评估器结果以“少数服从多数”(有些算法可能会对部分结果进行加权)的原则得出一个统一的结果。这种方法避免了单个评估器的偶然性。随机森林,顾名思义,就是好多决策树聚在一起,然后将这些决策树的结果汇总后得到一个统一的结果。9.3.2随机森林实现随机森林的实现步骤与决策树等模型基本一致,只是导入工具包和建模不同fromsklearn.ensembleimportRandomForestClassifierclf=RandomForestClassifier()随机森林的思想也可以用于回归问题,成为回归森林,导入包与建模如下fromsklearn.ensembleimportRandomForestRegressorreg=RandomForestRegressor()9.3.3重要参数前面提到的决策树常用参数在随机决策森林中皆可使用。n_estimators,内容是整数,表示森林中树的个数,也就是基评估器的个数。新版本sklearn中默认值是100,可以使用学习曲线进行调参,一般情况下,基评估器越多,随机森林效果越好(但要注意过拟合),但消耗的计算资源也越多。random_state,内容是整数,之前介绍决策树时就有random_state,意思是当特征过多时,可以random_state为随机数种子随机抽取特征建一棵树。显然随机森林中的random_state不是单指随机建一棵树,否则森林所有的树都是一样的。这里的random_state是整个森林建立时的随机模式,也就是按照某种随机方法建立多棵随机数,不同树建树时选中的特征不同,这样才能保证森林中树的多样性。bootstrap,内容是布尔型,表示是否有放回抽样。有放回抽样是统计学中一个非常重要的抽样方法,例如在一个袋子里随机抽取多个小球,抽取了小球A,作为统计样本,记录后将A放回袋中,下次抽取时仍然有可能抽取到小球A。据统计,有放回抽样中,大概有63.2%的样本会被抽到,剩下的抽不到,因此有放回抽样也被称为“632抽样法”。9.3.4网格搜索随机森林和决策树的调参方式基本一样,都以学习曲线为主。但因为n_estimators和max_depth都很重要,可能会出现多个参数如何配合效果更好的情况。例如模型在n_estimators取值为70、100、130时表现很优秀。同样,模型在max_depth取值为4、5、6时表现优秀,那两个参数值如何配合呢?这时就可以使用网格搜索了。针对sklearn中乳腺癌的例子进行针对n_estimators和max_depth的网格搜索。随机网格实现:#引入网格搜索fromsklearn.model_selectionimportGridSearchCV#建立随机森林模型fromsklearn.ensembleimportRandomForestClassifierclf=RandomForestClassifier()9.3.4网格搜索网格搜索的实现(续)#指定代搜索参数和选值范围parameters={'max_depth':[4,5,6],'n_estimators':[70,100,130]}#设定网格搜索目标,通过十折交叉验证,在parameters的参数范围内,寻找对模型实例clf最好的结果GS=GridSearchCV(clf,parameters,cv=10)GS.fit(X,Y)#显示最好的参数组合和对应的模型准确率print("模型最高准确率时参数组合为:{0}".format(GS.best_params_))print("模型最高准确率:{0}".format(GS.best_score_))9.4课后习题9.4课后习题1.简述信息熵、信息增益、信息增益率、基尼系数的概念2.使用决策树模型,针对乳腺癌数据集建模,并通过调参使其表现更优3.简述随机森林的工作原理第10章SVM与XGBoost本章内容10.1SVM10.2XGBoost10.3课后习题10.1SVM10.1.1SVM的基本概念SVM名为支持向量机算法。它的工作原理很简单,假设有一个二维特征数据集,数据分为两类,一类是红色,一类是蓝色,将这个数据集映射在二维坐标系上,如左下图所示。如何将这两类进行区分呢?可以找到一条线,将数据集一分为二,左上角都是红色点,右下角都是蓝色点,再有其他数据进行预测时,就看这个点是落在分割线的什么位置,如果在左上,就属于红色点,在右下就属于蓝色点。10.1.1SVM的基本概念——最优超平面中间的这条分割线被称为最优超平面,为什么叫超平面呢?是因为当数据集中的维度大于2时,用于分割数据集的就不是一条线了,而是一个高维平面。如右图所示,中间的分割平面就是3维数据的最优超平面。可见图左图中的分割线是最优超平面的特例。为了便于理解,我们仍然以左图所示的二维数据为例,介绍SVM的基本概念。10.1.1SVM的基本概念——最优超平面与支持向量何为“最优”呢?仔细观察并思考,不难想象左图中能将两种点进行分割的线段很多,只要在红蓝两堆节点之间的线都可以将两类数据进行区分。可是哪个分割线才是最优呢?在保证超平面方向不变且不会出现错分样本的情况下移动超平面,会在原来的超平面两侧找到两个极限位置,通过这些极限位置画两条平行虚线。虚线的位置由超平面的方向和距离原超平面最近的几个样本的位置决定,两条虚线之间的垂直距离就是这个超平面对应的分类间隔,不同的超平面的分类间隔通常是不同的,那具有“最大间隔”的两条平行虚线正中间的分界线就是SVM要寻找的最优超平面。两条虚线所穿过的样本点,就是SVM中的支持样本点,称为“支持向量”。10.1.2SVM的损失函数现有训练样本集(xij,yij),其中i表示样本编号,j表示特征维度,xi表示样本i的特征向量,yi是标签(取值范围只有-1和1两种情况,表示两种类别)。如图左图所示为二维特征特例,即将二维特征映射到平面坐标系里,其中一维特征作为横坐标,另一维作为纵坐标。则最优超平面可以表示为:xi1=axi2+b。即:axi2-xi1+b=0。设w=(a,-1),xi=(xi2,xi1),则超平面可以表达为wxi+b=0,其中x是各个维度的特征向量。在有了最优超平面之后,如果有一个待遇测点xt,将其代入最优超平面公式,w·xt+b=t,可以根据t的符号判断xt属于哪一类。wxi+b=010.1.2SVM的损失函数在最优超平面上任取两点xa和xb,则有
wxa+b=0
wxb+b=0二者相减则可以得到
w(xa-xb)=0前面提到x是各个维度的特征向量,点积为0,说明w和xa-xb是垂直的。因为xa和xb是在最优超平面上的点,所以二者相减之后的直线仍然是沿着最优超平面的,所以w应该是和最优超平面垂直的。xaxb10.1.2SVM的损失函数任意一个蓝色的点xp代入最优超平面表达式有:
w·xp+b
=
p同样,任意一个红色点xa代入最优超平面表达式有:
w·xr+b
=
r我们可以知道xp和xr是最优超平面右下和左上的点,所以p和r一定不是同一符号。(前文介绍过:如果有一个待遇测点xt,将其代入最优超平面公式,w·xt+b=t,可以根据t的符号判断xt属于哪一类)p和r的符号怎么确定呢?我们知道xp点位于最优超平面的下方,是w·x+b=0向右下平移,也就是在截距b上减去一个正数得到的,即w·xp+b-k=0(k>0),因此有w·xp+b=k(k>0),同理对于xr点,w·xr+b+k=0(k>0),因此有w·xp+b=-k(k>0)。所以我们知道当w·xt+b=t且t大于0时,xt属于最优超平面右下方的蓝色类型,如t小于0时,xt属于最优超平面左上方的红色类型。xpxr10.1.2SVM的损失函数
可是,我们在各种材料中看到的SVM判断依据是
如xt位于最优超平面之上,则有w·xr+b>1;
如xt位于最优超平面之下,则有w·xr+b<-1
符号正好与前页结论相反,且比较标准是1和-1,这是为什么呢?仍假设有某个蓝色点xp,有w·xp+b-k=0(k>0),则w·xp+b=k,此时两边同时除以-k,则有w·xp/(-k)+b/(-k)=k/(-k),此时规定w/(-k)为新的w,b/(-k)为新的-b,则有w·xp+b=-1,这样符号就转过来了。k是多少呢?K是间距的一半,也就是支持向量到最优超平面的距离。xpxr2d10.1.2SVM的损失函数xpxr2d换句话说,我们规定:
(1)对于最优超平面上方的支持向量xr,则有w·xr+b=1,如有点xt使得w·xt+b≥1则xt属于最优超平面上面的类别;
(2)对于最优超平面下方的支持向量xp,则有w·xp+b=-1,如有点xt使得w·xt+b≤-1则xt属于最优超平面下面的类别;对于最优超平面上下的支持向量xr、xp有w·(xr-xp)=2·(xr-xp)w线性代数中一个向量除以自身的模长就可以得到向量方向上的单位向量,因此
就是w方向上的单位向量,(xr-xp)得到r点和p点之间的向量,因此.(xr-xp)得到的就是r点和p点之间的向量在w方向上的投影。10.1.2SVM的损失函数不难看出,··(xr-xp)也就是两倍的边距。前面介绍过,SVM的中心目标就是找到边距最大的超平面,即最优超平面,所以我们的目标就是找到
·(xr-xp)的最大值,又因为w·(xr-xp)=2所以
·(xr-xp)=因此SVM的中心目标就是找到
的最大值,也就是找到的最小值。又因为||w||本身是一个开方数,所以将求的
最小值修改为求
的最小值因此
就是SVM的损失函数。xpxr2dw10.1.3拉格朗日对偶函数详见以下附件推导过程10.1.4核函数很多数据不是线性可分的,如下左图所示,这些数据呈现环形,无法找到一个最优超平面将它们分成两部分。当数据无法线性可分,SVM对将原本在低维空间线性不可分的数据映射到高维空间,即将下左图经过一系列转化变成下右图,在高维空间中使其成为线性可分数据,最后寻找最大间隔分类超平面对数据进行划分。10.1.4核函数由于从原低维空间到新高维空间的映射计算会使得维度发生爆炸似地增长,这给映射过程中的计算带来了很大地困难,因此SVM引入了核函数,因为虽然也是将特征进行从低维到高维的转换,但核函数事先在低维上进行计算,将实质上的分类效果表现在了高维上,避免了直接在高维空间中的复杂计算。核函数有二十余种,但常用的只有四种:10.1.4核函数一般情况,线性核函数在线性可分数据中表现非常好,但在非线性可分数据中表现糟糕;高斯径向基核函数(简称RBF)在非线性可分核函数中表现非常好,在线性可分数据中表现也不错。因此实战时先选线性核函数,判断数据集是否线性可分,如果非线性可分就使用高斯径向基核函数。10.1.5软间隔如左图所示数据集,总体看是线性可分的,但是有极个别的蓝色点位于红色点内,也有极个别红色点位于蓝色点内。但为了这些许的异常点使用核函数升维,从而降低SVM整体运算速度又得不偿失。10.1.5软间隔为了处理这种数据,SVM引入了软件隔概念。原损失函数最优解问题变为:
其中i是各个异常点(“乱入”另一类的点)的编号,ε是异常点到最优超平面的距离,这就相当于在原有损失函数基础之上,增加考虑了异常点的“惩罚项”,C是惩罚项的重要程度,是一个超参数,其中默认值是1,C越大,惩罚力度越大,即异常点被考虑得越多,实际分错的点越少,模型越复杂;C越小,惩罚力度越小,异常点被考虑得越少,模型越简单。10.1.6SVM代码实现#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#X为原始数据中不包括target列部分,是由历史数据中“非结果列”组成的数据X=df.loc[:,(df.columns!='target')]#Y为原始数据中target列部分,是由历史数据中“结果列”组成的数据Y=df.loc[:,df.columns=='target']10.1.6SVM代码实现#第二步:数据预处理#缺失值处理df.dropna()#数据标准化fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler()X=scaler.fit_transform(X)#其他数据预处理将在第6次课介绍10.1.6SVM代码实现#第三步,建模#将历史数据按照8:2的比例分随机分为训练集和测试集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)#导入SVM工具包fromsklearn.svmimportSVC#创建模型clf=SVC()#训练模型clf.fit(Xtrain,Ytrain)10.1.6SVM代码实现#第四步,用测试集检验模型预测效果#使用predict方法,根据Xtest预测测试集的结果result=clf.predict(Xtest)#将测试集真实结果和预测结果进行对比df=pd.DataFrame({'真实结果':Ytest.loc[:,'target'],'预测结果':pd.Series(result,index=Ytest.index)})print(df)10.1.6SVM代码实现#第四步,用测试集检验模型预测效果#可以使用一些指标来评价模型表现,例如使用R2值评价多元线性回归score=clf.score(Xtest,Ytest)print(score)#其他指标(混淆矩阵、recall、AUC值等)与逻辑回归中的实现方法完全一致,不再赘述10.1.7SVM主要参数kernel,内容为字符串,意为SVM使用何种核函数,例如rbf是指高斯径向基核函数;gamma,内容是浮点数,意为高斯径向基核函数公式中的γ;C,内容是浮点数,意为软件隔“惩罚项”的重要程度。10.2XGBoost10.2.1XGBoost的基本思路XGBoost就是典型的Boosting类算法,它的汉语名称为“极端梯度提升”,Boosting顾名思义就是“步步提升”,第二个基分类器针对第一个基分类器的结果进行改进,第三个基分类器针对第二个基分类器的结果进行改进,以此类推,预测结果越来越好。XGBoost,是在传统GBDT(梯度提升算法)基础之上进行了改进,通过正则化避免过拟合、可以处理稀疏矩阵、并且通过并行优化提升了模型的性能。一句话——好!!^_^XGBoost可以通过sklearn导入,也可以通过xgboost库单独导入(xgboost库独立与sklearn,由华裔学者陈天奇团队开发,使用是在anaconda的prompt中通过pipinstallxgboost进行安装)10.2.1XGBoost的基本思路——构建过程详见以下附件10.2.2XGBoost实现回归#XGBoost回归的实现与其他回归模型基本一样,只是导入工具包和建模不同fromxgboostimportXGBRegressorasXGBRreg=XGBR()10.2.3XGBoost实现分类#XGBoost分类的实现与其他分类模型基本一样,只是导入工具包和建模不同fromxgboostimportXGBClassifierasXGBCclf=XGBC()10.2.4XGBoost的重要参数n_estimators:内容为整数,XGBoost要建立的树数。max_depth:内容为整数,XGBoost中树的最大深度----------------------------------------------------------------------------------------------------eta:内容为0-1的浮点数,附件第1页公式(1)中的ηgamma:内容是0至+∞的浮点数,附件第2页公式(2)中的γlambda:内容是0至+∞的浮点数,附件第2页公式(2)中的λalpha:内容是0至+∞的浮点数,附件第2页公式(2)中如果使用L1正则化时设置该值,默认值是0,即不使用L1正则化。10.3
课后习题10.3课后习题1.重新推导SVM损失函数。2.使用学习曲线+交叉验证,对于SVM的C参数进行调参3.使用学习曲线+交叉验证+网格搜索方法,对于XGBoost中的n_estimators、max_depth、eta参数进行联合调参。第11章
聚类与关联本章主要内容11.1无监督学习11.2聚类算法11.3模型的保存和导入11.4关联算法11.5课后习题11.1
无监督学习有监督学习与无监督学习前面介绍了逻辑回归、决策树、随机森林、SVM和XGBoost等分类算法。聚类算法和分类算法一样,都是把对象集合分成不同的类,但分类算法面向的是有监督学习,而聚类面向的是无监督学习。什么是有监督学习呢?就在训练模型过程中,历史数据中的标签是有结果的,如乳腺癌历史数据中,样本是否是恶性的是明确的,换言之,模型在训练的时候,既需要历史数据中的数据部分X,也需要历史数据中的结论部分y。而无监督学习中,历史数据中没有明确的标签,模型是根据某些指标自行去挖掘样本的规律,完成分类。聚类就是典型的无监督学习,其目的是将数据划分成有意义或有用的组(聚类中的“类”一般被称为“簇”)。例如很多企业会对客户进行分类,但之前没有成型的历史数据,无法使用分类算法进行监督学习,那就只好使用聚类。11.2
聚类算法10.2.1K-MeansK-Means是最常用的聚类算法之一,它的计算依据是节点之间的距离。首先将样本按照各个特征值映射为某个空间的点,例如样本有两个特征值,就可以把样本映射到二维坐标上的点;如果样本有三个特征,就可以把样本映射到三维空间上的点,以此类推。10.2.1K-Means假设要将所有样本聚成K簇,则按照如下步骤进行:步骤一:在所有样本中随机选出K个点,作为簇心(又称为“质心”);步骤二:将其他每个样本点分配到离他们最近簇心点的簇,生成了K个簇;步骤三:在每个簇内,计算所有被分到这个簇样本点的各特征平均值作为新的簇心;步骤四:重复步骤二、步骤三,直到达到某个中止条件(如达到迭代次数,或簇心不再变化,或簇心变化带来的节点与簇心之间的距离变化量小于某个阈值等)。10.2.1K-Means其中x表示簇中的某个样本点的特征向量,i表示特征列号,n表示每个样本点中的特征数目,μ为当前簇心的特征向量。聚类时所有样本点到质心的距离之和越小,我们就认为这个簇中的样本越相似,簇内差异就越小,分簇效果越好。10.2.1K-Means#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\ruxian_julei.csv',index_col='Patien')10.2.1K-Means#第二步:数据预处理#缺失值处理df.dropna()#数据标准化fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler()df=scaler.fit_transform(df)#其他数据预处理将在第6次课介绍10.2.1K-Means#导入Kmeans包fromsklearn.clusterimportKMeans#聚3类,随机状态(随机选取初始簇心)为0,迭代300次cluster=KMeans(n_clusters=3,max_iter=300,random_state=0)clu=cluster.fit_predict(df)print(pd.Series(clu))左列是样本编号右列是类别号10.2.1K-Means可以看到,输出结果就是每一个样本聚类之后所属的类别。再次强调,虽然使用的是乳腺癌数据,但与结果恶性与否没有关系,只是单纯的将样本聚类成3簇。上例中聚类为3簇,具体的簇数是如何确定的呢?方法一:业务指定,这是最常见的,例如某家公司要将客户分成3类并发放礼品,这就需要指定簇数是3。方法二:根据指标选择合理的簇数(例如使用学习曲线方法)。但因为训练模型用的历史数据中没有标签列,所以就不会有准确率等指标。那如何判断一个分簇的好坏呢?10.2.1K-Means——聚类的衡量指标:簇内平方和(1)簇内平方和,如下公式所示其中,m为一个簇中样本的个数,j是每个样本的编号。这个公式被称为簇内平方和(clusterSumofSquare),又叫做Inertia。而将一个数据集中的所有簇的簇内平方和相加,就得到了整体平方和(TotalClusterSumofSquare),又叫做totalinertia。TotalInertia越小,代表着每个簇内样本越相似,聚类的效果就越好。可以使用kmeans的inertia_属性查看聚类后的簇内平方和。虽然目标是整体平方和越小越好,但这是指对某一个聚类过程而言的,但对于簇数的选择没有太大帮助。假设有n个节点,如果将它聚成n簇,那整体平方和就是0,从整体平方和指标来看效果最好,但是没有实际意义。10.2.1K-Means——聚类的衡量指标:轮廓系数(2)轮廓系数:轮廓系数是对每个样本来定义的,设样本与其自身所在的簇中的其他样本的相似(相异)度a,等于样本与同一簇中所有其他点之间的平均距离;设样本与其他簇中的样本的相似(相异)度b,等于样本与下一个最近的簇中的所有点之间的平均距离,根据聚类的要求“簇内差异小,簇外差异大”,我们希望b永远大于a,并且大得越多越好。单个样本的轮廓系数如下公式对于一个样本点而言,当它的轮廓系数接近1是说明它与自己所处的簇其他样本很相似,与其他簇样本不相似,这是我们希望的结果;但当一个样本的轮廓系数接近-1时,说明它与自己所处簇的其他样本不相似,与其他簇样本相似,这是聚类很糟糕的效果,即它应该属于其他簇;当轮廓系数为0时,说明它属于哪个簇都可以(从这个样本角度看,自己所处的簇和其他的簇应该是一个簇)将所有样本轮廓系数汇总,就得到了总轮廓系数和平均轮廓系数,我们当然希望这个数越高越好。10.2.1K-Means——聚类的衡量指标:轮廓系数实现#引入轮廓系数计算工具包fromsklearn.metricsimportsilhouette_score#计算整体平均轮廓系数fromsklearn.metricsimportsilhouette_samples#计算每个样本的轮廓系数print("数据集聚类后平均轮廓系数为:")print(silhouette_score(df,clu))print("数据集聚类后每个样本轮廓系数为:")print(silhouette_samples(df,clu))10.2.1K-Means——聚类的衡量指标:卡林斯基-哈拉巴斯指数(3)卡林斯基-哈拉巴斯指数(Calinski_harabaszIndex)轮廓系数的最大缺点是计算起来比较麻烦(因为需要每个样本计算一遍),因此人们又想出了使用矩阵的方式进行计算。卡林斯基-哈拉巴斯指数如下所示。其中N为数据集中的样本量,k为簇的个数,Bk是组间离散矩阵,即不同簇之间的协方差矩阵,Wk是簇内离散矩阵,即一个簇内数据的协方差矩阵,而tr表示矩阵的迹。(一个n×n矩阵A的主对角线上各个元素的总和被称为矩阵A的迹,记为Tr(A))。数据之间的离散程度越高,协方差矩阵的迹就会越大。组内离散程度低,协方差的迹就会越小,Tr(Wk)也就越小,同时,组间离散程度大,协方差的的迹也会越大,Tr(Bk)就越大,这正是我们希望的,因此calinski_harabasz指数越高越好。
10.2.1K-Means——聚类的衡量指标:卡林斯基-哈拉巴斯指数#引入calinski_harabaz指数工具包fromsklearn.metricsimportcalinski_harabasz_score#计算calinski_harabaz指数print("卡林斯基-哈拉巴斯指数为:")print(calinski_harabasz_score(df,clu))10.2.1K-Means——K-Means重要参数n_clusters:簇数max_iter:计算迭代次数random_state:随机找质心的种子10.1.2DBSCAN在弄清楚DBSCAN聚类原理之前,先要搞清楚一些重要概念:(1)核心点:若某个点的密度达到算法设定的阈值(min_samples)则其为核心点。(2)ε邻域的距离阈值:可以理解为一个区域的半径ε(3)直接密度可达:若p点在q点的邻域内,且q是核心点,则称p和q直接密度可达。(4)密度可达:假设有一系列点:a0、a1、…、ak,对任意ai与ai-1是直接密度可达的,则称a0与ak密度可达,这实际上是直接密度可达的“传播”。(5)密度相连:若有某核心点a0,它与点am和点an都是密度可达的,则称点am和点an是密度相连的。(6)边界点:属于某一个类的非核心点,边界点不能发展“下线”了。(7)噪声点:不属于任何一个类簇的点,从任何一个核心点出发都是密度不可达的。10.1.2DBSCAN有了以上概念,DBSCAN的聚类思想就很清楚:由密度可达关系导出的最大密度相连的样本集合,就是聚成的一个簇。假设一个数据集有两个特征列,将它们映射到一个二维空间,如下图所示。如果说K-means是在找到簇心之后,其他样本点向簇心靠拢的话,那么DBSCAN则是样本主动去找同伴10.1.2DBSCAN从A点开始,以A点为圆心画一个圆,规定这个圆的半径(ε)以及圆内最少包含的样本点数(min_samples),如果在圆内有足够多的样本点,那么A点就是一个核心点,以A为圆心画的圆内其他样本点就是A点的直接密度可达点。从A点的直接密度可达点为圆心,重复上面步骤,继续寻找直接密度可达点(也就是与A密度可达的点),直到再没有办法找到新的A点密度可达点(如左图中,B和C就没有办法再找到直接密度可达点,也就没有办法再找A密度可达点,但B和C与A是密度相连的),这时将A点、A所有直接密度可达点、A密度可达点及所有密度相连的点共同组成了一个簇,但N点就不属于这个簇。10.1.2DBSCAN比起K-means,DBSCAN有以下特点:(1)DBSCAN可以处理非凸数据集聚类问题,所谓凸数据集如下图所示(以二维为例),这种图形K-means处理起来比较困难,聚类的结果不是太合理。(2)DBSCAN不需要指定簇数,整个模型只能指定ε和min_samples(只有这两个参数),聚出多少簇则是模型自行计算。10.1.2DBSCAN#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\ruxian_julei.csv',index_col='Patien')10.1.2DBSCAN#第二步:数据预处理#缺失值处理df.dropna()#数据标准化fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler()df=scaler.fit_transform(df)#其他数据预处理将在第6次课介绍10.1.2DBSCAN#引入DBSCAN工具包fromsklearn.clusterimportDBSCAN#指定DBSCAN的ε为0.2、min_samples为3cluster=DBSCAN(eps=0.2,min_samples=3)clu=cluster.fit_predict(df)print(pd.Series(clu)+1)左列是样本编号右列是类别号10.1.2DBSCANfromsklearn.metricsimportsilhouette_scorefromsklearn.metricsimportcalinski_harabasz_scoreprint("数据集聚类后平均轮廓系数为:")print(silhouette_score(df,clu))print("卡林斯基-哈拉巴斯指数为:")print(calinski_harabasz_score(df,clu))11.3
模型的保存和导入保存与调用模型:方法一#导入pickle包importpickle#使用pickle中的dump方法将cluster模型保存为cluster1.dat文件,后面的wb表示以二进制写入pickle.dump(cluster,open(r"E:\cluster1.dat","wb"))#保存成功后,可以在其他地方调用,后面的rb表示以二进制读出my_model=pickle.load(open(r"E:\cluster1.dat","rb"))#导出后的模型使用方法与普通模型一模一样result=my_model.fit_predict(df)print(result)保存与调用模型:方法二#导入joblib包importjoblib#使用joblib中的dump方法将cluster模型保存为cluster1.dat文件,后面的wb表示以二进制写入joblib.dump(cluster,open(r"E:\cluster2.dat","wb"))#保存成功后,可以在其他地方调用,后面的rb表示以二进制读出my_model=joblib.load(open(r"E:\cluster2.dat","rb"))#导出后的模型使用方法与普通模型一模一样result=my_model.fit_predict(df)print(result)11.4
关联算法11.4.1Apriori算法在日常生活中,经常会遇到关联问题,寻找关联规则。所谓关联规则是反映一个事物与其他事物之间的相互依存性和关联性。如果两个或者多个事物之间存在一定的关联关系,那么,其中一个事物就能够通过其他事物预测到。例如沃尔玛超市经典案例:沃尔玛通过对超市一年多的原始交易数据进行详细分析,发现了尿布与啤酒这一神奇组合——跟尿布一起购买最多的商品竟是啤酒。这是因为美国太太们常叮嘱丈夫下班后为小孩买尿布,而丈夫们在买尿布后又随手带回了他们喜欢的啤酒,于是尿布就和啤酒关联在了一起,也就找到了由尿布和啤酒组成的关联规则。计算机是如何发现不同事物之间的关联规则呢?可以使用Apriori算法。要想研究Apriori算法,首先要清楚几个概念:(1)支持度(Support):关联规则X=>Y对事物集T的支持度定义为T中同时包含有事务X和Y的百分比,即support(X=>Y)=P(X∪Y)(2)置信度(Confidence):关联规则X=>Y对事物集T的置信度定义为T中包含有X的事务数中包含Y的百分比,即:confidence(X=>Y)=P(Y|X)11.4.1Apriori算法——实现Apriori算法的实现,需要使用另一个工具库:mlxtend。Anaconda中没有这个库,需要在AnacondaPrompt中pipinstallmlxtend进行安装11.4.1Apriori算法——实现Apriori算法的实现,需要两个环节首先计算频繁项集其次寻找强关联规则#从mlxtend中导入apriori,association_rulesfrommlxtend.frequent_patternsimportapriori,association_rules
#计算频繁项集frequent_item_sets=apriori(data,min_support=0.5,use_colnames=True)print(frequent_item_sets)1#寻找强关联规则2rules=association_rules(frequent_item_sets,metric='confidence',min_threshold=0.7)3print(rules)11.4.2协同过滤算法除了找到事物之间的联系外,关联算法的另一个应用场景是“推荐系统”。例如一些购物APP会根据客户已买的商品推荐“可能喜欢”的商品,或者某些视频APP会根据用户观看视频的历史记录,推荐“可能喜欢”的视频。这些推荐系统又是依据什么原理进行推荐呢?除了前文提到的Apriori算法,比较常用的是协同过滤算法。目前sklearn或mlxtend中并没有协同过滤等算法的工具包。除了自己编写程序外,还可以在GitHub平台寻找合适的代码。GitHub
是全球最大的开源社区之一,它聚集了全球众多的开发者、组织和项目。开发者可以在
GitHub
上搜索、发现和加入自己感兴趣的开源项目代码,也可以贡献自己的代码和技能。目前,GitHub
已经成为是程序员学习和教育的重要平台之一,开发者可以通过阅读这些代码学习新技术和开发方法。同时,GitHub
上也有许多教育资源和课程,如编程实验、教学材料等,使得学习编程更加容易和有趣,可自行研究GitHub。11.5
课后习题11.5课后习题1.请解释有监督学习与无监督学习的区别。2.针对乳腺癌数据集,使用K-means算法根据生理指标对患者进行聚类,并以卡林斯基-哈拉巴斯指数为依据进行调参。3.在GitHub上下载一个协同过滤算法代码,尝试在本地运行。第12章
数据预处理、特征选择与降维本章主要内容12.1数据预处理12.2特征选择12.3降维12.4课后习题12.1数据预处理12.1数据预处理数据无量纲化缺失值处理编码分段特征选择降维12.1.1数据无量纲化什么是数据的无量纲化,例如在医学数据挖掘时“亚油酸”指标的数值都是数千,而“肉豆蔻脑酸”多为百以下甚至十以下的数据。二者在量纲上不同,因此在使用某些模型建模(例如逻辑回归、SVM、Kmeans等涉及数据运算的模型),这两个特征在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026淄博疾控面试题及答案
- 人工智能安全产业人才基地建设典型场景示例
- 感恩教育主题班会(完美)课件
- 网络直播平台负责人年度述职报告
- 护理输血并发症
- 2026年下半年信息系统项目管理师考试真题及答案
- 建筑装饰企业维修工检修维修安全操作规程
- 防溺安全大家知
- 机械加工安全警示教育
- 非金属矿山车工定期维护安全操作规程
- 2026年度全国保密教育线上培训题库(选择+判断)及参考答案
- 妊娠合并地中海贫血的护理查房
- 阿仑膦酸钠临床推广幻灯20090310
- CECA/GC1-2023年建设项目投资估算编审规程
- 铸造企业现场管理类隐患排查治理清单
- NB-T 10593-2021 风电场无人机叶片检测技术规范
- GB/T 35260-2017公共汽车维护技术规范
- GA/T 950-2019防弹材料及产品V50试验方法
- 2023年山西省方山县示范区文化和旅游集团有限公司招聘笔试题库及答案解析
- 中国农业银行现金管理项下委托贷款协议范本-
- 人民医院乔迁开业盛典活动方案
评论
0/150
提交评论