数据分析

数据分析 第三章

模型搭建和评估——建模

数据分析所需要的库

Numpy介绍
Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。
用它来存储和处理大型矩阵,比Python自身的嵌套列表结构高效的多。

Pandas介绍
基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量的库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。最具有统计意味的工具包,某些方面优于R软件。
数据结构有一维的Series,二维的DataFrame,三维的Panel。

Matplotlib介绍

Python中最著名的绘图系统,很多其他的绘图例如seaborn(针对pandas绘图而来)也是由其封装而成。
这个绘图系统操作起来很复杂,和R的ggplot,lattice绘图相比显得望而却步。

Scipy介绍

scipy包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值、积分、优化、图像处理、特殊函数等等。
scipy可以与其他标准科学计算程序库进行比较,比如GSL,或者Matlab工具箱。scipy是Python中科学计算程序的核心包;它用于有效地计算numpy矩阵,来让numpy和scipy协同工作。

Seaborn介绍

Matplotlib是Python主要的绘图库,但是要经过设置和调整以后,才能让图变得紧致。Seaborn本质上使用matplotlib作为核心库(就像Pandas对Numpy一样)。
Seaborn在默认情况下就能创建赏心悦目的图表,创建具有统计意义的图;能理解pandas的DataFrame类型。

监督学习和无监督学习

监督学习
从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求包括输入输出,也可以说是特征和目标。训练集中的目标是由人标注的。监督学习就是最常见的分类问题,通过已有的训练样本(即已知数据及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优表示在某个评价准则下是最佳的),再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现分类的目的。也就具有了对未知数据分类的能力。监督学习的目标往往是让计算机去学习我们已经创建好的分类系统(模型)。
监督学习是训练神经网络和决策树的常见技术。这两种技术高度依赖事先确定的分类系统给出的信息,对于神经网络,分类系统利用信息判断网络的错误,然后不断调整网络参数。对于决策树,分类系统用它来判断哪些属性提供了最多的信息。
常见的有监督学习算法:回归分析和统计分类。最典型的算法是KNN和SVM。

无监督学习
输入数据没有被标记,也没有确定结果。样本数据类别未知,需要根据样本间的相似性对样本进行分类(聚类)试图使类内差距最小化,类间差距最大化。通俗说,就是在实际应用中,不少情况下无法预先知道样本的标签,也就是没有训练样本对应的类别,因而只能从原先没有样本标签的样本集开始学习分类器的设计。

非监督学习目标不是告诉计算机怎么做,而是让它自己去学习怎样做事情。非监督学习有两种思路。第一种思路是在指导Agent时不为其明确分类,而是成功时,采用某种形式的激励制度。需要注意的是,这类训练通常会置于决策问题的框架里,因为它的目标不是为了产生一个分类系统,而是做出最大回报的决定,这种思路很好的概括了现实世界,agent可以对正确的行为做出激励,而对错误行为做出惩罚。

无监督学习的方法分为两大类:
(1)一类为基于概率密度函数估计的直接方法:指设法找到各类别在特征空间的分布函数,再进行分类。
(2)另一类是称为基于样本间相似性度量的简洁聚类方法:其原理是设法定出不同类别的核心或初始内核,然后依据样本与核心之间的相似性度量将样本聚集成不同的类别。
利用聚类结果,可以提取数据集中隐藏信息,对未来数据进行分类和预测。应用于数据挖掘,模式识别,图像处理等。

两者的区别
1、有监督学习方法必须要有训练集与测试样本。在训练集中找规律,而对测试样本使用这种规律。而非监督学习没有训练集,只有一组数据,在该组数据内寻找规律。
2、有监督学习的方法就是识别事物,识别的结果表现在给待识别数据加上了标签。因此训练样本集必须由带标签的样本组成。而非监督学习方法只有要分析的数据集的本身,预先没有什么标签。如果发现数据集呈现某种聚集性,则可按自然的聚集性分类,但不予以某种预先分类标签对上号为目的。
3、非监督学习方法在寻找数据集中的规律性,这种规律性并不一定要达到划分数据集的目的,也就是说不一定要“分类”。
这一点是比监督学习方法的用途要广。譬如分析一堆数据的主分量,或分析数据集有什么特点都可以归于非监督学习方法的范畴。
4、用非监督学习方法分析数据集的主分量与K-L变换计算数据集又有区别。后者从方法上将不是学习方法。因此用K-L变换找主分量不属于无监督学习方法。因此用K-L变换找主分量不属于无监督学习方法。即方法上不是。而通过学习逐渐找到规律性这体现了学习方法这一点。在人工神经元网络中寻找主分量的方法属于无监督学习方法。

