文章目录

Scikit-learn 简介

模型与方法

数据预处理

缺失值处理

数据规范化


Scikit-learn 简介

  Python之所以能在数据科学与人工智能应用领域中占有重要位置,不仅是因为其免费开源易数据处理,更重要的是它还提供了丰富且功能强大的机器学习模型与算法程序包。本篇主要介绍Python中的机器学习包:Scikit-learn,包括其经典模型原理及实现方法,从而帮助读者掌握其基本理论,并付诸于实践应用。

  Scikit-learn 是机器学习领域非常热门的一个开源包,它整合了众多机器学习算法,基于Python语言编写而成,可以免费使用。

Scikit-learn基本功能主要分为六大部分:分类、回归、聚类、数据降维、模型选择和数据预处理。

模型与方法

Scikit-learn 的主要模型及其使用方法,内容如下:

  1. 数据预处理。主要介绍缺失值的均值、中位数、最频繁值填充方法,数据的均值-方差、极差规范化方法。
  2. 数据降维。主要介绍主成分分析方法,本章中也将其归为数据预处理部分。
  3. 回归。主要介绍常用的线性回归、神经网络非线性回归。
  4. 分类。主要介绍支持向量机、逻辑回归、神经网络分类方法。
  5. 聚类。主要介绍常用的K-均值聚类算法。
  6. 模型选择。这部分主要通过实际案例过程中不同模型之间的比较来实现模型选择。
     

        在Anaconda发行版中已经集成了Scikit-learn分析包,无需再进行安装,在Spyder脚本文件中直接导入即可使用。由于Scikit-learn包的内容非常多,我们在使用过程中导入相关的模块即可,无需整个机器学习包都导进去,如图所示:

         图中显示了在temp.py脚本文件中导入了包括数据预处理(缺失值填充、均值-方差规范化、极差法规范化、主成分分析)、线性回归、逻辑回归、神经网络(分类和回归)、支持向量、K-均值聚类相关模块。

数据预处理

  在实际数据挖掘分析中,数据预处理是必不可少的环节,甚至会占用到整个任务的60%以上的时间。同时经过数据预处理,能保障数据的质量,从而减少模型的误差。

数据挖掘分析中有一句至理名言:“垃圾进,垃圾出”,也就是说如果数据质量得不到保障,模型挖掘出来的结果也没有实际的使用价值。因此在数据挖掘分析任务中,需要特别注意数据的预处理。本小节中,我们介绍的数据预处理方法包括

  • 缺失值处理
  • 数据的规范化
  • 属性规约(主成分分析)

缺失值处理

       在数据处理过程中缺失值是常见的,需要对其进行处理。前面已经介绍过利用pandas包中的fillna函数,可以对缺失值进行填充。但是这种填充方法通过指定值进行填充,没有充分利用数据集中的信息。为了克服这种填充方法的缺点,这里介绍Scikit-learn包中能充分利用数据信息的三种常用填充策略,即均值填充、中位数填充和最频繁值填充。这里填充方式有两种:按行和按列。所谓按行或者按列均值填充策略,就是对某行或者某列中的所有缺失值用该行或者该列中非缺失部分的值的平均值来表示;中位数填充策略和最频繁值填充策略类似,即取某行或某列中非缺失部分的值的中位数和出现频次最多的值来代替其缺失值。

       在介绍填充策略之前,我们先定义待填充的数据变量datacC,其中data变量通过读取本书案例资源中的Excel数据文件“missing.xlsx”获得,示例代码如下

        import pandas as pd
        import numpy as np
        data=pd.read_excel('missing.xlsx')                        #数据框data
        c=np.array([[1,2,3,4],[4,5,6,np.nan],[5,6,7,8],[9,4,np.nan,8]])   #数组c
        C=pd.DataFrame(c)                                    #数据框C

       需要注意的是,填充的数据结构要求为数组或者数据框,元素则要求为数值类型。因此data数据中的b列不能进行填充。使用Scikit-learn中的数据预处理模块进缺失值填充的基本步骤如下:

