数据挖掘大作业

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.音乐分类的数据集在这个题目中,使用了SVM分类器和贝叶斯分类器,并通过sklearn库中的GridSearchCV方法对SVM分类模型的参数进行调优,使最终的正确率提高了5个百分点左右。但仍没有文档中的论文达到的分类正确率高,因为论文中的分类器的设计使专一对音乐音调分类的,其中设计到神经网络和深度学习的一些方法。而我使用的分类器使对大部分分类问题都有效的方法。下面是对数据集的一个简单的介绍:数据标签第3-14列:YESorNO第15列:共16个取值('D','G#','D#','Bb','Db','F#','Eb','F','C#','Ab','B','C','A#','A','G','E')第16列:共5个取值(1,2,3,4,5)第17列:共102个类别('C#M','F_m','D_m','D_d7','G#m','D_m6','C_m6','C_d7','F_M','D_M','BbM7','F#d','C#d','E_d','F_d7','F#d7','G_m','C#d7','AbM','EbM','D#d','Bbm6','G_M7','F#m6','Dbd','B_m6','G#M','D_m7','B_M','F#M7','Bbm','A#d','D#d7','Abd','G_M','F#M4','E_M','A_M4','E_m7','D#M','C_M7','A_m6','Dbm','A#d7','F#M','C#m7','F_m7','C_M','C#M4','F_M6','A_M','G_m6','D_M4','F_M7','B_M7','E_M4','E_m6','A_m4','G#d','C_m7','C_M6','Abm','F_m6','G_m7','F_d','Bbd','G_M4','B_d','A_M7','E_m','C#M7','DbM','EbM7','C#d6','F#m','G_M6','G_d','Dbd7','B_m7','DbM7','D_M6','D#d6','G#d7','A_m7','B_d7','B_M4','A_d','A_m','C_d6','D#m','C_M4','A_M6','BbM','C#m','D_M7','E_M7','F_M4','F#m7','Dbm7','B_m','C_m','Ebd')这是一个多分类问题1.1数据读取与训练集和测试集分离从文件读取数据defreadfile(datapath):#type:datapath:数据集的文件路径#rtype:X:数据标签,y:所属类别X,y=[],[]withopen(datapath,'r')asfp:lines=fp.read()forlineinlines.split('\n'):ifline=='':continueXi=[]line=list(map(lambdax:x.lstrip(),line.split(',')))#Xi+=line[:2]#前两列数据没用去除Xi+=list(map(lambdax:1ifx=='YES'else0,line[2:14]))Xi+=[Bass2id.index(line[14])]Xi+=[int(line[15])]X.append(Xi)y.append(class2id.index(line[-1]))#print(list(map(lambdax:x[2:],X)))returnX,y使用sklearn.model_selection库中的train_test_split函数,将训练集随机分成10份,9份训练,1份测试X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1,random_state=randint(0,5000))X是标签列表,y是类别列表1.2使用svm分类参数调优defsvm_cross_validation(train_x,train_y):#寻找模型参数的最优值model=svm.SVC(kernel='rbf',probability=False)param_grid={'kernel':('linear','rbf'),'C':[1,10,5000,7000,10000],'gamma':[10,1,0.1,0.01,0.001,0.0001]}grid_search=GridSearchCV(model,param_grid,n_jobs=8,verbose=1)grid_search.fit(train_x,train_y)best_parameters=grid_search.best_estimator_.get_params()forpara,valinlist(best_parameters.items()):print(para,val)cv_result=pd.DataFrame.from_dict(grid_search.cv_results_)withopen('cv_result.csv','w')asf:cv_result.to_csv(f)returnmodel模型训练与正确率@gettimedefsvmmain(X_train,X_test,y_train,y_test):clf=svm.SVC(C=7000,kernel='rbf',degree=3,gamma=0.01,coef0=1.0,shrinking=False,probability=False,tol=0.001,cache_size=200,class_weight=None,verbose=False,max_iter=-1,random_state=None)clf.fit(X_train,y_train)x1=np.sum(y_test==clf.predict(X_test))x2=np.sum(y_test!=clf.predict(X_test))print('SVM:分类正确%d,分类错误%d,准确率%.2f%%'%(x1,x2,x1*100/(x1+x2)))returnx1*100/(x1+x2)输出结果:1.3使用贝叶斯分类器分类结果:@gettimedefbayesmain(X_train,X_test,y_train,y_test):clf=BernoulliNB(alpha=0.1,binarize=0.2,fit_prior=True,class_prior=None)clf.fit(X_train,y_train)x1=np.sum(y_test==clf.predict(X_test))x2=np.sum(y_test!=clf.predict(X_test))print('贝叶斯:分类正确%d,分类错误%d,准确率%.2f%%'%(x1,x2,x1*100/(x1+x2)))returnx1*100/(x1+x2)在贝叶斯分类器中,使用了伯努利模型对概率。下图是输出结果:其中中用到的gettime装饰器defgettime(func):@functools.wraps(func)defwrapper(*args,**kw):starttime=datetime.datetime.now()res=func(*args,**kw)endtime=datetime.datetime.now()print('运行时间:%.3f秒'%(endtime-starttime).total_seconds())returnresreturnwrapper1.4总结数据集中提到的论文所实现的方法的正确率达到80.06%,它所设计的方法是专门用来对音乐音调进行分类的,其中涉及到了Viterbi方法等。我所采用的是普通的SVM分类器和贝叶斯分类器,这些分类器对大部分分类问题都有一个较客观的正确率。2.银行用户是否有顶起存款的预测在这个分类题目中仍然运用了SVM分类器和贝叶斯分类器,并对数据进行了可视化操作。因此在这一小节主要介绍数据的可视化。下面是对数据集的一个简单的介绍:标签年龄,工作,婚姻,教育,信用卡,余额,房子,贷款,联系方式,日,月,持续时间age,job,marital,education,default,balance,housing,loan,contact,day,month,duration,campaign,pdays,previous,poutcome类标签是否订购定期存款这是一个典型的二分类问题,主要通过银行客户的各种信息,其实现的意义在于可以通过银行已掌握的客户的基本信息,对客户是否有意向订购顶起存款进行预测,从众多客户中提取有价值的客户。2.1数据读取从文件读取数据defreadfile(datapath):#type:datapath:数据集的文件路径#rtype:X:数据标签,y:所属类别X,y=[],[]withopen(datapath,'r')asfp:data=fp.readlines()[:]foriindata[1:]:i=list(map(lambdax:int(x)ifx.isdigit()orx[1:].isdigit()elsex.replace('',''),i[:-1].split(';')))i[1]=job2id.index(i[1])i[2]=marital2id.index(i[2])i[3]=education.index(i[3])i[4]=1ifi[4]=='yes'else0i[5]=int(i[5])i[6]=1ifi[6]=='yes'else0i[7]=1ifi[7]=='yes'else0i[8]=contact2id.index(i[8])i[10]=month2id.index(i[10])i[15]=poutcome2id.index(i[15])X.append(i[:-1])y.append(i[-1]=='yes')returnnp.array(X),np.array(y)同样使用sklearn.model_selection库中的train_test_split函数将数据分为训练集和测试集。2.2数据可视化通过matplotlib库进行数据可视化,将每个标签在每个类别中的数量以直方图的形式画出来。图(2.1)两个类别各占的比例图(2.2)年龄分布图(2.3)工作分布图(2.4)所受教育水平图(2.5)主要联系方式图(2.6)婚姻分布从图(2.1)可以看出所有客户中只有十分之一预定了定期存款,可见开通这个业务的是一小部分人。从图(2.2)可以看出35左右的客户有大部分。从图(2.3)可以看出,所有职业中学生更倾向预定这项业务。从图(2.5)可以看到使用移动电话的客户更倾向预定这项业务。2.3分类结果贝叶斯分类器建立模型时间较短且有一个较好的正确率。SVM分类器花费时间较长,相对于贝叶斯分类器的正确率并没有明显的提高。为什么会出现这种情况,本人感觉是数据集的标签过多引起的。由于对SVM的具体实现了解不深,具体的原因有待进一步探索。3.特定人语音识别这个数据集分为训练集和测试集,主要任务是区分9个不同成年男性对/ae/字母的发音。数据集中有每个人多次对这一字母的发音,每次发音的数据集是由递增顺序的12个LPC系数组成(即每个时间点有12个值)。即每次发音的数据会被分为多行(7-29),每行有12个数组成。对于这个问题,根据论文中的方法实现了一个算法(MethodT-B),3.1数据读取defgetdata(path,sizepath):data=[]withopen(path)asfp:content=fp.read()withopen(sizepath)asfp:datasize=fp.read()[:-1]datasize=list(map(lambdax:int(x),datasize.split('')))

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功