Python机器学习及分析工具:Scikit-learn篇

Sklearn模块

  Scikit-learn是专门面向机器学习的Python开源框架,它实现了各种成熟的算法,并且易于安装与使用。

数据集

  在机器学习过程中,经常需要使用各种各样的数据集,因此Scikit-learn框架也提供一些常用的数据集。

序号 数据集名称 调用方式 数据描述
1 鸢尾花数据集 Load_iris() 用于多分类任务的数据集
2 波士顿房价数据集 Load_boston() 用于回归任务的经典数据集
3 糖尿病数据集 Load_diabetes() 用于回归任务的经典数据集
4 手写数字数据集 Load_digits() 用于多分类任务的数据集
5 乳腺癌数据集 Load_breast_cancer() 经典的用于二分类任务的数据集
6 体能训练数据集 Load_linnerud() 经典的用于多变量回归任务的数据集

  接下来以鸢尾花数据集为例,学习如何在Scikit-learn中调用数据集。鸢尾花数据集采集的是鸢尾花的测量数据及其所属类别,测量数据包括萼片长度、萼片宽度、花瓣长度、花瓣宽度;类别有3类:Iris Setosa,Iris Versicolour,Iris Virginica,该数据集一般用于监督学习中的多分类问题。

from sklearn.datasets import load_iris
iris = load_iris()
print(iris.data)
# 输出数据所属的真实标签
print(iris.target)
# 输出数据的纬度
print(iris.data.shape)
# 输出数据标签的名字
print(iris.target_names)
部分数据截图

数据所属标签
数据纬度与数据类别

数据集划分

  在Python机器学习概论中曾经提过,在模型训练时,一般会把数据集划分成训练集、验证集和测试集,其中训练集用来估计模型验证集用来确定网络结构或控制模型复杂程度的参数,而测试集用于检验最终选择的最优模型的性能优劣。在Scikit-learn中一般采用一下几种方式进行数据划分:

  • 使用train_test_split()对数据集进行划分

  Scikit-learn中使用sklearn.model_selection模块对数据集进行划分,而该模块中的train_test_split()时交叉验证中常用的函数,功能是从样本中随机按比例选取train_data和test_data,详情如下:

[X_train,X_test,Y_train,Y_test] = train_test_split(train_data,train_target,test_size,random_state)

train_data所要划分的样本特征集
train_target所要划分的样本结果
test_size样本占比,若为整数则为样本的数量
random_state随机数种子,同时也是该组随机数的编号,在需要重复实验时,能生成相同的随机数。为0、为空或不同时,生成不同的随机数;当种子相同时即使实例不同也会产生相同的随机数
X_train生成的训练集的特征
X_test生成的测试集的特征
Y_train生成的训练集的标签
Y_test生成的测试集的特征


  通过一个简单的实例来演示如何使用这个函数将数据集快速打乱,形成训练集和数据集。

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

iris = load_iris()
print('iris数据集的大小:',iris.data.shape)
print('目标数据集的大小:',iris.target.shape)
X_train,X_test,Y_train,Y_test = train_test_split(iris.data,iris.target,test_size = 0.4,random_state = 0)
print('生成的训练集的特征个数(数据个数):',X_train.shape)
print('生成的训练集的标签个数(样本个数):',Y_train.shape)
print('生成的测试集的特征(数据个数):',X_test.shape)
print('生成的测试集的标签个数(样本个数):',Y_test.shape)
print('iris数据集前5行的数据:',iris.data[:5])
print('生成的训练集的前5行的数据:',X_train[:5])
运行结果

在这个实例中train_test_split()函数的参数test_size=0.4,说明生成的数据集中,测试集占,训练集占。


  • 对数据集进行指定次数的交叉验证并对每次验证效果进行评估

  Scikit-learn使用cross_val_score()对数据集进行制定次数的交叉验证并为每次验证结果进行测评,详情请参考下述代码:

from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn import svm
iris = load_iris()
# 使用支持向量机模型进行验证
clf = svm.SVC(kernel='linear',C=1)
# 进行5折交叉验证
scores = cross_val_score(clf,iris.data,iris.target,cv=5)
print(scores)
print(scores.mean())
运行结果
  • k折交叉验证
      K折交叉验证是将数据集分成K份的官方给定方案,所谓K折就是将数据集通过K次分割,使所有数据即在训练集中出现又在测试集中出现,并且,每次分割不会有重叠,相当于无放回抽样。详情参考下面的代码:
