VOTCL及其在交叉销售问题上的应用研究-山东大学机器学习与数据
- 格式:pdf
- 大小:828.49 KB
- 文档页数:9


第一章测试1.软件没有相应的文档,且最终不能满足用户要求是软件危机的一种表现。
()A:错B:对答案:B2.软件本身的不可见性和复杂性随规模的增加呈指数上升是产生软件危机的主要原因。
()A:错B:对答案:A3.开发软件就是写程序。
()A:错B:对答案:A4.开发软件所需高成本和产品的低质量之间有着尖锐的矛盾,这种现象称()。
A:软件危机B:软件工程C:软件产生D:软件周期答案:A5.以下对软件工程描述正确地是()。
A:结合最好的技术方法。
B:经济地开发出高质量的软件并有效地维护它。
C:一门工程学科。
D:采用经过时间考验而证明正确的管理技术。
答案:ABCD6.软件生命周期中所花费费用最多的阶段是()。
A:需求分析。
B:软件总体设计。
C:软件实现。
D:软件维护。
答案:D7.软件是()。
A:计算机系统。
B:处理对象和处理规则的描述。
C:程序。
D:程序、数据及其文档的集合。
答案:D8.同螺旋模型相比,原型模型主要缺少()。
A:客户评估B:制定计划C:风险分析D:实施工程答案:C9.在软件生存周期模型中,不适应变化需求的软件开发模型是()。
A:原型模型B:瀑布模型C:螺旋模型D:增量模型答案:B10.针对高质量软件的生产的软件过程模型()。
A:RUP模型B:基于构件的模型C:净室模型D:增量模型答案:C第二章测试1.可行性研究的技术可行性是指现有技术是否可行。
()A:对B:错答案:A2.可行性研究的成本效益分析是从经济方面讨论是否可行。
()A:对B:错答案:A3.可行性分析研究的目的是()。
A:功能内聚B:项目值得开发否C:开发项目D:争取项目答案:B4.描绘物理系统的传统工具是()。
A:程序流程图B:系统流程图C:数据流程图D:软件结构图答案:B5.数据字典的基本功能是()。
A:数据维护。
B:数据通信。
C:数据定义。
D:数据库设计。
答案:C6.使用数据流图对工资系统进行需求分析建模,外部实体是()。
A:工资单B:工资系统代码C:工资数据库维护D:接受工资单的银行答案:D7.数据流图的作用包括()。
【笔记】验证数据集与交叉验证验证数据集与交叉验证⼀些相关前提:验证数据集严格意义上来说,使⽤训练数据集和测试数据集来进⾏是有不太好的地⽅,这样得出来的模型,可能导致⼀个问题,即这个最后得到的模型是过拟合了这个特定的测试数据集不断的调参再去训练数据集重新得到模型在进⾏测试数据,最后找到⼀组参数使模型在测试数据集上效果最好,这样就使得这个模型始终围绕着这个测试数据,由于测试数据集是已知的,那么这就相当于针对这组测试数据集进⾏调参,这有可能出现过拟合的情况那么要想解决这个情况,就可以将其分成三部分,即训练数据集(训练模型)验证数据集(测试好数据以后,将验证数据送⼊模型看⼀下效果是咋样的,效果不好的话就调参,重新训练模型,这就使得模型针对验证模型达到最优,即其为调整超参数使⽤的数据集)测试数据集(在模型已经针对验证数据得到最优以后再传⼊模型,其作为衡量最终模型性能的数据集,其并没有参与模型的创建,其对于模型是完全不可知的)这样得到的模型的结果是更加准确的,但是这样操作以后还有⼀个问题,即由于验证数据集是从原先的数据集中随机的切出来的,那么这个模型就有可能过拟合这个验证数据集,⼀旦这⼀份验证数据集⾥⾯的数据不好,⽐如存在极端数据的话,这就使得模型不准确,为了解决这个问题,就有了交叉验证交叉验证那么什么是交叉验证呢?交叉验证,其是⽐较正规的在调参的时候使⽤的观察模型性能的⽅式对于训练的数据来说,通常将其分为k份,那么就可以让这k份数据分别作为验证数据集,⽐如有三份,为abc,就可以分为以bc为训练数据集,a为验证数据集,以ac为训练数据集,b为验证数据集以及以ab为训练数据集,c为验证数据集,这样的对应的搭配就会产⽣三个模型,这三个模型每⼀个模型在验证数据集上都会求出来⼀个性能的指标,这⼏个指标的平均就作为当前算法的指标,即将这k个模型的均值作为结果调参具体实现⼀下(在notebook中)使⽤书写识别数据import numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasetsdigits = datasets.load_digits()X = digits.datay = digits.target这⾥还是将数据集分成训练数据集和测试数据集from sklearn.model_selection import train_test_splitX_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=666)这⾥使⽤knn这个⽅法来对⼿写数据进⾏识别,在过程中要不断地进⾏调参,⼀共有两个参数,分别为k和p,对k来说,从2到10之间不断选择,对p来说,从1到5之间进⾏选择,每⼀次都传knn_clf调⽤KNeighborsClassifier这个构造函数,传⼊weights="distance",n_neighbors=k,p=p,然后计算得到score,将其存起来,如果这个score是⼤于历史上所找到的最好的score,这样就要将当前的score,k,p给记录下来,循环得出最佳的k和p,然后打印出来from sklearn.neighbors import KNeighborsClassifierbest_score,best_p,best_k = 0,0,0for k in range(2,11):for p in range(1,6):knn_clf = KNeighborsClassifier(weights="distance",n_neighbors=k,p=p)knn_clf.fit(X_train,y_train)score = knn_clf.score(X_test,y_test)if score > best_score:best_score,best_p,best_k = score,p,kprint("Best k =",best_k)print("Best p =",best_p)print("Best Score =",best_score)结果如下这⾥就是⽤交叉验证的⽅法来进⾏超参数的调整使⽤sklearn中的cross_val_score,只要传⼊算法和相应的X_train,y_train,就会⾃动进⾏交叉验证的过程,同时返回每个模型对应的准确率from sklearn.model_selection import cross_val_scoreknn_clf = KNeighborsClassifier()cross_val_score(knn_clf,X_train,y_train)结果如下(为啥我是五个值,就挺突然的,或许是默认为5?不过过程是对的,后续结果也会也能出现偏差)调参的逻辑和上⾯的差不多,不同的是每次要调⽤cross_val_score的⽅法计算,scores = cross_val_score(knn_clf,X_train,y_train),这样⼀来就是⽤了交叉验证的结果best_score,best_p,best_k = 0,0,0for k in range(2,11):for p in range(1,6):knn_clf = KNeighborsClassifier(weights="distance",n_neighbors=k,p=p)scores = cross_val_score(knn_clf,X_train,y_train)score = np.mean(scores)if score > best_score:best_score,best_p,best_k = score,p,kprint("Best k =",best_k)print("Best p =",best_p)print("Best Score =",best_score)结果如下这样我们拿到了最佳的参数,这是就是⽤找到的最佳的参数来进⾏分类,然后使⽤test来计算准确度best_knn_clf = KNeighborsClassifier(weights="distance",n_neighbors=2,p=2)best_knn_clf.fit(X_train,y_train)best_knn_clf.score(X_test,y_test)结果如下实际上这个过程是⽹格搜索中是有进⾏的,使⽤的sklearn中的GridSearchCV,GridSearchCV中的CV就是交叉验证的意思详细过程:from sklearn.model_selection import GridSearchCVparam_grid = [{'weights':['distance'],'n_neighbors':[i for i in range(2,11)],'p': [i for i in range(1,6)]}]grid_search = GridSearchCV(knn_clf, param_grid,verbose=1)grid_search.fit(X_train,y_train)结果如下使⽤以下代码就可以发现对应的结果了,和上述的结果相同,不再赘述grid_search.best_score_grid_search.best_params_best_knn_clf = grid_search.best_estimator_best_knn_clf.score(X_test,y_test)还可以对交叉验证设置cv为5,使其分成五份cross_val_score(knn_clf,X_train,y_train,cv=5)结果为同理⽹格搜索也是可以设置cvGridSearchCV(knn_clf,param_grid,verbose=1,cv=5)结果为我们⼀般称上⾯的为称为k-folds交叉验证,其也是有缺点的,由于分成了k份数据,每次训练k个模型,整体的性能肯定是会慢很多的在极端情况下,k-folds交叉验证可以变成留⼀法LOO-CV的交叉验证⽅式,其就是训练数据集有m个样本,就把训练数据集分成m份,即每次都将m-1份样本去训练,然后去预测剩下的的⼀个样本,将这些结果平均,这样做将完全不受随机的影响,最接近模型真正的性能指标,但是很明显,计算量巨⼤。