数据挖掘实验2
- 格式:docx
- 大小:163.95 KB
- 文档页数:7
实验二
一、基本原理
分类算法是解决分类问题的方法,是数据挖掘、机器学习和模式识别中一个重要的研究领域。
分类算法通过对已知类别训练集的分析,从中发现分类规则,以此预测新数据的类别。
分类算法的应用非常广泛,银行中风险评估、客户类别分类、文本检索和搜索引擎分类、安全领域中的入侵检测以及软件项目中的应用等。
二、实验目的:
掌握CART决策树构建分类模型。
三、实验内容
对所有窃漏电用户及真诚用户的电量、告警及线损数据和该用户在当天是否窃漏电的标识,按窃漏电评价指标进行处理并选取其中291个样本数据,得到专家样本,使用CART 决策树实现分类预测模型。
注意:数据的80%作为训练样本,剩下的20%作为测试样本。
四、实验步骤
1、对数据进行预处理
2、把数据随机分为两部分,一部分用于训练,一部分用于测试。
分成testData和trainData文件即测试数据和训练数据数据的80%作为训练样本,剩下的20%作为测试样本。
和构建的CART决策树模型分别对训练数据和测试数据进行分类。
构建的神经网络模型分别对训练数据和测试数据进行分类。
5、对比分析CART决策树和神经网络模型对数据处理的结果。
五、实验结果
六、思考与分析
尝试采用神经网络对数据进行分类,并与CART决策树的结果进行比较。
答:与神经网络相比,决策树可以很好地处理非数值型的数据,但是决策树对连续的数据(比如连续的数值型数据)不太擅长。
实验二使用Analysis Services实现OLAP分析1. 实验目标•创建Analysis Services 项目•定义多维数据集•部署Analysis Services项目•查看和分析数据:掌握OLAP的基本操作(切片、切块、钻取、旋转)2.实验内容(基于SQL Server 的AdventureWorksDW)在SQL Server 2005 中设计商业智能应用程序时,首先根据Analysis Services 项目模板,在Business Intelligence Development Studio 中创建SQL Server 2005 Analysis Services (SSAS) 项目。
创建了Analysis Services 项目后,再定义一个或多个数据源。
然后,根据选自数据源的表或视图,定义名为“数据源视图”的单个元数据统一视图。
定义多维数据集,部署Analysis Services项目查看和分析数据:掌握OLAP的基本操作。
3.实验步骤1)创建Analysis Services 项目1.打开Business Intelligence Development Studio。
2.在“文件”菜单上,指向“新建”,然后选择“项目”。
3.确保已选中“模板”窗格中的“Analysis Services 项目”。
4.在“名称”框中,将新项目命名为AdventureWorks。
5.单击“确定”。
(2)创建数据源1.在解决方案资源管理器中,右键单击“数据源”文件夹,然后选择“新建数据源”。
系统将打开数据源向导。
在“欢迎使用数据源向导”页面中,单击“下一步”按钮。
2.单击“新建”向Adventure Works 数据库添加连接。
系统将打开“连接管理器”对话框。
3.在“连接管理器”的“提供程序”列表中,选择“本机OLE DB\Microsoft OLE DB Provider forSQL Server”。
第1篇一、实验概述本次数据挖掘实验以Apriori算法为核心,通过对GutenBerg和DBLP两个数据集进行关联规则挖掘,旨在探讨数据挖掘技术在知识发现中的应用。
实验过程中,我们遵循数据挖掘的一般流程,包括数据预处理、关联规则挖掘、结果分析和可视化等步骤。
二、实验结果分析1. 数据预处理在实验开始之前,我们对GutenBerg和DBLP数据集进行了预处理,包括数据清洗、数据集成和数据变换等。
通过对数据集的分析,我们发现了以下问题:(1)数据缺失:部分数据集存在缺失值,需要通过插补或删除缺失数据的方法进行处理。
(2)数据不一致:数据集中存在不同格式的数据,需要进行统一处理。
(3)数据噪声:数据集中存在一些异常值,需要通过滤波或聚类等方法进行处理。
2. 关联规则挖掘在数据预处理完成后,我们使用Apriori算法对数据集进行关联规则挖掘。
实验中,我们设置了不同的最小支持度和最小置信度阈值,以挖掘出不同粒度的关联规则。
以下是实验结果分析:(1)GutenBerg数据集在GutenBerg数据集中,我们以句子为篮子粒度,挖掘了林肯演讲集的关联规则。
通过分析挖掘结果,我们发现:- 单词“the”和“of”在句子中频繁出现,表明这两个词在林肯演讲中具有较高的出现频率。
- “and”和“to”等连接词也具有较高的出现频率,说明林肯演讲中句子结构较为复杂。
- 部分单词组合具有较高的置信度,如“war”和“soldier”,表明在林肯演讲中提到“war”时,很可能同时提到“soldier”。
(2)DBLP数据集在DBLP数据集中,我们以作者为单位,挖掘了作者之间的合作关系。
实验结果表明:- 部分作者之间存在较强的合作关系,如同一研究领域内的作者。
- 部分作者在多个研究领域均有合作关系,表明他们在不同领域具有一定的学术影响力。
3. 结果分析和可视化为了更好地展示实验结果,我们对挖掘出的关联规则进行了可视化处理。
通过可视化,我们可以直观地看出以下信息:(1)频繁项集的分布情况:通过柱状图展示频繁项集的分布情况,便于分析不同项集的出现频率。
数据挖掘实验报告-数据预处理数据挖掘实验报告数据预处理一、实验目的本次实验的主要目的是深入了解和掌握数据预处理在数据挖掘过程中的重要性及相关技术,通过对实际数据集的处理,提高数据质量,为后续的数据挖掘和分析工作奠定良好的基础。
二、实验背景在当今数字化时代,数据的规模和复杂性不断增加,而原始数据往往存在着各种问题,如缺失值、噪声、异常值、不一致性等。
这些问题如果不加以处理,将会严重影响数据挖掘算法的性能和结果的准确性。
因此,数据预处理成为了数据挖掘过程中不可或缺的重要环节。
三、实验数据集本次实验使用了一个名为“销售数据”的数据集,该数据集包含了某公司在过去一年中不同产品的销售记录,包括产品名称、销售日期、销售数量、销售价格、客户信息等字段。
四、数据预处理技术(一)数据清洗1、处理缺失值首先,对数据集中的缺失值进行了识别和分析。
通过观察发现,“客户信息”字段存在部分缺失。
对于这些缺失值,采用了两种处理方法:一是如果缺失比例较小(小于5%),直接删除含有缺失值的记录;二是如果缺失比例较大,采用均值填充的方法进行补充。
2、处理噪声数据数据中的噪声通常表现为数据中的错误或异常值。
通过对销售数量和销售价格的观察,发现了一些明显不合理的数值,如销售数量为负数或销售价格过高或过低的情况。
对于这些噪声数据,采用了基于统计的方法进行识别和处理,将超出合理范围的数据视为噪声并进行删除。
(二)数据集成由于原始数据集可能来自多个数据源,存在着重复和不一致的问题。
在本次实验中,对“销售数据”进行了集成处理,通过对关键字段(如产品名称、销售日期)的比较和合并,消除了重复的记录,并确保了数据的一致性。
(三)数据变换1、数据标准化为了消除不同字段之间量纲的影响,对销售数量和销售价格进行了标准化处理,使其具有可比性。
2、数据离散化对于连续型的数据字段,如销售价格,采用了等宽离散化的方法将其转换为离散型数据,以便于后续的数据挖掘算法处理。
实验二创建一个简单的OLAP实例
实验目的:
1、熟悉SQL Server 2005 Management Studio和Business Intelligence
Development Studio基本操作
2、掌握数据仓库的基本构建方法
3、理解数据浏览和分析的基本方法
实验内容:
1.装载数据:samples数据库
2.建立数据仓库项目:商业智能分析项目
3.新建数据源
4.新建数据源视图
5 建立多维数据集
6.部署
7.浏览器查看数据
8.进行下钻、上钻、切片、切块、转轴操作
实验结果与分析:
分析:根据 AdventureWorksDW数据仓库,从不同角度选择数据,并对数据进行分析,要求显示如下5种操作结果及分析。
1:下钻:
结果分析:这里通过下钻能了解国家的那个城市在那个季度那个月份的详细的数据,通过这个详细分析数据能更好的了解公司的在地方的发展情况。
2:上卷
结果分析:通过上卷操作,从大的整体去对每个国家的每年的数据进行分析,方便公司进行策略。
3:切片
结果分析:这个结果是通过对给出年份中的一个年进行操作,能了解这一年,公司在各个国家的销售总额的数据。
4:切块
结果分析:这个切块是比较不同国家在两个年份的销售总额的情况,是在两个或多个维上进行选择,当人这个数据还可以比较年份中的每个季度。
5:转轴
结果分析:转轴是一种目视操作,只是转动了观察数据的视角,改变了数据的表示,但结果不会变化,这个能适应不同的人对数据进行观察。
时间序列的模型法和数据挖掘两种方法比较分析研究实验目的:通过实验能对时间序列的模型法和数据挖掘两种方法的原理和优缺点有更清楚的认识和比较.实验内容:选用1952-2006年的中国GDP,分别对之用自回归移动平均模型(ARIMA) 和时序模型的数据挖掘方法进行分析和预测,并对两种方法的趋势和预测结果进行比较并给出解释.实验数据:本文研究选用1952-2006年的中国GDP,其资料如下日期国内生产总值(亿元)日期国内生产总值(亿元) 2006-12-312094071997-12-3174772 2005-12-311830851996-12-312004-12-311365151995-12-312003-12-311994-12-312002-12-311993-12-312001-12-311992-12-312000-12-31894041991-12-311999-12-31820541990-12-311998-12-31795531989-12-311988-12-311969-12-311987-12-311968-12-311986-12-311967-12-311985-12-311966-12-311868 1984-12-3171711965-12-311983-12-311964-12-311454 1982-12-311963-12-311981-12-311962-12-311980-12-311961-12-311220 1979-12-311960-12-311457 1978-12-311959-12-311439 1977-12-311958-12-311307 1976-12-311957-12-311068 1975-12-311956-12-311028 1974-12-311955-12-31910 1973-12-311954-12-31859 1972-12-311953-12-31824 1971-12-311952-12-31679 1970-12-31表一国内生产总值(GDP)是指一个国家或地区所有常住单位在一定时期内生产活动的最终成果。
机器学习与数据挖掘实验报告一、第一部分: 实验综述二、实验工具介绍三、WEKA是新西兰怀卡托大学开发的开源项目, 全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis)。
WEKA是由JAVA编写的, 它的源代码可通过/ml/weka/得到, 是一款免费的, 非商业化的机器学习以及数据挖掘软件。
WEKA作为一个公开的数据挖掘工作平台, 集合了大量能承担数据挖掘任务的学习算法, 包括对数据进行预处理, 分类, 回归, 聚类, 关联规则以及在新的交互式界面上的可视化。
数据挖掘就是通过分析存在于数据库里的数据来解决问题, WEKA的出现使得数据挖掘无需编程即可轻松搞定。
四、实验环境搭建在PC机上面安装java运行环境即JDK环境, 然后安装WEKA。
三、实验目的(1)探索数据集大小与C4.5模型的精度之间的关系。
(2)探索属性的个数对数据集大小与C4.5模型精度之间关系的影响。
四、实验理论依据测试分类模型精度的方法依据如下表所示。
Accuracy=(a+d)/(a+b+c+d)五、实验思路(1)为探索数据集大小与C4.5模型精度之间的关系, 采用实例数据集的训练集进行测试。
对数据集进行多次筛选采样, 通过移除不同百分比的数据实例形成大小的训练集(wake设置为Filter.filters.unsupervised.instance.RemovePercentage), 在分类测试中采用use training set 方法进行测试, 并记录测试模型的精度, 在实验过程中不改变属性值得个数。
换用不同的数据集, 重复该实验过程, 并记录实验结果, 最后进行实验分析总结得出实验结论。
(2)为探索属性的个数对数据集大小与C4.5模型精度之间关系的影响, 使用一个数据集, 采用一个带筛选器的分类器。
对该数据集的属性进行随机抽样筛选, 并对处理后的训练集进行测试, 采用Cross-validation方法, 并记录测试结果。
实验二:决策树要求:实现决策树分类算法,在两种不同的数据集上(iris.txt 和wine.txt)比较算法的性能。
有趣的故事介绍一下决策树。
[白话决策树模型](/shujuwajue/2441.html)首先第一个数据集iris.txt。
iris数据集记录的是鸢尾植物。
Scikit-learn自带了iris数据集。
其中iris.data记录的就是它的四个属性:萼片/花瓣的长和宽。
一个150*4的矩阵。
Iris.target就是每一行对应的鸢尾植物的种类,一共有三种。
测试结果:可以看到,本算法的性能大约是,准确率为0.673333333333。
附录-Python代码:import sysfrom math import logimport operatorfrom numpy import meandef get_labels(train_file):'''返回所有数据集labels(列表)'''labels = []for index,line in enumerate(open(train_file,'rU').readlines()):label = line.strip().split(',')[-1]labels.append(label)return labelsdef format_data(dataset_file):'''返回dataset(列表集合)和features(列表)'''dataset = []for index,line in enumerate(open(dataset_file,'rU').readlines()):line = line.strip()fea_and_label = line.split(',')dataset.append([float(fea_and_label[i]) for i in range(len(fea_and_label)-1)]+[fea_and_label[len(fea_and_label)-1]])#features = [dataset[0][i] for i in range(len(dataset[0])-1)]#sepal length(花萼长度)、sepal width(花萼宽度)、petal length(花瓣长度)、petal width(花瓣宽度)features = ['sepal_length','sepal_width','petal_length','petal_width']return dataset,featuresdef split_dataset(dataset,feature_index,labels):'''按指定feature划分数据集,返回四个列表:@dataset_less:指定特征项的属性值<=该特征项平均值的子数据集@dataset_greater:指定特征项的属性值>该特征项平均值的子数据集@label_less:按指定特征项的属性值<=该特征项平均值切割后子标签集@label_greater:按指定特征项的属性值>该特征项平均值切割后子标签集'''dataset_less = []dataset_greater = []label_less = []label_greater = []datasets = []for data in dataset:datasets.append(data[0:4])mean_value = mean(datasets,axis = 0)[feature_index] #数据集在该特征项的所有取值的平均值for data in dataset:if data[feature_index] > mean_value:dataset_greater.append(data)label_greater.append(data[-1])else:dataset_less.append(data)label_less.append(data[-1])return dataset_less,dataset_greater,label_less,label_greaterdef cal_entropy(dataset):'''计算数据集的熵大小'''n = len(dataset)label_count = {}for data in dataset:label = data[-1]if label_count.has_key(label):label_count[label] += 1else:label_count[label] = 1entropy = 0for label in label_count:prob = float(label_count[label])/nentropy -= prob*log(prob,2)#print 'entropy:',entropyreturn entropydef cal_info_gain(dataset,feature_index,base_entropy):'''计算指定特征对数据集的信息增益值g(D,F) = H(D)-H(D/F) = entropy(dataset) -sum{1,k}(len(sub_dataset)/len(dataset))*entropy(sub_dataset)@base_entropy = H(D)'''datasets = []for data in dataset:datasets.append(data[0:4])#print datasetsmean_value = mean(datasets,axis = 0)[feature_index] #计算指定特征的所有数据集值的平均值#print mean_valuedataset_less = []dataset_greater = []for data in dataset:if data[feature_index] > mean_value:dataset_greater.append(data)else:dataset_less.append(data)#条件熵 H(D/F)condition_entropy = float(len(dataset_less))/len(dataset)*cal_entropy(dataset_less) + float(len(dataset_greater))/len(dataset)*cal_entropy(dataset_greater)#print 'info_gain:',base_entropy - condition_entropyreturn base_entropy - condition_entropydef cal_info_gain_ratio(dataset,feature_index):'''计算信息增益比 gr(D,F) = g(D,F)/H(D)'''base_entropy = cal_entropy(dataset)'''if base_entropy == 0:return 1'''info_gain = cal_info_gain(dataset,feature_index,base_entropy)info_gain_ratio = info_gain/base_entropyreturn info_gain_ratiodef choose_best_fea_to_split(dataset,features):'''根据每个特征的信息增益比大小,返回最佳划分数据集的特征索引'''#base_entropy = cal_entropy(dataset)split_fea_index = -1max_info_gain_ratio = 0.0for i in range(len(features)):#info_gain = cal_info_gain(dataset,i,base_entropy)#info_gain_ratio = info_gain/base_entropyinfo_gain_ratio = cal_info_gain_ratio(dataset,i)if info_gain_ratio > max_info_gain_ratio:max_info_gain_ratio = info_gain_ratiosplit_fea_index = ireturn split_fea_indexdef most_occur_label(labels):'''返回数据集中出现次数最多的label'''label_count = {}for label in labels:if label not in label_count.keys():label_count[label] = 1else:label_count[label] += 1sorted_label_count = sorted(label_count.iteritems(),key = operator.itemgetter(1),reverse = True)return sorted_label_count[0][0]def build_tree(dataset,labels,features):'''创建决策树@dataset:训练数据集@labels:数据集中包含的所有label(可重复)@features:可进行划分的特征集'''#若数据集为空,返回NULLif len(labels) == 0:return 'NULL'#若数据集中只有一种label,返回该labelif len(labels) == len(labels[0]):return labels[0]#若没有可划分的特征集,则返回数据集中出现次数最多的labelif len(features) == 0:return most_occur_label(labels)#若数据集趋于稳定,则返回数据集中出现次数最多的labelif cal_entropy(dataset) == 0:return most_occur_label(labels)split_feature_index = choose_best_fea_to_split(dataset,features)split_feature = features[split_feature_index]decesion_tree = {split_feature:{}}#若划分特征的信息增益比小于阈值,则返回数据集中出现次数最多的labelif cal_info_gain_ratio(dataset,split_feature_index) < 0.3:return most_occur_label(labels)del(features[split_feature_index])dataset_less,dataset_greater,labels_less,labels_greater =split_dataset(dataset,split_feature_index,labels)decesion_tree[split_feature]['<='] = build_tree(dataset_less,labels_less,features)decesion_tree[split_feature]['>'] =build_tree(dataset_greater,labels_greater,features)return decesion_treedef store_tree(decesion_tree,filename):'''把决策树以二进制格式写入文件'''import picklewriter = open(filename,'w')pickle.dump(decesion_tree,writer)writer.close()def read_tree(filename):'''从文件中读取决策树,返回决策树'''import picklereader = open(filename,'rU')return pickle.load(reader)def classify(decesion_tree,features,test_data,mean_values):'''对测试数据进行分类, decesion_tree : {'petal_length': {'<=': {'petal_width': {'<=':'Iris-setosa', '>': {'sepal_width': {'<=': 'Iris-versicolor', '>': {'sepal_length': {'<=': 'Iris-setosa', '>': 'Iris-versicolor'}}}}}}, '>': 'Iris-virginica'}}'''first_fea = decesion_tree.keys()[0]fea_index = features.index(first_fea)if test_data[fea_index] <= mean_values[fea_index]:sub_tree = decesion_tree[first_fea]['<=']if type(sub_tree) == dict:return classify(sub_tree,features,test_data,mean_values)else:return sub_treeelse:sub_tree = decesion_tree[first_fea]['>']if type(sub_tree) == dict:return classify(sub_tree,features,test_data,mean_values)else:return sub_treedef get_means(train_dataset):'''获取训练数据集各个属性的数据平均值'''dataset = []for data in train_dataset:dataset.append(data[0:4])mean_values = mean(dataset,axis = 0) #数据集在该特征项的所有取值的平均值return mean_valuesdef run(train_file,test_file):'''主函数'''labels = get_labels(train_file)train_dataset,train_features = format_data(train_file)decesion_tree = build_tree(train_dataset,labels,train_features)print 'decesion_tree :',decesion_treestore_tree(decesion_tree,'decesion_tree')mean_values = get_means(train_dataset)test_dataset,test_features = format_data(test_file)n = len(test_dataset)correct = 0for test_data in test_dataset:label = classify(decesion_tree,test_features,test_data,mean_values)#print 'classify_label correct_label:',label,test_data[-1]if label == test_data[-1]:correct += 1print "准确率: ",correct/float(n)#############################################################if __name__ == '__main__':if len(sys.argv) != 3:print "please use: python decision.py train_file test_file"sys.exit()train_file = sys.argv[1]test_file = sys.argv[2]run(train_file,test_file)。