import numpy as np
from sklearn.model_selection import KFold

X = ['a','b','c','d','e','f']
# 进行2折交叉验证
kf = KFold(n_splits=2)
# 输出拆分结果
for train,test in kf.split(X):
    print(train,test)
    print(np.array(X)[train],np.array(X)[test])
运行结果
  • 留一法
      留一法即LeaveOneOut是KFlod的一个特例,一般在数据较少时使用。例如,若N个样本采用LeaveOneOu验证法,就是将样本打乱,然后均匀分成N份,轮流选择其中的N-1份进行训练,剩下的一份做验证,计算预测误差平方和,最后把N次的预测误差平方和的平均值作为选择最优模型结构的依据。详情请参考下面的代码:
import numpy as np
from sklearn.model_selection import LeaveOneOut

X = ['a','b','c','d','e','f']
loo = LeaveOneOut()
for train,test in loo.split(X):
    print(train,test)
    print(np.array(X)[train],np.array(X)[test])

注:一般在数据较少时使用K折交叉验证和留一法。

数据预处理

数据预处理Scikit-learn中的数据预处理模块包括数据的特征提取和归一化,是机器学习过程中第一个也是最重要的环节。其中特征提取是指将文本或图像数据转换为可用于机器学习的数字变量,归一化则是指将输入数据转换为具有零均值和单位权方差的新变量,但因为大多数时候都做不到精确到零,因此会设置一个可接受的范围,一般要求范围为0~1。


数据降维

数据降维是指使用主成分分析(PCA)、非负矩阵分解(NMF)或特征选择等降维技术来减少要考虑的随机变量个数,其主要应用场景包括可视化处理和效率提升。

模型选择

模型选择是指对于给定参数和模型的比较、验证和选择,其主要目的是通过参数调整来提升精度。目前Scikit-learn实现的模块包括格点搜索、交叉验证和各种针对预测误差评估的度量函数。

分类

分类是指识别给定对象所属类别,属于监督学习的范畴,最常见的应用场景包括垃圾邮件检测和图像识别。目前Scikit-learn已经实现的分类算法有支持向量机(SVM)、K-近邻、逻辑回归、随机森林、决策树以及多层感知器(MLP)等。


回归

回归是指预测与给定对象相关联的连续值属性,最常见的应用场景包括药物z反应和股票价格预测,目前Scikit-learn已经实现的回归算法包括支持向量回归(SVR)、脊回归、Lasso回归、弹性网络(Elactic Net)、最小角回归(LARS)、贝叶斯回归及各种不同的鲁棒回归算法。


聚类

聚类是指自动识别具有相似属性的给定对象,并将其分组为集合,属于无监督学习的范畴。最常见的应用场景包括顾客细分和试验结果分组。目前Scikit-learn已经实现的聚类算法包括K-均值聚类、谱聚类、均值偏移、分层聚类、DBSCAN聚类等。


注:这里只给出了相关模块的介绍,详细内容请参考中文官方网站:scikit-learn

Scikit-learn提供的通用模型接口:

model.fit():训练模型,对于监督模型为fit(X,y),对于非监督模型是fit(X)
监督模型提供的接口:

model.predict(X_new):预测新样本
model.predict_proba(X_new):预测概率,仅针对部分模型(如LR)
model.score():得分越高,fit越好

非监督模型的接口

model.transform():从数据中学到新的‘基空间’
model.fit_transform():从数据中学到新的基并将这个数据按照这组“基”进行转换。

from sklearn.datasets import load_iris
from sklearn import svm

iris = load_iris()
# 查看数据大小
print(iris.data.shape)

# 建立svm线性分类器
clf = svm.LinearSVC()
# 用数据训练模型
clf.fit(iris.data,iris.target)
# 训练好后,输入新的数据进行预测
clf.predict([[5.0,3.6,1.3,0.25]])
# 查看训练好的模型参数
clf.coef_
# 得分越高,fit的训练效果越好
clf.score(iris.data,iris.target)

你可能感兴趣的:(Python机器学习及分析工具:Scikit-learn篇)