sklearn

Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。

Sklearn具有以下特点:
简单高效的数据挖掘和数据分析工具
让每个人能够在复杂环境中重复使用
建立Numpy、Scipy、MatPlotLib之上

Sklearn通用学习模式
首先引入需要训练的数据,Sklearn自带部分数据集,也可以通过相应方法进行构造。然后选择相应机器学习方法进行训练,训练过程中可以通过一些技巧调整参数,使得学习准确率更高。模型训练完成之后便可预测新数据,然后我们还可以通过MatPlotLib等方法来直观的展示数据。另外还可以将我们训练好的Model进行保存,方便移动到其他平台,不必重新训练。

Sklearn datasets
Sklearn提供一些标准数据,我们不必再从其他网站寻找一些数据进行训练。
除了引入数据之外,我们还可以通过load_sample_images()来引入图片。
除了sklearn提供的一些数据之外,还可以自己来构造一些数据帮助我们。

from sklearn import datasets #引入数据集
#构造的各种参数可以根据自己需要调整
x, y = datasets.make_regression(n_samples=100, n_features=1, n_targets=1, noise=1)

#绘制构造的数据
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(x, y)
plt.show()

Slearn Model的属性和功能
数据训练完成之后得到模型,我们可以根据不同模型得到相应的属性和功能,并将其输出得到直观结果。假如通过线性回归训练之后得到线性函数y=0.3x+1,我们可以通过_coef得到模型系数为0.3,通过_intercept得到模型的截距为1.

from sklearn import datasets
from sklearn.linear_model import LinearRegression #引入线性回归模型

#引入数据
load_data=datasets.load_boston()
data_X=load_data.data
data_Y=load_data.target
print(data_X.shape)

#训练数据
model=LinearRegression()
medel.fit(data_X,data_y)
model.predict(data_X[:4,:])#预测前4个数据

#属性和功能
print(model.coef)
'''
#此处省略数据
'''
print(model.intercept_)

print(model.get_params())#得到模型的参数

print(model.score(data_X,data_y))#对训练情况进行打分

Sklearn数据预处理

from sklearn.model_selection import train_test_split
from sklearn.datasets.samples_generator import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as plt

#生成的数据如下图所示
plt.figure
X,y = make_classification(n_samples=300,n_features=2,n_redundant=0,n_informative=2,random_state=22,n_clusters_per_class=1,scale=100)
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

#利用minmax方式对数据进行规范化
X=preprocessing.minmax_scale(X) #feature_range=(-1, 1)可设置重置范围
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
clf=SVC()
clf.fit(X_train,y_train)
print(clf.score(X_test,y_test))

交叉验证

交叉验证的基本思想是将原始数据进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小拟合过程。还可以从有限的数据中获取尽可能多的有效信息。
机器学习任务中,拿到数据后,我们首先会将原始数据集分为三部分:训练集、验证集和测试集。训练集用于训练模型,验证集用于模型的参数选择配置,测试集对于模型来说是未知数据,用于评估模型的泛化能力。不同的划分会得到不同的最终模型。

现在利用k折交叉验证分割数据,首先将数据分为5组,然后再从5组数据之中选择不同数据进行训练。

from sklearn.datasets import load_irls
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

#引入数据
iris=load_iris()
X=iris.data
y=iris.target

#训练数据
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
#引入交叉验证,数据分为5组进行训练
from sklearn.model_selection import cross_val_score
knn=KNeighborsClassifier(n_neighbors=5)#选择邻近的5个点
scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy')#评分方式为accuracy
print(scores)#每组的评分结果

print(scores.mean())#平均评分结果

保存模型

from sklearn import svm
from sklearn import datasets

#引入和训练数据
iris=datasets.load_iris()
X,y=iris.data,iris.target
clf=svm.SVC()
clf.fit(X,y)

#引入sklearn中自带的保存模块
from sklearn.externals import joblib
#保存model
joblib.dump(clf,'sklearn_save/clf.pkl')

#重新加载model,只有保存一次后才能加载model
clf3=joblib.load('sklearn_save/clf.pkl')
print(clf3.predict(X[0:1]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值