机器学习scikit-learn(一)

来源:互联网 发布:克苏鲁跑团软件 编辑:程序博客网 时间:2024/05/02 00:03

机器学习scikit-learn

在数据分析过程中,我们经常会碰到各种各样的问题。如何获取外部数据?如何处理脏数据?如何处理缺失值?若有许多特征,我们减少特征?建立各种模型中算法的细节?到最后,面对多种模型,我们该如何选择?这些问题,都将在此文中得到解答。此文分为五个部分:

  • 建立模型的之前的工作
  • 建立线性模型
  • 聚类分析
  • 分类
  • 建立模型之后的工作

建立模型前的工作

如何从外界获取数据?

获取外界数据有很多种方法,有直接下载、API和爬虫等,这里只介绍scikit-learn内置的数据,这些数据用来熟悉各种算法。

from sklearn import datasets #sklearn有数据集的模块

其中的数据有两类,一类是小数据,直接包含在模块之中;另一类是大数据,需要你自己下载,sklearn提供函数下载。

boston = datasets.load_boston()#从数据集中载入波斯顿数据print boston.DESCR #可以查看数据的描述housing = datasets.fetch_california_housing() #从网上下载大数据

这些数据被载入时,不是Numpy的array格式,而是一个叫Bunch的格式,Bunch是一个特殊的字典,字典中的Keys作为数据的属性。

X,y = boston.data,boston.target #X为特征数据,有y是预测数据  

UCI Machine Learning Repository其中有更多的数据集用来实验算法,我们可以尽情的利用这些数据集,而不用担心,自己学习了各种算法,而没有数据集去实现!

为简单的分析生成样本数据

datasets模块中有一个make_函数,可以生成一些简单的数据,以便于分析。

import sklearn.datasets as d #简写为了方便reg_data = d.make_regression() #生成回归数据complex_reg_data = d.make_regression(1000,10,5,2,1.0) #生成复杂点的回归数据-1000*10的矩阵,5个有效变量,2个目标变量,1.0的偏差classification_set = d.make_classification(weight=[0.1]) #生成分类数据blobs = d.make_blobs() #生成聚类数据  

datasets模块中还有更多的函数去生成各种各样的数据,可以看一看,等需要的时候再用。

标准化数据

缩放数据是非常重要的步骤,许多机器学习算法,在数据有不同的尺度的情况下根本无法发挥用处。比如利用支持向量机进行预测,当你的一个特征变量是0-1,而另一个变量的范围却是0-10000,这时支持向量机的表现会非常差,以至于产生一个错误的模型。我们常用的标准化的方法是正态化,z-scores。scikit-learn有一个preprocessing模块,利用这个模块中的scale、StandardScaler和MinMaxScaler我们就可以进行缩放数据的操作。

from sklearn import preprocessingX_2 = preprocessing.scale(X) #缩放波斯顿特征数据,将标准差都变为1.my_scaler = preprocessing.StandardScaler() #与以上相同my_scaler.fit(X)my_scaler.transform(X)#也可以缩放范围my_minmax_scaler = preprocessing.MinMaxScaler() #缩放范围,默认为[0,1]my_minmax_scaler.fit(x)my_minmax_scaler.transform(x)my_odd_scaler = preprocessing.MinMaxScaler(feature_range = (-5,5)) #缩放范围改为[-5,5]

通过阈值创建二元变量

有一些变量是连续变量,我们想把它变成二元变量,利于分析。就比如决策树中,我们有一变量是工资,为连续变量,而连续变量不利于决策树建模,于是利用阈值将其分为二元变量,高工资和低工资。这个方法在preprocessing.binarize和preprocessing.Binarizer都可实现。

new_target=preprocessing.binarize(boston.target,threshold=boston.target.mean) #把波斯顿数据目标变量变成二元变量,阈值是均值,大于均值为1bin = preprocessing.Binarizer(boston.target.mean())new_target = bin.fit_transform(boston.target)

处理分类变量

分类变量能给我们提供更多的信息,有时候却非常麻烦,因为它可能是文字的,对于文字,我们根本无法用算法进行分析。我们就需要去处理分类变量,将分类变量变成二元变量。例如分类变量红色、绿色、黑色,我们根据其是否为红色、绿色、黑色,转化为二元变量。在sklearn里有OneHotEncoder、DictVectorizer和patsy用来处理分类变量。

from sklearn import preprocessingtext_encoder = preprocessing.OneHotEncoder()text_encoder.fit_transform(iris.target).toarray()from sklearn.feature_extraction import DictVectorizerdv = DictVectorzier()my_dict = [{'species':iris.target_names[i]} for i in y]dv.fit_transform(my_dict).toarray()

处理缺失值

如何处理缺失值在实践中非常重要,幸运的是,我们有很多方法去处理缺失值。对于缺失值,我们可以直接去除这个样本,如果你的样本足够多的话。但是一般我们都是用平均值、中位数和众数去代替。其中实现的方法可以利用sklearn中的Imputer来进行处理。

from sklearn import preprocessingimpute = preprocessing.Imputer() #默认为平均值impute.fit_transform(X)

流水线-多步骤预处理

当你的预处理步骤较多时,使用流水线比较方便,更有利于以后的交叉验证。方法实现是利用pipeline.当我们不是用pipeline的预处理步骤是:

from sklearn import preprocessingimpute = preprocessing.Imputer()scaler = preprocessing.StandarScaler()X_imputed = impute.fit_transform(X)X_imp_and_scaled = scaler.fit_transform(X)

而当我们使用pipeline时:

from sklearn import pipelinepipe = pipeline.Pipeline([('impute',impute),('scaler',scaler)])new_x = pipe.fit_transform(X)

降维

PCA是利用线性转化把数据转换到特征空间中,得到前几个能代表最多信息的主成分,从而达到降维的目的,其实现方法是decompositin.PCA.

from sklearn import decompositionpca = decomposition.PCA()pca.fit_transform(X)pca.explained_variance_ratio_

因子分析是另一种降维方法,其假定变量中有一些公共因子,公共因子的数目是少于变量的,这样就达到降维的目的,其实现方法是decomposition.FactorAnalysis.

from sklearn import decompositionfa = decomposition.FacorAnalysis()fa.fit_transform(X)

核PCA是先利用核技巧把数据投射到高维空间,然后利用PCA进行降维。这种方法对非线性数据进行降维。核函数有:polynomial、rbf、sigmoid、cosine、precomputed

kpca = decomposition.KernelPCA(kernel='cosine',n_components=1)X_transformed = kpca.fit_transform(X)

截断SVD,截断奇异值分解,是另一种降维方法,其可以用在稀疏矩阵而PCA不能。

from sklearn.decomposition import TruncatedSVDsvd = TruncatedSVD(2)X_transformed = svd.fit_transform(X)

到此学习了如何获取数据,如何对数据进行预处理(标准化、缺失值和降维),这些都是非常基础的知识,也是非常重要的知识。下节我们会试试去建立简单模型——线性模型。

参考:《scikit-learn cookbook》by Trent Hauck

0 0
原创粉丝点击