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,说明生成的数据集中,测试集占40\%,训练集占60\%


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

  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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容