机器学习十大算法与案例实现监督学习1。线性回归2。逻辑回归3。神经网络4。SVM支持向量机5。K邻近6。贝叶斯7。决策树8。集成学习(Adaboost)非监督学习9。降维主成分分析10。聚类分析监督学习1。线性回归 梯度下降一元线性回归importnumpyasnpimportmatplotlib。pyplotasplt载入数据datanp。genfromtxt(data。csv,delimiter,)xdatadata〔:,0〕ydatadata〔:,1〕学习率learningratelr0。0001截距b0斜率k0最大迭代次数epochs50最小二乘法defcomputeerror(b,k,xdata,ydata):totalError0foriinrange(0,len(xdata)):totalError(ydata〔i〕(kxdata〔i〕b))2returntotalErrorfloat(len(xdata))2。0defgradientdescentrunner(xdata,ydata,b,k,lr,epochs):计算总数据量mfloat(len(xdata))循环epochs次foriinrange(epochs):bgrad0kgrad0计算梯度的总和再求平均forjinrange(0,len(xdata)):bgrad(1m)(((kxdata〔j〕)b)ydata〔j〕)kgrad(1m)xdata〔j〕(((kxdata〔j〕)b)ydata〔j〕)更新b和kbb(lrbgrad)kk(lrkgrad)returnb,kprint(Startingb{0},k{1},error{2}。format(b,k,computeerror(b,k,xdata,ydata)))print(Running。。。)b,kgradientdescentrunner(xdata,ydata,b,k,lr,epochs)print(After{0}iterationsb{1},k{2},error{3}。format(epochs,b,k,computeerror(b,k,xdata,ydata)))画图plt。plot(xdata,ydata,b。)plt。plot(xdata,kxdatab,r)plt。show() 梯度下降法多元线性回归importnumpyasnpfromnumpyimportgenfromtxtimportmatplotlib。pyplotaspltfrommpltoolkits。mplot3dimportAxes3D读入数据datagenfromtxt(rDelivery。csv,delimiter,)切分数据xdatadata〔:,:1〕ydatadata〔:,1〕学习率learningratelr0。0001参数theta00theta10theta20最大迭代次数epochs1000最小二乘法defcomputeerror(theta0,theta1,theta2,xdata,ydata):totalError0foriinrange(0,len(xdata)):totalError(ydata〔i〕(theta1xdata〔i,0〕theta2xdata〔i,1〕theta0))2returntotalErrorfloat(len(xdata))defgradientdescentrunner(xdata,ydata,theta0,theta1,theta2,lr,epochs):计算总数据量mfloat(len(xdata))循环epochs次foriinrange(epochs):theta0grad0theta1grad0theta2grad0计算梯度的总和再求平均forjinrange(0,len(xdata)):theta0grad(1m)((theta1xdata〔j,0〕theta2xdata〔j,1〕theta0)ydata〔j〕)theta1grad(1m)xdata〔j,0〕((theta1xdata〔j,0〕theta2xdata〔j,1〕theta0)ydata〔j〕)theta2grad(1m)xdata〔j,1〕((theta1xdata〔j,0〕theta2xdata〔j,1〕theta0)ydata〔j〕)更新b和ktheta0theta0(lrtheta0grad)theta1theta1(lrtheta1grad)theta2theta2(lrtheta2grad)returntheta0,theta1,theta2print(Startingtheta0{0},theta1{1},theta2{2},error{3}。format(theta0,theta1,theta2,computeerror(theta0,theta1,theta2,xdata,ydata)))print(Running。。。)theta0,theta1,theta2gradientdescentrunner(xdata,ydata,theta0,theta1,theta2,lr,epochs)print(After{0}iterationstheta0{1},theta1{2},theta2{3},error{4}。format(epochs,theta0,theta1,theta2,computeerror(theta0,theta1,theta2,xdata,ydata)))axplt。figure()。addsubplot(111,projection3d)ax。scatter(xdata〔:,0〕,xdata〔:,1〕,ydata,cr,markero,s100)点为红色三角形x0xdata〔:,0〕x1xdata〔:,1〕生成网格矩阵x0,x1np。meshgrid(x0,x1)ztheta0x0theta1x1theta2画3D图ax。plotsurface(x0,x1,z)设置坐标轴ax。setxlabel(Miles)ax。setylabel(NumofDeliveries)ax。setzlabel(Time)显示图像plt。show() 2。逻辑回归 逻辑回归原理与推导 梯度下降法逻辑回归importmatplotlib。pyplotaspltimportnumpyasnpfromsklearn。metricsimportclassificationreportfromsklearnimportpreprocessing数据是否需要标准化scaleTrue载入数据datanp。genfromtxt(LRtestSet。csv,delimiter,)xdatadata〔:,:1〕ydatadata〔:,1〕defplot():x0〔〕x1〔〕y0〔〕y1〔〕切分不同类别的数据foriinrange(len(xdata)):ifydata〔i〕0:x0。append(xdata〔i,0〕)y0。append(xdata〔i,1〕)else:x1。append(xdata〔i,0〕)y1。append(xdata〔i,1〕)画图scatter0plt。scatter(x0,y0,cb,markero)scatter1plt。scatter(x1,y1,cr,markerx)画图例plt。legend(handles〔scatter0,scatter1〕,labels〔label0,label1〕,locbest)plot()查看数据plt。show() 数据处理,添加偏置项xdatadata〔:,:1〕ydatadata〔:,1,np。newaxis〕print(np。mat(xdata)。shape)print(np。mat(ydata)。shape)给样本添加偏置项Xdatanp。concatenate((np。ones((100,1)),xdata),axis1)defsigmoid(x):return1。0(1np。exp(x))defcost(xMat,yMat,ws):leftnp。multiply(yMat,np。log(sigmoid(xMatws)))rightnp。multiply(1yMat,np。log(1sigmoid(xMatws)))returnnp。sum(leftright)(len(xMat))defgradAscent(xArr,yArr):ifscaleTrue:xArrpreprocessing。scale(xArr)xMatnp。mat(xArr)yMatnp。mat(yArr)lr0。001epochs10000costList〔〕计算数据行列数行代表数据个数,列代表权值个数m,nnp。shape(xMat)初始化权值wsnp。mat(np。ones((n,1)))foriinrange(epochs1):xMat和weights矩阵相乘hsigmoid(xMatws)计算误差wsgradxMat。T(hyMat)mwswslrwsgradifi500:costList。append(cost(xMat,yMat,ws))returnws,costList训练模型,得到权值和cost值的变化ws,costListgradAscent(Xdata,ydata)print(ws)ifscaleFalse:画图决策边界plot()xtest〔〔4〕,〔3〕〕ytest(ws〔0〕xtestws〔1〕)ws〔2〕plt。plot(xtest,ytest,k)plt。show()画图loss值的变化xnp。linspace(0,10000,201)plt。plot(x,costList,cr)plt。title(Train)plt。xlabel(Epochs)plt。ylabel(Cost)plt。show() 预测defpredict(xdata,ws):ifscaleTrue:xdatapreprocessing。scale(xdata)xMatnp。mat(xdata)wsnp。mat(ws)return〔1ifx0。5else0forxinsigmoid(xMatws)〕predictionspredict(Xdata,ws)print(classificationreport(ydata,predictions)) 梯度下降法非线性逻辑回归importmatplotlib。pyplotaspltimportnumpyasnpfromsklearn。metricsimportclassificationreportfromsklearnimportpreprocessingfromsklearn。preprocessingimportPolynomialFeatures数据是否需要标准化scaleFalse载入数据datanp。genfromtxt(LRtestSet2。txt,delimiter,)xdatadata〔:,:1〕ydatadata〔:,1,np。newaxis〕defplot():x0〔〕x1〔〕y0〔〕y1〔〕切分不同类别的数据foriinrange(len(xdata)):ifydata〔i〕0:x0。append(xdata〔i,0〕)y0。append(xdata〔i,1〕)else:x1。append(xdata〔i,0〕)y1。append(xdata〔i,1〕)画图scatter0plt。scatter(x0,y0,cb,markero)scatter1plt。scatter(x1,y1,cr,markerx)画图例plt。legend(handles〔scatter0,scatter1〕,labels〔label0,label1〕,locbest)plot()plt。show() 定义多项式回归,degree的值可以调节多项式的特征polyregPolynomialFeatures(degree3)特征处理xpolypolyreg。fittransform(xdata)defsigmoid(x):return1。0(1np。exp(x))defcost(xMat,yMat,ws):leftnp。multiply(yMat,np。log(sigmoid(xMatws)))rightnp。multiply(1yMat,np。log(1sigmoid(xMatws)))returnnp。sum(leftright)(len(xMat))defgradAscent(xArr,yArr):ifscaleTrue:xArrpreprocessing。scale(xArr)xMatnp。mat(xArr)yMatnp。mat(yArr)lr0。03epochs50000costList〔〕计算数据列数,有几列就有几个权值m,nnp。shape(xMat)初始化权值wsnp。mat(np。ones((n,1)))foriinrange(epochs1):xMat和weights矩阵相乘hsigmoid(xMatws)计算误差wsgradxMat。T(hyMat)mwswslrwsgradifi500:costList。append(cost(xMat,yMat,ws))returnws,costList训练模型,得到权值和cost值的变化ws,costListgradAscent(xpoly,ydata)print(ws)获取数据值所在的范围xmin,xmaxxdata〔:,0〕。min()1,xdata〔:,0〕。max()1ymin,ymaxxdata〔:,1〕。min()1,xdata〔:,1〕。max()1生成网格矩阵xx,yynp。meshgrid(np。arange(xmin,xmax,0。02),np。arange(ymin,ymax,0。02))np。r按row来组合array,np。c按colunm来组合arrayanp。array(〔1,2,3〕)bnp。array(〔5,2,5〕)np。r〔a,b〕array(〔1,2,3,5,2,5〕)np。c〔a,b〕array(〔〔1,5〕,〔2,2〕,〔3,5〕〕)np。c〔a,〔0,0,0〕,b〕array(〔〔1,0,5〕,〔2,0,2〕,〔3,0,5〕〕)zsigmoid(polyreg。fittransform(np。c〔xx。ravel(),yy。ravel()〕)。dot(np。array(ws)))ravel与flatten类似,多维数据转一维。flatten不会改变原始数据,ravel会改变原始数据foriinrange(len(z)):ifz〔i〕0。5:z〔i〕1else:z〔i〕0zz。reshape(xx。shape)等高线图csplt。contourf(xx,yy,z)plot()plt。show() 预测defpredict(xdata,ws):ifscaleTrue:xdatapreprocessing。scale(xdata)xMatnp。mat(xdata)wsnp。mat(ws)return〔1ifx0。5else0forxinsigmoid(xMatws)〕predictionspredict(xpoly,ws)print(classificationreport(ydata,predictions)) 3。神经网络 神经网络4。SVM支持向量机 SVM非线性importmatplotlib。pyplotaspltimportnumpyasnpfromsklearn。metricsimportclassificationreportfromsklearnimportsvm载入数据datanp。genfromtxt(LRtestSet2。txt,delimiter,)xdatadata〔:,:1〕ydatadata〔:,1〕defplot():x0〔〕x1〔〕y0〔〕y1〔〕切分不同类别的数据foriinrange(len(xdata)):ifydata〔i〕0:x0。append(xdata〔i,0〕)y0。append(xdata〔i,1〕)else:x1。append(xdata〔i,0〕)y1。append(xdata〔i,1〕)画图scatter0plt。scatter(x0,y0,cb,markero)scatter1plt。scatter(x1,y1,cr,markerx)画图例plt。legend(handles〔scatter0,scatter1〕,labels〔label0,label1〕,locbest)plot()plt。show()fitthemodelC和gammamodelsvm。SVC(kernelrbf)model。fit(xdata,ydata)model。score(xdata,ydata)获取数据值所在的范围xmin,xmaxxdata〔:,0〕。min()1,xdata〔:,0〕。max()1ymin,ymaxxdata〔:,1〕。min()1,xdata〔:,1〕。max()1生成网格矩阵xx,yynp。meshgrid(np。arange(xmin,xmax,0。02),np。arange(ymin,ymax,0。02))zmodel。predict(np。c〔xx。ravel(),yy。ravel()〕)ravel与flatten类似,多维数据转一维。flatten不会改变原始数据,ravel会改变原始数据zz。reshape(xx。shape)等高线图csplt。contourf(xx,yy,z)plot()plt。show() 5。K邻近 主要过程 导入算法包以及数据集importnumpyasnpfromsklearnimportdatasetsfromsklearn。modelselectionimporttraintestsplitfromtqdm。notebookimporttqdmfromsklearn。metricsimportclassificationreport,confusionmatriximportoperatorimportrandomdefknn(xtest,xdata,ydata,k):计算样本数量xdatasizexdata。shape〔0〕复制xtestnp。tile(xtest,(xdatasize,1))计算xtest与每一个样本的差值diffMatnp。tile(xtest,(xdatasize,1))xdata计算差值的平方sqDiffMatdiffMat2求和sqDistancessqDiffMat。sum(axis1)开方distancessqDistances0。5从小到大排序sortedDistancesdistances。argsort()classCount{}foriinrange(k):获取标签votelabelydata〔sortedDistances〔i〕〕统计标签数量classCount〔votelabel〕classCount。get(votelabel,0)1根据operator。itemgetter(1)第1个值对classCount排序,然后再取倒序sortedClassCountsorted(classCount。items(),keyoperator。itemgetter(1),reverseTrue)获取数量最多的标签returnsortedClassCount〔0〕〔0〕载入数据irisdatasets。loadiris()打乱数据datasizeiris。data。shape〔0〕index〔iforiinrange(datasize)〕random。shuffle(index)iris。datairis。data〔index〕iris。targetiris。target〔index〕切分数据集testsize40xtrainiris。data〔testsize:〕xtestiris。data〔:testsize〕ytrainiris。target〔testsize:〕ytestiris。target〔:testsize〕分类predictions〔〕foriintqdm(range(xtest。shape〔0〕)):predictions。append(knn(xtest〔i〕,xtrain,ytrain,5))评估targetnames〔class0,class1,class2〕print(classificationreport(ytest,predictions,targetnamestargetnames)) 6。贝叶斯 设每个数据样本用一个n维特征向量来描述n个属性的值,即:X{x1,x2,,xn},假定有m个类,分别用C1,C2,,Cm表示。给定一个未知的数据样本X(即没有类标号),若朴素贝叶斯分类法将未知的样本X分配给类Ci,则一定是 P(CiX)P(CjX)1jm,jifromsklearn。naivebayesimportGaussianNBfromsklearn。modelselectionimporttraintestsplitfromsklearn。metricsimportaccuracyscorefromsklearn。preprocessingimportLabelEncoderimportpandasaspdfromnumpyimportimportoperator计算高斯分布密度函数的值defcalculategaussianprobability(mean,var,x):coeff(1。0(math。sqrt((2。0math。pi)var)))exponentmath。exp((math。pow(xmean,2)(2var)))ccoeffexponentreturnc计算均值defaveragenum(num):nsum0foriinrange(len(num)):nsumnum〔i〕returnnsumlen(num)计算方差defvar(list,avg):var10foriinlist:var1float((iavg)2)var2(math。sqrt(var1(len(list)1。0)))returnvar2朴素贝叶斯分类模型defNaivebeys(splitData,classset,test):classify〔〕forsinrange(len(test)):c{}foriinclassset:splitdatasplitData〔i〕numlen(splitdata)munum2characterlen(splitdata〔0〕)1具体数据集,个数有变classp〔〕forjinrange(character):zi1ifisinstance(splitdata〔0〕〔j〕,(int,float)):numlist〔example〔j〕forexampleinsplitdata〕Meanaveragenum(numlist)Varvar(numlist,Mean)acalculategaussianprobability(Mean,Var,test〔s〕〔j〕)else:forlinrange(num):iftest〔s〕〔j〕splitdata〔l〕〔j〕:zi1azimuclassp。append(a)zhi1forkinrange(character):zhiclassp〔k〕c。setdefault(i,zhi)sortasorted(c。items(),keyoperator。itemgetter(1),reverseTrue)classify。append(sorta〔0〕〔0〕)returnclassify评估defaccuracy(y,ypred):yarrarray(y)ypredarrarray(ypred)yarryarr。reshape(yarr。shape〔0〕,1)ypredarrypredarr。reshape(ypredarr。shape〔0〕,1)returnsum(yarrypredarr)len(yarr)数据处理defsplitDataset(dataSet):按照属性把数据划分classList〔example〔1〕forexampleindataSet〕classSetset(classList)splitDir{}foriinclassSet:forjinrange(len(dataSet)):ifdataSet〔j〕〔1〕i:splitDir。setdefault(i,〔〕)。append(dataSet〔j〕)returnsplitDir,classSetopen(test。txt)dfpd。readcsv(test。txt)classleLabelEncoder()dataSetdf。values〔:,:〕datasettrain,datasettesttraintestsplit(dataSet,testsize0。1)splitDatasettrain,classSettrainsplitDataset(datasettrain)classSettest〔example〔1〕forexampleindatasettest〕ypredNaivebeys(splitDatasettrain,classSettrain,datasettest)accuaccuracy(classSettest,ypred)print(Accuracy:,accu) Accuracy:0。65 7。决策树 决策树的分类模型是树状结构,简单直观,比较符合人类的理解方式。决策树分类器的构造不需要任何领域知识和参数设置,适合于探索式知识的发现。由于决策树分类步骤简单快速,而且一般来说具有较高的准确率,因此得到了较多的使用。 数据集介绍 本实验采用西瓜数据集,根据西瓜的几种属性判断西瓜是否是好瓜。数据集包含17条记录,数据格式如下: 实验 首先我们引入必要的库:importpandasaspdfrommathimportlog2frompylabimportimportmatplotlib。pyplotasplt 导入数据 读取csv文件中的数据记录并转为列表defloaddataset():数据集文件所在位置path。西瓜。csvdatapd。readcsv(path,header0)dataset〔〕foraindata。values:dataset。append(list(a))返回数据列表attributelist(data。keys())返回数据集和每个维度的名称returndataset,attributedataset,attributeloaddataset()attribute,dataset(〔色泽,根蒂,敲声,纹理,脐部,触感,好瓜〕,〔〔青绿,蜷缩,浊响,清晰,凹陷,硬滑,是〕,〔乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是〕,〔乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是〕,〔青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是〕,〔浅白,蜷缩,浊响,清晰,凹陷,硬滑,是〕,〔青绿,稍蜷,浊响,清晰,稍凹,软粘,是〕,〔乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是〕,〔乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是〕,〔乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否〕,〔青绿,硬挺,清脆,清晰,平坦,软粘,否〕,〔浅白,硬挺,清脆,模糊,平坦,硬滑,否〕,〔浅白,蜷缩,浊响,模糊,平坦,软粘,否〕,〔青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否〕,〔浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否〕,〔乌黑,稍蜷,浊响,清晰,稍凹,软粘,否〕,〔浅白,蜷缩,浊响,模糊,平坦,硬滑,否〕,〔青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否〕〕) 计算信息熵defcalculateinfoentropy(dataset):记录样本数量nlen(dataset)记录分类属性数量attributecount{}遍历所有实例,统计类别出现频次forattributeindataset:每一个实例最后一列为类别属性,因此取最后一列classattributeattribute〔1〕如果当前类标号不在labelcount中,则加入该类标号ifclassattributenotinattributecount。keys():attributecount〔classattribute〕0类标号出现次数加1attributecount〔classattribute〕1infoentropy0forclassattributeinattributecount:计算该类在实例中出现的概率pfloat(attributecount〔classattribute〕)ninfoentropyplog2(p)returninfoentropy 数据集划分defsplitdataset(dataset,i,value):splitset〔〕forattributeindataset:ifattribute〔i〕value:删除该维属性reduceattributeattribute〔:i〕reduceattribute。extend(attribute〔i1:〕)splitset。append(reduceattribute)returnsplitset 计算属性划分数据集的熵defcalculateattributeentropy(dataset,i,values):attributeentropy0forvalueinvalues:subdatasetsplitdataset(dataset,i,value)plen(subdataset)float(len(dataset))attributeentropypcalculateinfoentropy(subdataset)returnattributeentropy 计算信息增益defcalculateinfogain(dataset,infoentropy,i):第i维特征列表attribute〔example〔i〕forexampleindataset〕转为不重复元素的集合valuesset(attribute)attributeentropycalculateattributeentropy(dataset,i,values)infogaininfoentropyattributeentropyreturninfogain 根据信息增益进行划分defsplitbyinfogain(dataset):描述属性数量attributenumlen(dataset〔0〕)1整个数据集的信息熵infoentropycalculateinfoentropy(dataset)最高的信息增益maxinfogain0最佳划分维度属性bestattribute1foriinrange(attributenum):infogaincalculateinfogain(dataset,infoentropy,i)if(infogainmaxinfogain):maxinfogaininfogainbestattributeireturnbestattribute 构造决策树defcreatetree(dataset,attribute):类别列表classlist〔example〔1〕forexampleindataset〕统计类别classlist〔0〕的数量ifclasslist。count(classlist〔0〕)len(classlist):当类别相同则停止划分returnclasslist〔0〕最佳划分维度对应的索引bestattributesplitbyinfogain(dataset)最佳划分维度对应的名称bestattributenameattribute〔bestattribute〕tree{bestattributename:{}}del(attribute〔bestattribute〕)查找需要分类的特征子集attributevalues〔example〔bestattribute〕forexampleindataset〕valuesset(attributevalues)forvalueinvalues:subattributeattribute〔:〕tree〔bestattributename〕〔value〕createtree(splitdataset(dataset,bestattribute,value),subattribute)returntreetreecreatetree(dataset,attribute)tree{纹理:{清晰:{根蒂:{蜷缩:是,硬挺:否,稍蜷:{色泽:{青绿:是,乌黑:{触感:{软粘:否,硬滑:是}}}}}},模糊:否,稍糊:{触感:{软粘:是,硬滑:否}}}}定义划分属性节点样式attributenodedict(boxstyleround,color00B0F0)定义分类属性节点样式classnodedict(boxstylecircle,color00F064)定义箭头样式arrowdict(arrowstyle,color000000)计算叶结点数defgetnumleaf(tree):numLeafs0firstStrlist(tree。keys())〔0〕secondDicttree〔firstStr〕forkeyinsecondDict。keys():iftype(secondDict〔key〕)。namedict:numLeafsgetnumleaf(secondDict〔key〕)else:numLeafs1returnnumLeafs计算树的层数defgetdepthtree(tree):maxDepth0firstStrlist(tree。keys())〔0〕secondDicttree〔firstStr〕forkeyinsecondDict。keys():iftype(secondDict〔key〕)。namedict:thisDepth1getdepthtree(secondDict〔key〕)else:thisDepth1ifthisDepthmaxDepth:maxDepththisDepthreturnmaxDepth绘制文本框defplottext(cntrPt,parentPt,txtString):xMid(parentPt〔0〕cntrPt〔0〕)2。0cntrPt〔0〕yMid(parentPt〔1〕cntrPt〔1〕)2。0cntrPt〔1〕createPlot。ax1。text(xMid,yMid,txtString,vacenter,hacenter,rotation30) 绘制树结构defplotTree(tree,parentPt,nodeTxt):numLeafsgetnumleaf(tree)depthgetdepthtree(tree)firstStrlist(tree。keys())〔0〕cntrPt(plotTree。xOff(1。0float(numLeafs))2。0plotTree。totalW,plotTree。yOff)plottext(cntrPt,parentPt,nodeTxt)在父子结点间绘制文本框并填充文本信息plotNode(firstStr,cntrPt,parentPt,attributenode)绘制带箭头的注释secondDicttree〔firstStr〕plotTree。yOffplotTree。yOff1。0plotTree。totalDforkeyinsecondDict。keys():iftype(secondDict〔key〕)。namedict:plotTree(secondDict〔key〕,cntrPt,str(key))else:plotTree。xOffplotTree。xOff1。0plotTree。totalWplotNode(secondDict〔key〕,(plotTree。xOff,plotTree。yOff),cntrPt,classnode)plottext((plotTree。xOff,plotTree。yOff),cntrPt,str(key))plotTree。yOffplotTree。yOff1。0plotTree。totalD绘制箭头defplotNode(nodeTxt,centerPt,parentPt,nodeType):createPlot。ax1。annotate(nodeTxt,xyparentPt,xycoordsaxesfraction,xytextcenterPt,textcoordsaxesfraction,vacenter,hacenter,bboxnodeType,arrowpropsarrow)绘图defcreatePlot(tree):figplt。figure(1,facecolorwhite)fig。clf()axpropsdict(xticks〔〕,yticks〔〕)createPlot。ax1plt。subplot(111,frameonFalse,axprops)plotTree。totalWfloat(getnumleaf(tree))plotTree。totalDfloat(getdepthtree(tree))plotTree。xOff0。5plotTree。totalW;plotTree。yOff1。0;plotTree(tree,(0。5,1。0),)plt。show()指定默认字体mpl。rcParams〔font。sansserif〕〔SimHei〕mpl。rcParams〔axes。unicodeminus〕False绘制决策树createPlot(tree) 8。集成学习(Adaboost) 集成学习(EnsembleLearning),就是使用一系列学习器进行学习,并使用某种规则将各个学习器的结果进行整合,从而获得比单个学习器效果更好的学习效果的一种方法。 集成学习的条件 通过集成学习提高分类器的整体泛化能力有以下两个条件:基分类器之间具有差异性。如果使用的是同一个分类器集成,集成分类器的性能是不会有提升的。每个基分类器的分类精度必须大于0。5。如下图所示,当基分类器精度小于0。5时,随着集成规模的增加,分类集成分类器的分类精度会下降;但是如果基分类器的精度大于0。5时,集成分类器的最终分类精度是趋近于1的。 集成学习的两个关键点:如何构建具有差异性的基分类器如何对基分类器的结果进行整合 构建差异性分类器一般有以下三种方法:通过处理数据集生成差异性分类器通过处理数据特征构建差异性分类器对分类器的处理构建差异性分类器 集成学习常见的三种元算法是Bagging,Boosting和Stacking。Bagging用于提升机器学习算法的稳定性和准确性。Boosting主要用于减少bias(偏差)和variance(方差),是将一个弱分类器转化为强分类器的算法。Stacking是一种组合多个模型的方法。 Boosting与AdaBoost算法的训练 Boosting分类方法,其过程如下所示: 1)先通过对N个训练数据的学习得到第一个弱分类器h1; 2)将h1分错的数据和其他的新数据一起构成一个新的有N个训练数据的样本,通过对这个样本的学习得到第二个弱分类器h2; 3)将h1和h2都分错了的数据加上其他的新数据构成另一个新的有N个训练数据的样本,通过对这个样本的学习得到第三个弱分类器h3; 4)最终经过提升的强分类器hfinalMajorityVote(h1,h2,h3)。即某个数据被分为哪一类要通过h1,h2,h3的多数表决。 上述Boosting算法,存在两个问题: 如何调整训练集,使得在训练集上训练弱分类器得以进行。 如何将训练得到的各个弱分类器联合起来形成强分类器。 针对以上两个问题,AdaBoost算法进行了调整: 使用加权后选取的训练数据代替随机选取的训练数据,这样将训练的焦点集中在比较难分的训练数据上。 将弱分类器联合起来时,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。importnumpyasnpimportmatplotlib。pyplotaspltfromsklearnimporttreefromsklearn。ensembleimportAdaBoostClassifierfromsklearn。treeimportDecisionTreeClassifierfromsklearn。datasetsimportmakegaussianquantilesfromsklearn。metricsimportclassificationreport生成2维正态分布,生成的数据按分位数分为两类,500个样本,2个样本特征x1,y1makegaussianquantiles(nsamples500,nfeatures2,nclasses2)生成2维正态分布,生成的数据按分位数分为两类,400个样本,2个样本特征均值都为3x2,y2makegaussianquantiles(mean(3,3),nsamples500,nfeatures2,nclasses2)将两组数据合成一组数据xdatanp。concatenate((x1,x2))ydatanp。concatenate((y1,y21))plt。scatter(xdata〔:,0〕,xdata〔:,1〕,cydata)plt。show() 决策树模型modeltree。DecisionTreeClassifier(maxdepth3)输入数据建立模型model。fit(xdata,ydata)获取数据值所在的范围xmin,xmaxxdata〔:,0〕。min()1,xdata〔:,0〕。max()1ymin,ymaxxdata〔:,1〕。min()1,xdata〔:,1〕。max()1生成网格矩阵xx,yynp。meshgrid(np。arange(xmin,xmax,0。02),np。arange(ymin,ymax,0。02))zmodel。predict(np。c〔xx。ravel(),yy。ravel()〕)ravel与flatten类似,多维数据转一维。flatten不会改变原始数据,ravel会改变原始数据zz。reshape(xx。shape)等高线图csplt。contourf(xx,yy,z)样本散点图plt。scatter(xdata〔:,0〕,xdata〔:,1〕,cydata)plt。show() 模型准确率model。score(xdata,ydata)0。777AdaBoost模型modelAdaBoostClassifier(DecisionTreeClassifier(maxdepth3),nestimators10)训练模型model。fit(xdata,ydata)获取数据值所在的范围xmin,xmaxxdata〔:,0〕。min()1,xdata〔:,0〕。max()1ymin,ymaxxdata〔:,1〕。min()1,xdata〔:,1〕。max()1生成网格矩阵xx,yynp。meshgrid(np。arange(xmin,xmax,0。02),np。arange(ymin,ymax,0。02))获取预测值zmodel。predict(np。c〔xx。ravel(),yy。ravel()〕)zz。reshape(xx。shape)等高线图csplt。contourf(xx,yy,z)样本散点图plt。scatter(xdata〔:,0〕,xdata〔:,1〕,cydata)plt。show() 模型准确率model。score(xdata,ydata) 0。976 总结一下,组合算法(combineralgorithm)使用所有其他算法的预测作为附加输入(additionalinputs)来训练得到最终的预测结果。理论上可以表示任何一种组合学习方法(ensembletechniques);实际中,单层的逻辑回归模型(singlelayerlogisticregressionmodel)通常被用作组合器(combiner)。 非监督学习 9。降维主成分分析 importnumpyasnpimportmatplotlib。pyplotasplt载入数据datanp。genfromtxt(data。csv,delimiter,)xdatadata〔:,0〕ydatadata〔:,1〕plt。scatter(xdata,ydata)plt。show()print(xdata。shape) 数据中心化defzeroMean(dataMat):按列求平均,即各个特征的平均meanValnp。mean(dataMat,axis0)newDatadataMatmeanValreturnnewData,meanValnewData,meanValzeroMean(data)np。cov用于求协方差矩阵,参数rowvar0说明数据一行代表一个样本covMatnp。cov(newData,rowvar0)协方差矩阵covMatarray(〔〔94。99190951,125。62024804〕,〔125。62024804,277。49520751〕〕)np。linalg。eig求矩阵的特征值和特征向量eigVals,eigVectsnp。linalg。eig(np。mat(covMat))特征值eigValsarray(〔30。97826888,341。50884814〕)特征向量eigVectsmatrix(〔〔0。89098665,0。45402951〕,〔0。45402951,0。89098665〕〕)对特征值从小到大排序eigValIndicenp。argsort(eigVals)eigValIndicearray(〔0,1〕,dtypeint64)top1最大的n个特征值的下标neigValIndiceeigValIndice〔1:(top1):1〕neigValIndicearray(〔1〕,dtypeint64)最大的n个特征值对应的特征向量neigVecteigVects〔:,neigValIndice〕neigVectmatrix(〔〔0。45402951〕,〔0。89098665〕〕)低维特征空间的数据lowDDataMatnewDataneigVectlowDDataMat利用低纬度数据来重构数据reconMat(lowDDataMatneigVect。T)meanValreconMat载入数据datanp。genfromtxt(data。csv,delimiter,)xdatadata〔:,0〕ydatadata〔:,1〕plt。scatter(xdata,ydata)重构的数据xdatanp。array(reconMat)〔:,0〕ydatanp。array(reconMat)〔:,1〕plt。scatter(xdata,ydata,cr)plt。show() 10。聚类分析 续集等下篇文章! 素材来源于网络,若有侵权联系删除!