用python slearning类库实现数据挖掘(python3.x)
Summary of test0
- data : source data
- source code : in test0 file
- reference : - Reference Website / - Article in English Website
- attention : the link of reference used python 2.x ,i use python 3.x ,there are some difference
Overview
- import data and visualization (导入文件和数据可视化)
- classification (分类)
- cluster (聚类)
- regression (回归)
- correlation (相关)
- dimensionality reduction (降维)
- web mining (uncompleted) (网络挖掘)
import data and visualization
下载伯克利大学网站的一个文件。
数据是一个关于iris(鸢尾花)数据集,包含三种iris:setosa(山鸢尾),virginica(维吉尼亚鸢尾)和versicolor(变色鸢尾)各50个的多元样本。每个包含四个feature(特征),sepal(花萼)的长,petal(花瓣)的长,sepal(花萼)的宽petal(花瓣)的宽。
import urllib
url = 'http://aima.cs.berkeley.edu/data/iris.csv'
u = urllib.request.urlopen(url)
localFile = open('iris.csv', 'wb+')
localFile.write(u.read())
localFile.close()
用csv文件保存到自己的硬盘上,csv文件方便被numpy类库的getfromtxt方法解析。
from numpy import genfromtxt, zeros
# read the first 4 columns
data = genfromtxt('iris.csv',delimiter=',',usecols=(0,1,2,3))
# read the fifth column
target = genfromtxt('iris.csv',delimiter=',',usecols=(4),dtype=str)
解析完之后,创建了一个包含特征值的矩阵以及一个包含样本类型的向量,可以通过shape方法确认数据集的大小。
#查看两个数据集的大小
print (data.shape) #(150, 4)
print (target.shape) #(150, 4)
也可以用set查看我们有多少种样本类型以及它们的名字:
#用set统计总共有及中类型
print (set(target)) # build a collection of unique elements
# {'setosa', 'versicolor', 'virginica'}
pylab类库(matplotlib的接口) 的plot() 方法可以建一个二维散点图让我们在两个维度上分析数据集的两个特征值,绘制了关于sepal的长为横轴,宽为y轴的二维散点图:
#绘制二维散点图
from pylab import plot, show
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()
另一种常用的查看数据的方法是分特性绘制直方图,可以用hist 方法。在本例中,既然数据被分为三类,我们就可以比较每一类的分布特征。下面这个代码可以绘制数据中每一类型的第一个特性(sepal的长度):
#绘制直方图
from pylab import figure, subplot, hist, xlim, show
xmin = min(data[:,0])
xmax = max(data[:,0])
figure()
subplot(411) # distribution of the setosa class (1st, on the top)
hist(data[target=='setosa',0],color='b',alpha=.7)
xlim(xmin,xmax)
subplot(412) # distribution of the versicolor class (2nd)
hist(data[target=='versicolor',0],color='r',alpha=.7)
xlim(xmin,xmax)
subplot(413) # distribution of the virginica class (3rd)
hist(data[target=='virginica',0],color='g',alpha=.7)
xlim(xmin,xmax)
subplot(414) # global histogram (4th, on the bottom)
hist(data[:,0],color='y',alpha=.7)
xlim(xmin,xmax)
show()
根据上图的直方图,我们可以根据数据类型区分理解数据的特征。例如,我们可以观察到,山鸢尾的平均花萼长度小于维吉尼亚鸢尾。
classification
分类是一个数据挖掘方法,有两个过程训练和分类。训练是指采集已知其特定类归属的数据并基于这些数据创建分类器。 分类是指使用通过这些已知数据建立的分类器来处理未知的数据,以判断未知数据的分类情况。
Sklearn类库 包含很多分类器的实现,我们将会使用高斯朴素贝叶斯来分析我们在第一章载入的鸢尾花数据,包含setosa(山鸢尾),virginica(维吉尼亚鸢尾)和versicolor(变色鸢尾)。最后我们把字符串数组转型成整型数据,方便处理:
#把字符串数组转型成整型数据
t = zeros(len(target))
t[target == 'setosa'] = 1
t[target == 'versicolor'] = 2
t[target == 'virginica'] = 3
然后准备实例化和训练分类器:
from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(data,t) # training on the iris dataset
分类器可以由predict方法完成,输出预测的结果和实际结果进行对比,做一个检测
print (classifier.predict(data[0])) #[ 1.]
print (t[0]) #1.0
上例中predicted类包含了一个正确的样本(山鸢尾),但是在广泛的样本上评估分类器并且使用非训练环节的数据测试是很重要的。最终我们通过从源数据集中随机抽取样本把数据分为训练集和测试集。我们将会使用训练集的数据来训练分类器,并使用测试集的数据来测试分类器。train_test_split方法正是实现此功能的:
from sklearn import cross_validation
train, test, t_train, t_test = cross_validation.train_test_split(data, t,test_size=0.4, random_state=0)
数据集被分一分为二,测试集被指定为源数据的40%(命名为test_size),我们用它反复训练我们的分类器并输出精确度:
classifier.fit(train,t_train) # train
print (classifier.score(test,t_test)) # test
#0.933333333333
在此例中,我们的精确度为93%。一个分类器的精确度是通过正确分类样本的数量除以总样本的数量得出的。也就是说,它意味着我们正确预测的比例。
另一个估计分类器表现的工具叫做混淆矩阵。在此矩阵中每列代表一个预测类的实例,每行代表一个实际类的实例。使用它可以很容易的计算和打印矩阵:
from sklearn.metrics import confusion_matrix
print confusion_matrix(classifier.predict(test),t_test)
#[[16 0 0]
# [ 0 23 4]
# [ 0 0 17]]
在这个混淆矩阵中我们可以看到所有山鸢尾和维吉尼亚鸢尾都被正确的分类了,但是实际上应该是26个的变色鸢尾,系统却预测其中三个是维吉尼亚鸢尾。如果我们牢记所有正确的猜测都在表格的对角线上,那么观测表格的错误就很容易了,即对角线以外的非零值。
可以展示分类器性能的报告Precision:正确预测的比例,Recall(或者叫真阳性率):正确识别的比例,F1-Score:precision和recall的调和平均数 :
from sklearn.metrics import classification_report
print (classification_report(classifier.predict(test), t_test, target_names=['setosa', 'versicolor', 'virginica']))
返回结果如下表格(表格0,0为空):
(return:) | precision | recall | f1-score | support |
---|---|---|---|---|
setosa | 1.00 | 1.00 | 1.00 | 16 |
versicolor | 1.00 | 0.85 | 0.92 | 27 |
virginica | 0.81 | 1.00 | 0.89 | 17 |
avg / total | 0.95 | 0.93 | 0.93 | 60 |
当然,分割数据、减少用于训练的样本数以及评估结果等操作都依赖于配对的训练集和测试集的随机选择。如果要切实评估一个分类器并与其它的分类器作比较的话,我们需要使用一个更加精确的评估模型,例如Cross Validation。该模型背后的思想很简单:多次将数据分为不同的训练集和测试集,最终分类器评估选取多次预测的平均值。这次,sklearn为我们提供了运行模型的方法:
from sklearn.cross_validation import cross_val_score
# cross validation with 6 iterations
scores = cross_val_score(classifier, data, t, cv=6)
print(scores)
#[ 0.92592593 1. 0.91666667 0.91666667 0.95833333 1. ]
输出是每次模型迭代产生的精确度的数组。我们可以很容易计算出平均精确度
from numpy import mean
print (mean(scores)) #0.952932098765
cluster
通常我们的数据上不会有标签告诉我们它的样本类型;我们需要分析数据,把数据按照它们的相似度标准分成不同的群组,群组(或者群集)指的是相似样本的集合。这种分析被称为无监督数据分析。最著名的聚类工具之一叫做k-means算法,如下所示:
from sklearn.cluster import KMeans
kmeans=KMeans(init='k-means++', n_clusters=3, n_init=10).fit(data) # initialization
上述片段运行k-measn算法并把数据分为三个群集(参数k所指定的)。现在我们可以使用模型把每一个样本分配到三个群集中:
c = kmeans.predict(data)
我们可以估计群集的结果,与使用完整性得分和同质性得分计算而得的标签作比较:
from sklearn.metrics import completeness_score, homogeneity_score
print (completeness_score(t,c)) #0.764986151449
print (homogeneity_score(t,c)) #0.751485402199
当大部分数据点属于一个给定的类并且属于同一个群集,那么完整性得分就趋向于1。当所有群集都几乎只包含某个单一类的数据点时同质性得分就趋向于1.
当然我们可以把集群可视化并和带有真实标签的做可视化比较:
figure()
subplot(211) # top figure with the real classes
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) # bottom figure with classes assigned automatically
plot(data[c==1,0],data[c==1,2],'bo',alpha=.7)
plot(data[c==2,0],data[c==2,2],'go',alpha=.7)
plot(data[c==0,0],data[c==0,2],'mo',alpha=.7)
show()
观察此图我们可以看到,底部左侧的群集可以被k-means完全识别,然而顶部的两个群集有部分识别错误。
regression
回归是一个用于预测变量之间函数关系调查的方法。例如,我们有两个变量,一个被认为是解释,一个被认为是依赖。我们希望使用模型描述两者的关系。当这种关系是一条线的时候就称为线性回归。
为了应用线性回归我们建立一个由上所述的综合数据集:
from numpy.random import rand
#rand() :Random values in a given shape.
x = rand(40,1) # explanatory variable
y = x*x*x+rand(40,1)/5 # depentent variable
我们可以使用在sklear.linear_model模块中发现的LinearRegression模型。该模型可以通过计算每个数据点到拟合线的垂直差的平方和,找到平方和最小的最佳拟合线。使用方法和我们之前遇到的实现sklearn的模型类似:
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
linreg.fit(x,y)
我们可以通过把拟合线和实际数据点画在同一幅图上来评估结果:
from numpy import linspace, matrix
xx = linspace(0,1,40)
plot(x,y,'o',xx,linreg.predict(matrix(xx).T),'--r')
show()
观察该图我们可以得出结论:拟合线从数据点中心穿过,并可以确定是增长的趋势。
我们还可以使用均方误差来量化模型和原始数据的拟合度:
from sklearn.metrics import mean_squared_error
print (mean_squared_error(linreg.predict(x),y)) #0.0133012180196
该指标度量了预期的拟合线和真实数据之间的距离平方。当拟合线很完美时该值为0。
correlation
我们通过研究相关性来理解成对的变量之间是否相关,相关性的强弱。此类分析帮助我们精确定位被依赖的重要变量。最好的相关方法是皮尔逊积矩相关系数。它是由两个变量的协方差除以它们的标准差的乘积计算而来。我们将鸢尾花数据集的变量两两组合计算出其系数如下所示:
from numpy import corrcoef
corr = corrcoef(data.T) # .T gives the transpose
print (corr)
#[[ 1. -0.10936925 0.87175416 0.81795363]
# [-0.10936925 1. -0.4205161 -0.35654409]
# [ 0.87175416 -0.4205161 1. 0.9627571 ]
# [ 0.81795363 -0.35654409 0.9627571 1. ]]
corrcoef方法通过输入行为变量列为观察值的矩阵,计算返回相关系数的对称矩阵。该矩阵的每个元素代表着两个变量的相关性。
当值一起增长时相关性为正。当一个值减少而另一个只增加时相关性为负。特别说明,1代表完美的正相关,0代表不相关,-1代表完美的负相关。
当变量数增长时我们可以使用伪彩色点很方便的可视化相关矩阵:
from pylab import pcolor, colorbar, xticks, yticks
from numpy import arange
pcolor(corr)
colorbar() # add
# arranging the names of the variables on the axis
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()
看图中的彩条,我们可以把颜色点关联到数值上。
我们可以看出我们数据集的最强相关是“petal width(花瓣宽度)”和“sepal length(花瓣长度)”这两个变量。
dimensionality reduction
在第一章中我们了解了如何将鸢尾花数据集的两个维度可视化。单独使用该方法,我们只能看到数据集的部分数据视图。既然我们可以同时绘制的最高维度数为3,将整个数据集嵌入一系列维度并建立一个整体可视化视图是很有必要的。这个嵌入过程就被称作降维。最著名的降维技术之一就是主成分分析(PCA)。该技术把数据变量转换为等量或更少的不相关变量,称为主成分(PCs)。
这次,sklearn满足我们本次分析的所有需求:
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
上述片段中我们实例化了一个PCA对象,用于计算前两个主成分。转换计算如下:
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()
可以注意到上图和第一章提到的有些相似,不过这次变色鸢尾(红色的)和维吉尼亚鸢尾(绿色的)的间隔更清晰了。
PCA将空间数据方差最大化,我们可以通过方差比判断PCs包含的信息量:
print (pca.explained_variance_ratio_)
#[ 0.92461621 0.05301557]
现在我们知道第一个PC占原始数据的92%的信息量而第二个占剩下的5%。我们还可以输出在转化过程中丢失的信息量:
print (1-sum(pca.explained_variance_ratio_))
#0.0223682249752
在本例中我们损失了2%的信息量。
此时,我们可以是应用逆变换还原原始数据,
可以证明的是,由于信息丢失逆变换不能给出准确的原始数据。我们可以估算逆变换的结果和原始数据的相似度:
data_inv = pca.inverse_transform(pcad)
print (abs(sum(sum(data - data_inv))))
#5.10702591328e-15
可以看出原始数据和逆变换计算出的近似值之间的差异接近于零。通过改变主成分的数值来计算我们能够覆盖多少信息量是很有趣的:
for i in range(1,5):
pca = PCA(n_components=i)
pca.fit(data)
print (sum(pca.explained_variance_ratio_) * 100,'%' )
#92.4616207174 %
#97.7631775025 %
#99.481691455 %
#100.0 %
PCs用得越多,信息覆盖就越全,不过这段分析有助于我们理解保存一段特定的信息需要哪些组件。例如,从上述片段可以看出,只要使用三个PCs就可以覆盖鸢尾花数据集的几乎100%的信息。
用python slearning类库实现数据挖掘(python3.x)的更多相关文章
- 【.NET调用Python脚本】C#调用python requests类库报错 'module' object has no attribute '_getframe' - IronPython 2.7
最近在开发微信公众号,有一个自定义消息回复的需求 比如用户:麻烦帮我查询一下北京的天气? 系统回复:北京天气,晴,-℃... 这时候需要根据关键字[北京][天气],分词匹配需要执行的操作,然后去调用天 ...
- python专题-Mysql数据库(python3._+ PyMysql)
之前写过一篇 Python使用MySQL数据库的博客,主要使用的是Python2和MySQLdb驱动. python使用mysql数据库 Python2 ---> Python3 MySQLdb ...
- python之模块copy_reg(在python3中为copyreg,功能基本不变)
# -*- coding: utf-8 -*-#python 27#xiaodeng#python之模块copy_reg(在python3中为copyreg,功能基本不变) import copy_r ...
- Python 标准类库- 因特网协议于支持之UUID
标准类库- 因特网协议于支持之UUID by:授客 QQ:1033553122 测试环境 python3 UUID生成函数定义 uuid.getnode() 获取一个表示硬件地址的48位正整数.第 ...
- python 标准类库-并行执行之subprocess-子进程管理
标准类库-并行执行之subprocess-子进程管理 by:授客QQ:1033553122 1.使用subprocess模块 以下函数是调用子进程的推荐方法,所有使用场景它们都能处理.也可用Popen ...
- [转]python 常用类库!
Python学习 On this page... (hide) 1. 基本安装 2. Python文档 2.1 推荐资源站点 2.2 其他参考资料 2.3 代码示例 3. 常用工具 3.1 Pytho ...
- [python] Ubuntu 环境下安装 python3.5 + pip
一般情况下先添加PPA,但是我添加PPA会报错: sudo add-apt-repository ppa:fkrull/deadsnakes ubuntu add-apt-repository: co ...
- Python基础之Windows下Python3.x环境搭建
本文介绍使用Python3.x搭建Python环境,文章最后将使用Windows自带的cmd写一个简单的Python程序. 下载Python环境安装包 在https:/www.python.org/下 ...
- Python开发:Python2和Python3的共存和切换使用
从python2到python3,这两个版本可以说是从语法.编码等多个方面上都有很大的差别.为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容,也就是说许多针对早期Python2版 ...
随机推荐
- 安全测试===dos攻击和ddos攻击
Dos攻击: dos攻击是Denial of Service的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务 DoS攻击是指故意的攻击网络协议实现的缺 ...
- 142.Linked List Cycle II---双指针
题目链接 题目大意:141题目的扩展,给出单链表,判断是否有环,如果有环,找出环的开始的结点,如果没有环,返回null. 法一(借鉴):在已经找出单链表环的基础上再找开始结点,要时刻记住这个环不一定是 ...
- java基础8 构造函数和构造代码块
一.构造函数 1 构造函数的作用 给对应的对象进行初始化. 2 构造函数的格式 修饰符 函数名(形式参数){ //函数名就是类名 函数体 } 举例说明: class Perosn{ private i ...
- C语言花括号
由于C语言本身就是函数式语言,说白了,C程序就是由函数构成的! 所以花括号肯定是用在函数之中,包括函数中的各种流程控制语句中. 实际上,C程序中花括号{}的作用:就是把多个单条语句用花括号{}括起来组 ...
- CSS3中的矩阵
CSS3中的矩阵 CSS3中的矩阵指的是一个方法,书写为matrix()和matrix3d(),前者是元素2D平面的移动变换(transform),后者则是3D变换.2D变换矩阵为3*3,如下面矩阵示 ...
- 小技巧:tar命令打包目录时,排除文件和目录的命令
今天不巧要用上,百度. tar zcvf fd.tar.gz pardir --exclude=pardir/file1 --exclude=pardir/dir1
- Redis实战(六)
查询数据 1.使用Linq匹配关键字查询 using (var redisClient = RedisManager.GetClient()) { var user = redisClient.Get ...
- win7下docker环境centos容器中安装mysql5.7
docker环境基于镜像skiychan/nginx-php7,进行安装 ps:skiychan/nginx-php7此镜像已封装nginx1.15.3+php7.2.9 1.环境配置 配置共享文件夹 ...
- HTML5 Canvas 初探
仅仅只是一个简单的hello world. js代码很简单: <!DOCTYPE HTML> <html lang="cn"> <head> & ...
- c# winform读取及发送串口信号
请参考C#的API文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.io.ports.serialport?redirectedfrom=MS ...