『sklearn学习』利用 Python 练习数据挖掘

来源:互联网 发布:程序员 博客 编辑:程序博客网 时间:2024/06/03 20:34

本文主要参考于 利用 Python 练习数据挖掘 ,但修改了原文中的某些错误

### ------------------------------------------------------------------- ####     利用 Python 练习数据挖掘 URL:http://python.jobbole.com/83563/# 数据导入和可视化import urllib2url = "http://aima.cs.berkeley.edu/data/iris.csv"u = urllib2.urlopen(url)localFiel = open("iris.csv", "w")localFiel.write(u.read())localFiel.close()"""数据来源: 伯克利大学数据包含鸢尾花(iris)数据集,包含了三种鸢尾花(山鸢尾、维吉尼亚鸢尾和变色鸢尾)的各 50 个数据样本的多元数据集每个样本有四个特征,即花萼(sepal)和花瓣(petal)的长度和宽度,以厘米为单位数据集有 5 列,前四列包含着特征值,最后一列代表着样本类型"""# csv 文件很容易被 numpy 库的 genfromtxt 方法解析from numpy import genfromtxt,zeros# 读取前 4 列data = genfromtxt("iris.csv", delimiter=",", usecols=(0, 1, 2, 3))# 读取第 5 列target = genfromtxt("iris.csv", delimiter=",", usecols=(4), dtype=str)print "data: ", dataprint "target: ", targetprint "data.shape: ", data.shapeprint "target.shape: ", target.shape# 查看有多少种样本类型以及它们的名字print set(target)# 使用 pylab 库(matplotlib的接口)的 plotting 方法可以建一个二维散点图让我们在两个维度上分析数据集的两个特征值from pylab import plot, show, close# 蓝色点代表山鸢尾、红色点代表变色鸢尾、绿色点代表维吉尼亚鸢尾# 第一和第三维度是花萼的长度和花瓣的长度plot(data[target == "setosa", 0], data[target == "setosa", 2], "bo")plot(data[target == "versicolor", 0], data[target == "versicolor", 2], "ro")plot(data[target == "virginica", 0], data[target == "virginica", 2], "go")# show()close()# 另一种常用的查看数据的方法是分特性绘制直方图# 下面的代码可以绘制数据中每一类型的第一个特性(花萼的长度)from pylab import figure, subplot, hist, xlim, showxmin = min(data[:, 0])xmax = max(data[:, 0])figure()subplot(411)hist(data[target == "setosa", 0], color="b", alpha=.7)xlim(xmin, xmax)subplot(412)hist(data[target == "versicolor", 0], color="r", alpha=.7)xlim(xmin, xmax)subplot(413)hist(data[target == "virginica", 0], color="g", alpha=.7)xlim(xmin, xmax)subplot(414)hist(data[:, 0], color="y", alpha=.7)xlim(xmin, xmax)# show()close()# 分类#     ------  高斯朴素贝叶斯分类 ------# 把字符串数组转型成整型数据t = zeros(len(target))t[target == "setosa"] = 1t[target == "versicolor"] = 2t[target == "virginica"] = 3# 模型实例化和训练分类器from sklearn.naive_bayes import GaussianNBclassifier = GaussianNB()classifier.fit(data, t)# 分类器可以由 predict 方法完成,并且只要输出一个样例就可以很简单的检测print classifier.predict(data[0])print t[0]# 评估分类器# 通过从源数据集中随机抽取样本把数据分为训练集和测试集,然后使用训练集的数据来训练分类器,并使用测试集来测试分类器from sklearn import cross_validationtrain, test, t_train, t_test = cross_validation.train_test_split(data, t, test_size=0.4, random_state=0)# 训练分类器并输出精确度classifier.fit(train, t_train)print classifier.score(test, t_test)# 另一个估计分类器表现的工具叫做混淆矩阵。在此矩阵中每列代表一个预测类的实例,每行代表一个实际类的实例from sklearn.metrics import confusion_matrixprint confusion_matrix(classifier.predict(test), t_test)"""如果我们牢记所有正确的猜测都在表格的对角线上,那么观测表格的错误就很容易了,即对角线以外的非零值"""# 可以展示分类器性能的完整报告的方法也是很好用的from sklearn.metrics import classification_reportprint classification_report(classifier.predict(test), t_test, target_names=["setosa", "versicolor", "virginica"])#     ------ 聚类 ------from sklearn.cluster import KMeanskmeans = KMeans(n_clusters=3, init="random")kmeans.fit(data)c = kmeans.predict(data)# 估计群集的结果,与使用完整性得分和同质性得分计算而得的标签作比较from sklearn.metrics import completeness_score, homogeneity_scoreprint completeness_score(t, c)print homogeneity_score(t, c)"""当大部分数据点属于一个给定的类并且属于同一个群集,那么完整性得分就趋向于 1当所有群集都几乎只包含某个单一类的数据点时同质性得分就趋向于 1"""# 把集群可视化并和带有真实标签的做可视化比较figure()subplot(211)plot(data[t == 1, 0], data[t == 1, 2], "bo")plot(data[t == 2, 0], data[t == 2, 2], "ro")plot(data[t == 3, 0], data[t == 3, 2], "go")subplot(212)plot(data[c == 1, 0], data[c == 1, 2], "bo", alpha=.7)plot(data[c == 2, 0], data[c == 2, 2], "ro", alpha=.7)plot(data[c == 0, 0], data[c == 0, 2], "go", alpha=.7)# show()close()#     ------ 回归 ------# 为了应用线性回归,我们需要建立一个由上所述的综合数据集from numpy.random import randx = rand(40, 1)y = x*x*x + rand(40, 1) / 5from sklearn.linear_model import LinearRegressionlinreg = LinearRegression()linreg.fit(x, y)# 我们可以通过把拟合线和实际数据点画在同一幅图上来评估结果from numpy import linspace, matrixxx = linspace(0, 1, 40)plot(x, y, "o", xx, linreg.predict(matrix(xx).T), "--r")# show()close()# 我们还可以使用均方误差来量化模型和原始数据的拟合度from sklearn.metrics import mean_squared_errorprint mean_squared_error(linreg.predict(x), y)"""该指标度量了预期的拟合线和真实数据之间的距离平方,当拟合线很完美时该值为 0"""#     ------ 相关 ------"""我们通过研究相关性来理解成对的变量之间是否相关,相关性的强弱。此类分析帮助我们精确定位被依赖的重要变量。最好的相关方法是皮尔逊积矩相关系数,它是由两个变量的协方差除以他们的标准差的乘机计算而来"""from numpy import corrcoefcorr = corrcoef(data.T)print corrfrom pylab import pcolor, colorbar, xticks, yticks, closefrom numpy import arangepcolor(corr)colorbar()xticks(arange(0.5, 4.5), ['sepal length',  'sepal width', 'petal length', 'petal width'],rotation=-20)yticks(arange(0.5,4.5),['sepal length',  'sepal width', 'petal length', 'petal width'],rotation=-20)# show()close()#    ------ 降维 ------# 最著名的降维技术之一就是主成分分析from sklearn.decomposition import PCApca = PCA(n_components=2)pcad = pca.fit_transform(data)plot(pcad[target == "setosa", 0], pcad[target == "setosa", 1], "bo")plot(pcad[target == "versicolor", 0], pcad[target == "versicolor", 1], "ro")plot(pcad[target == "virginica", 0], pcad[target == "virginica", 1], "go")# show()close()# PCA 将空间数据方差最大化,我们可以通过方差比判断 PCs 包含的信息量print pca.explained_variance_ratio_# 输出:[ 0.92461621  0.05301557]# 现在我们知道第一个 PC 占原始数据的 92% 的信息量而第二个占剩下的 5%,我们还可以输出在转化过程中# 丢失的信息量print 1 - sum(pca.explained_variance_)# 此时我们可以是应用逆变换还原原始数据data_inv = pca.inverse_transform(pcad)# 可以证明的是,由于信息丢失逆变换不能给出准确的原始数据,我们可以估算逆变换的结果和原始数据的相似度print abs(sum(sum(data - data_inv)))# 通过改变主成分的数值来计算我们能够覆盖多少信息量是很有趣的for i in range(1, 5):    pca = PCA(n_components=i)    pca.fit(data)    print sum(pca.explained_variance_ratio_) * 100, "%"#     ------ 网络挖掘 ------# 通常我们分析的数据是以网络结构存储的,我们可以使用点和边描述之间的关系# 本章中我们将会介绍分析此类数据的基本步骤,称为图论,一个帮助我们创造、处理和研究网络的类库# 尤其我们将会介绍如何使用特定方法建立有意义的数据可视化,以及如何建立一组关联稠密的点# 使用图论可以让我们很容易的导入用于描述数据结构的最常用结构import networkx as nxG = nx.read_gml("lesmiserables.gml", relabel=True)      # networkx 必须要下载 1.9.1 版本才行# 在上述代码我们导入了《悲惨世界》同时出现的单词组成的网络,可以通过https://gephi.org/datasets/lesmiserables.gml.zip免费# 下载,数据以GML格式存储。我们还可以使用下面的命令导入并可视化网络:nx.draw(G, node_size=0, edge_color="b", alpha=.2, font_size=7)


0 0
原创粉丝点击