1、入数据预处理中的填充模块Imputer,其命令如下:

from sklearn.preprocessing import Imputer

2、Imputer创建填充对象imp,其命令如下:

   imp = Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0) #创建按列均值填充策略对象。

中对象参数说明如下:

  • ******strategy:均值(mean)、中位数(median)、最频繁值(most_frequent)三种填充策略

******axis=0:按列填充方式

******axis=1:按行填充方式

调用填充对象imp中的fit()拟合方法,对待填充数据进行拟合训练,其命令如下:

imp.fit(Data)  #Data为待填充数据集变量

调用填充对象imp中的transform()方法,返回填充后的数据集了,其命令如下:

FData=imp.transform(Data) #返回填充后的数据集FData

下面对C数据框中的数据采用按列均值填充策略、对c数组中的数据采用按行中位数填充策略、对data数据中的ac列采用按列最频繁值填充策略进行填充。示例代码和执行结果如下

# 1.均值填充策略
from sklearn.preprocessing import Imputer 
fC=C 
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit(fC)
fC=imp.transform(fC)

执行结果如图:

# 2.中位数填充策略
imp = Imputer(missing_values='NaN', strategy='median', axis=1)
fc=c
imp.fit(fc)
fc=imp.transform(fc)

# 3.最频繁值填充策略
fD=data[['a','c']]
imp = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
imp.fit(fD)
fD=imp.transform(fD)

数据规范化

        由于变量或指标的单位不同,造成有些指标数据值非常大,而有些非常小,在模型运算过程中大的数据会把小的数据覆盖掉,造成模型失真。因此,需要对这些数据做规范化处理,或者说去量纲化。这里介绍两种常用的规范化处理方法:均值-方差规范化、极差规范化。

       谓均值-方差规范化,是指变量或指标数据减去其均值再除以标准差得到的新的数据。新的数据均值为0,方差为1,其公式如下

𝑥=𝑥𝑚𝑒𝑎𝑛(𝑥)𝑠𝑡𝑑(𝑥)x^∗=(x-mean(x))/(std(x))

       而极差规范化是指变量或者指标数据减去其最小值再除以最大最小值之差得到的新的数据。新的数据取值范围在[0,1]之间,其计算公式为

𝑥=𝑥min⁡(𝑥)max𝑥min⁡(𝑥)x^∗=(x-min⁡(x))/(max⁡(x)-min⁡(x))

       介绍规范化方法之前,先将待规范化数据文件读入Python中。该数据文件在本书案例资源包中,它是一个Python格式的二进制数据文件,文件名为“data.npy”,可以采用Numpy包中的load函数读取,示例代码如下

import numpy as np
data=np.load('data.npy')
data=data[:,1:]

        从图中可以看出,据存在空值(NAN值),在进行规范化之前需要先对其进行填充处理,这里采用按列均值填充策略进行填充,示例代码如下:

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit(data)
data=imp.transform(data)

         如所示为填充后的数据,其变量名仍然为data。为了区分,记X=dataX1=data,对X作均值-方差规范化处理,对X10-1规范化处理。下面分别对两种规范化方法进行介绍

首先对X做均值-方差规范化处理,步骤如下:

1.导入均值-方差规范化模块StandardScaler
from sklearn.preprocessing import StandardScaler
2.利用StandardScaler创建均值-方差规范化对象scaler
scaler = StandardScaler()
3.调用scaler对象中的fit()拟合方法,对待处理的数据X进行拟合训练
scaler.fit(X) 
4.调用scaler对象中的transform()方法,返回规范化后的数据集X(覆盖原未规范化的X)
X=scaler.transform(X)  

对填充后的数据X1做0-1规范化处理

示例代码如下:

from sklearn.preprocessing import MinMaxScaler   
X1=data
min_max_scaler = MinMaxScaler()
min_max_scaler.fit(X1)
X1=min_max_scaler.transform(X1)
执行结果如图5-9所示。


更多推荐