第1章 实践目的及意义
一.实践目的
1、 实现一个小型数据挖掘软件,能够执行数据挖掘任务,并进行可视化展示
2、 获取相关数据,搜索所需数据,或通过爬虫来进行获取,对数据进行整理
3、 数据预处理,如填充缺失值,数据规范化等
4、 数据挖掘,考虑要进行的挖掘任务,选择相应的挖掘算法
5、 结果评估与展示,对挖掘结果进行评价,并将挖掘结果进行可视化展示
二.实践意义
数据挖掘就是从大量繁杂的数据中获取隐含中其中的信息,清理污染和死亡之间的数据,得出两者之间的关系
第2章 数据采集
本章节介绍数据的采集,包括数据采集的领域、数据的来源,如何采集的,采集的数据量有多少等内容
%来自StatLib的数据(ftp stat.cmu.edu/datasets)
%资料来源:McDonald,G.C.和Schwing,R.C.(1973)“回归不稳定性
%估计与死亡有关的空气污染,《技术计量》,第15卷,第463页-
%482号。
%变量顺序:
% PREC Average annual precipitation in inches
% JANT Average January temperature in degrees F
% JULT Same for July
% OVR65 % of 1960 SMSA population aged 65 or older
% POPN Average household size
% EDUC Median school years completed by those over 22
% HOUS % of housing units which are sound & with all facilities
% DENS Population per sq. mile in urbanized areas, 1960
% NONW % non-white population in urbanized areas, 1960
% WWDRK % employed in white collar occupations
% POOR % of families with income < $3000
% HC Relative hydrocarbon pollution potential
% NOX Same for nitric oxides
% SO@ Same for sulphur dioxide
% HUMID Annual average % relative humidity at 1pm
% MORT Total age-adjusted mortality rate per 100,000
第3章 数据预处理
本章节介绍数据预处理,主要对采集到的数据进行分析、预处理,如数据缺失值的填充、规范化、根据特定需要去掉不必要的列等,具体的预处理工作依赖数据本身以及要进行的数据挖掘任务,预处理后的数据要进行简要说明
由于部分属性显示年平均降水量(英寸),一月平均气温(华氏度),月份相同与死亡率无关,将其删除,提取出另11列数据,进行整理。
%1960年65岁或以上SMSA人口的65%
%家庭平均人口
%22岁以上学生完成的教育平均学年数
%住房单元的百分之几是完好的,有所有设施
%1960年城市化地区每平方英里的人口密度
%WWDRK%受雇于白领职业
%收入低于3000美元的贫困家庭
%碳氢化合物相对污染潜力
%氮氧化物的氮氧化物含量相同
%二氧化硫
%MORT每100000人的总年龄调整死亡率
数据预处理部分代码:
with open(file,‘r’, encoding = ‘UTF-8’) as f :
home_team_goals = []
away_team_goals = []
for row in reader :
# TODO
# 将 'Home Team Goals' 、'Away Team Goals'中的每个元素以整型数据分别添加在相应的列表中
home_team_goals.append(row['Home Team Goals'])
away_team_goals.append(row['Away Team Goals'])
#转变数据内形式,str2int
#home_team_goals.append(int(row['Home Team Goals']))
#away_team_goals.append(int(row['Away Team Goals']))
print(home_team_goals[:10])
print(away_team_goals[:10])
第4章 数据挖掘
本章节介绍数据挖掘过程,对已经处理好的数据应用相应的数据挖掘算法,包括算法的设计、实现
NaiveBayes
from sklearn.pipeline import Pipeline
text_clf = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', MultinomialNB())])
text_clf = text_clf.fit(twenty_train.data, twenty_train.target)
print(text_clf)
predicted = text_clf.predict(docs_new)
print(predicted)
import numpy as np
twenty_test = fetch_20newsgroups(subset='test', categories=categories, shuffle=True, random_state=42)
docs_test = twenty_test.data
predicted = text_clf.predict(docs_test)
print(np.mean(predicted == twenty_test.target))
from sklearn.linear_model import SGDClassifier
text_clf = Pipeline(
[('vect', CountVectorizer()), ('tfidf', TfidfTransformer()),
('clf', SGDClassifier(loss='hinge', penalty='l2', alpha=1e-3, n_iter=5, random_state=42))])
text_clf = text_clf.fit(twenty_train.data, twenty_train.target)
predicted = text_clf.predict(docs_test)
print(np.mean(predicted == twenty_test.target))
K-Means
def KMcluster(x_train,k,n,m,threshold):
global axis_x, axis_y
center = InitCenter(k,m,x_train)
initcenter = center
centerChanged = True
t=0
while centerChanged:
Dis_array = GetDistense(x_train, k, m, center)
center ,axis_x,axis_y,axis_z= GetNewCenter(x_train,k,n,Dis_array)
err = np.linalg.norm(initcenter[-k:] - center)
t+=1
print('err of Iteration '+str(t),'is',err)
plt.figure(1)
p=plt.subplot(2, 3, t)
p1,p2,p3 = plt.scatter(axis_x[0], axis_y[0], c='r'),plt.scatter(axis_x[1], axis_y[1], c='g'),plt.scatter(axis_x[2], axis_y[2], c='b')
plt.legend(handles=[p1, p2, p3], labels=['0', '1', '2'], loc='best')
p.set_title('Iteration'+ str(t))
if err < threshold:
centerChanged = False
else:
initcenter = np.concatenate((initcenter, center), axis=0)
plt.show()
return center, axis_x, axis_y,axis_z, initcenter
if __name__=="__main__":
x_train=x.iloc[:,1:5]
m,n = np.shape(x_train)
k = 3
threshold = 0.1
km,ax,ay,az,ddd = KMcluster(x_train, k, n, m, threshold)
print('Final cluster center is ', km)
Apriori
def is_apriori(Ck_item, Lk_sub_1):
for item in Ck_item:
sub_item = Ck_item - frozenset([item])
if sub_item not in Lk_sub_1:
return False
return True
def Generate_Lk_By_Ck(data_set, Ck, min_support, support_data):
#参数:数据库事务集,候选频繁k项集,最小支持度,项目集-支持度dic
Lk = set()
item_count = {}
for t in data_set:
for Ck_item in Ck:
if Ck_item.issubset(t):
if Ck_item not in item_count:
item_count[Ck_item] = 1
else:
item_count[Ck_item] += 1
data_num = float(len(data_set))
for item in item_count:
if(item_count[item] / data_num) >= min_support:
Lk.add(item)
support_data[item] = item_count[item] / data_num
return Lk
第5章 挖掘结果展示与评估
本章节介绍数据挖掘挖掘结果展示与评估,包括软件的设计与实现,挖掘结果的可视化展示,能通过调节特定参数进行不同的挖掘结果展示,并评估不同结果的优劣
NaiveBayes
=== 分类器模型(全训练集)===
贝叶斯网络分类器
#属性=11#classindex=6
网络结构(节点后接父节点)
OVR65(39): POOR
POPN(35): POOR
EDUC(26): POOR
HOUS(53): POOR
DENS(60): POOR
WWDRK(51): POOR
POOR(46):
HC(34): POOR
NOX(30): POOR
SO@(44): POOR
MORT(60): POOR
LogScore Bayes: -2500.3703951606703
LogScore BDeu: -161897.54052857636
LogScore MDL: -79797.48450086427
LogScore ENTROPY: -39965.653427286765
LogScore AIC: -59422.65342728682
分层交叉验证:
正确分类的实例0 0%
错误分类实例60 100%
Kappa统计-0.0342
平均绝对误差0.0429
均方根误差0.1495
相对绝对误差100.3085%
相对平方根误差101.8413%
优点
对待预测样本进行预测,过程简单速度快。对于多分类问题很有效,复杂度也不会有大程度上升。对于类别类的输入特征变量,效果非常好。
缺点
对于测试集中的一个类别变量特征,如果在训练集里没见过,直接算的话概率就是0了,预测功能就失效了。朴素贝叶斯有分布独立的假设前提,而现实生活中这些预测很难是完全独立的。
K-Means
聚类模型(全训练集)=
迭代次数:4
簇内平方误差之和:595.0
初始起点(随机):
簇0:9.2,3.28,12.1,83.12095,51.9,9.8,20,11,26857.622
集群1:9.6,3.02,12.2,82.53626,54.3,10.1,20,7,20899.264
丢失的值全局替换为平均值/模式
最终簇质心:集群#
属性 完整数据 0 1
(60.0) (50.0) (10.0)
OVR65 9.2 9.2 7.3
POPN 3.21 3.32 3.21
EDUC 11.1 11.4 10.7
HOUS 79.9 79.9 82.5
DENS 1441 1441 1883
WWDRK 42.6 42.6 37.5
POOR 13.2 12.4 13.2
HC 6 6 11
NOX 4 3 7
SO@ 1 1 20
MORT 790.733 790.733 839.709
训练集的模型与评价=
群集实例
0 50(83%)
1 10(17%)
优点:首先,算法能根据较少的已知聚类样本的类别对树进行剪枝确定部分样本的分类;其次,为克服少量样本聚类的不准确性,该算法本身具有优化迭代功能,在已经求得的聚类上再次进行迭代修正剪枝确定部分样本的聚类,优化了初始监督学习样本分类不合理的地方;第三,由于只是针对部分小样本可以降低总的聚类时间复杂度。
缺点:在K-means 算法中K 是事先给定的,这个K 值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适;其次,在K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果;最后,该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。
Apriori
关联器模型(完整训练集)=
Apriori
Minimum support: 0.04 (2 instances)
Minimum metric : 0.9
Number of cycles performed: 20
Generated sets of large itemsets:
Size of set of large itemsets L(1): 109
Size of set of large itemsets L(2): 38
Size of set of large itemsets L(3): 8
Size of set of large itemsets L(4): 1
Best rules found:
- NOX=1 3 ==> SO@=1 3 conf:(1) lift:(10) lev:(0.04) [2] conv:(2.7)
- POPN=3.39 2 ==> OVR65=7.7 2 conf:(1) lift:(20) lev:(0.03) [1] conv:(1.9)
- OVR65=8.8 2 ==> EDUC=11.1 2 conf:(1) lift:(10) lev:(0.03) [1] conv:(1.8)
- SO@=10 2 ==> OVR65=9 2 conf:(1) lift:(20) lev:(0.03) [1] conv:(1.9)
- POOR=13.5 2 ==> OVR65=11.3 2 conf:(1) lift:(30) lev:(0.03) [1] conv:(1.93)
- OVR65=11.3 2 ==> POOR=13.5 2 conf:(1) lift:(30) lev:(0.03) [1] conv:(1.93)
- HC=1 2 ==> POPN=3.22 2 conf:(1) lift:(15) lev:(0.03) [1] conv:(1.87)
- POPN=3.34 2 ==> EDUC=11.4 2 conf:(1) lift:(10) lev:(0.03) [1] conv:(1.8)
- POPN=3.35 2 ==> EDUC=11.4 2 conf:(1) lift:(10) lev:(0.03) [1] conv:(1.8)
- POPN=3.35 2 ==> HC=6 2 conf:(1) lift:(12) lev:(0.03) [1] conv:(1.83)
Apriori优点:简单、数据要求低
缺点:
(1)在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;
(2)每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销
第6章 总结
本章节主要对整个KDD(基于数据库的知识发现过程)进行总结
• KDD一词是Usama M.Fayyad于1989年首次提出,指从数据集中提取可信的、新颖的、具有潜在使用价值的能够被人类所理解的模式的非繁琐的处理过程。
• 定义解析
KDD——一个处理过程,大部分步骤是系统自动执行的;
数据集——一个有关事实的集合;
模式——针对某个数据集,描述了数据自身的特性;
可信的——要求发现的模式必须经过了正确性检验,能够应用到新数据中;
新颖的——表示发现的模式应该是以前没有发现的、希望得到的新发现;
潜在使用价值——表示发现的模式应该有价值、有意义,价值和意义一般不能直接从数据中看出来或查询和搜索出来,是可以被利用的潜在价值;
可被人理解——发现的模式是人们容易理解的,从而更好的被评估和利用。
• 过程模型
(1)数据准备——了解应用领域情况,熟悉背景知识,确定用户要求。
(2)数据选择——根据用户要求从数据库中提取与KDD相关的数据,会利用一些数据库操作对数据进行处理。
(3)数据预处理——对数据进行加工,检查数据的完整性及数据的一致性,对其中的噪声数据、缺失数据进行处理。
(4)数据缩减——对经过预处理的数据,根据知识发现的任务对数据进行再处理,主要通过投影或数据库中的其他操作减少数据量。
(5)确定KDD的目标——根据用户要求,确定KDD是发现何种类型的知识。
(6)确定知识发现算法——根据目标选择合适的知识发现算法,包括选取合适的模型和参数,并使得知识发现算法与整个KDD的评价标准相一致。
(7)数据挖掘——运用算法,从数据中提取出用户所需要的知识。
(8)模式解释——对发现的模式进行解释。为了取得更为有效的知识,可能会返回到前面处理步骤中反复进行前面的KDD过程,从而提取出更有效的知识。
(9)知识评价——将发现的知识以用户能理解的方式呈现,同时对知识进行检验和评估。
数据挖掘是知识发现过程的核心,它通常占KDD的一部分(大约是15% 到25%) 。数据挖掘是整个KDD过程的一个步骤,通用的过程应该接收原始数据输入,选择重要的数据项,缩减、预处理和浓缩数据组,将数据转换为合适的格式,从数据中找到模式,评价解释发现结果。
参考文献
数据集 https://blog.csdn.net/qq_28168421/article/details/77836263
百度百科—知识发现
https://baike.baidu.com/item/%E7%9F%A5%E8%AF%86%E5%8F%91%E7%8E%B0
维基百科—知识发现
https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98
(本次实验运用weka完成)