https://cloud.tencent.com/developer/news/58202

简介

今天为大家介绍的是scikit-learnsklearn是一个Python第三方提供的非常强力的机器学习库,它包含了从数据预处理到训练模型的各个方面。在实战使用scikit-learn中可以极大的节省我们编写代码的时间以及减少我们的代码量,使我们有更多的精力去分析数据分布,调整模型和修改超参。(sklearn为包名

基本概括

sklearn拥有可以用于监督和无监督学习的方法,一般来说监督学习使用的更多。sklearn中的大部分函数可以归为估计器(Estimator)转化器(Transformer)两类。

估计器(Estimator)其实就是模型,它用于对数据的预测或回归。基本上估计器都会有以下几个方法:

fit(x,y):传入数据以及标签即可训练模型,训练的时间和参数设置,数据集大小以及数据本身的特点有关

score(x,y)用于对模型的正确率进行评分(范围0-1)。但由于对在不同的问题下,评判模型优劣的的标准不限于简单的正确率,可能还包括召回率或者是查准率等其他的指标,特别是对于类别失衡的样本,准确率并不能很好的评估模型的优劣,因此在对模型进行评估时,不要轻易的被score的得分蒙蔽。

predict(x)用于对数据的预测,它接受输入,并输出预测标签,输出的格式为numpy数组。我们通常使用这个方法返回测试的结果,再将这个结果用于评估模型。

转化器(Transformer)用于对数据的处理,例如标准化、降维以及特征选择等等。同与估计器的使用方法类似:

fit(x,y):该方法接受输入和标签,计算出数据变换的方式。

transform(x):根据已经计算出的变换方式,返回对输入数据x变换后的结果(不改变x)

fit_transform(x,y) :该方法在计算出数据变换方式之后对输入x就地转换。

以上仅仅是简单的概括sklearn的函数的一些特点。sklearn绝大部分的函数的基本用法大概如此。但是不同的估计器会有自己不同的属性,例如随机森林会有Feature_importance来对衡量特征的重要性,而逻辑回归有coef_存放回归系数intercept_则存放截距等等。并且对于机器学习来说模型的好坏不仅取决于你选择的是哪种模型,很大程度上与你超参的设置有关。因此使用sklearn的时候一定要去看看官方文档,以便对超参进行调整。

举个例子

导入数据及数据预处理

sklearndatasets中提供一些训练数据,我们可以使用这些数据来进行分类或者回归等等,以此熟悉sklearn的使用。

如下面代码所示我们读取了鸢尾属植物的分类数据集。load_iris()返回的是一个类似字典的对象通过关键字则可以获取对应的数据。

现在我们已经读取了数据,首先第一件事应当是查看数据的特点。我们可以看到标签总共有三个,所以该数据要解决的是一个三分类问题。接着我们要去查看数据特征,用pandasDataFrame展示是一个很好选择。

我们可以看到一条数据对应了4个连续特征,接着应当查看一些数据集的缺失值的比例,这一步非常重要,如果数据集中出现缺失值,在训练模型的时候就会出现问题。

sklearnpreprocessing中有提供Imputer()处理缺失值的函数,它提供了中位数、均值、众数等策略填充缺失值。但是不同情况下处理不一定使用填充来处理缺失值。因此在遇到缺失值的时候要慎重处理。幸运的是我们这个数据集中没有缺失值,这样节省了我们处理缺失值的时间。接下来要判断数据集的样本类别是否均衡。

非常幸运,我们的样本类别的比例恰好是1:1:1,如果我们样本比例失衡严重,那么我们可能需要对失衡的比例做一些调整,例如重采样欠采样等等。现在数据集看上去没有什么大的问题了,但是在训练之前,我们还是应当对数据进行标准化处理。

模型训练之前,我们要对数据进行预处理。sklearn中的preprocessing模块提供非常多的数据归一化的类。

标准化之后的数据不仅可以提高模型的训练速度,并且不同的标准会带来不一样的好处。

例如,z-score 标准化将样本的特征值转换到同一量纲下,使得不同特征之间有可比性。以上我们就是使用了z-score标准化,sklearnpreprocessing中还有一些其他的标准化方法,有兴趣的朋友可以查看官方文档。

训练模型

在处理好数据之后我们就可以训练模型了,以多元逻辑回归为例

这里我们的逻辑回归使用OVR多分类方法,

OvR把多元逻辑回归,看做二元逻辑回归。具体做法是,每次选择一类为正例,其余类别为负例,然后做二元逻辑回归,得到第该类的分类模型。最后得出多个二元回归模型。按照各个类别的得分得出分类结果。

模型优化

模型选择

对于一个分类任务,我们可以按照以上的图来选择一个比较合适的解决方法或者模型,但模型的选择并不是绝对的,事实上很多情况下你会去试验很多的模型,才能比较出适合该问题的模型。

数据划分

我们可以使用交叉验证或其他划分数据集的方法对数据集多次划分,以得出模型平均的性能而不是偶然结果。sklearn有很多划分数据集的方法,它们都在model_selection里面,常用的有

K折交叉验证:

KFold 普通K折交叉验证

StratifiedKFold(保证每一类的比例相等)

留一法:

LeaveOneOut (留一)

LeavePOut (留P验证,当P = 1 时变成留一法)

随机划分法:

ShuffleSplit (随机打乱后划分数据集)

StratifiedShuffleSplit (随机打乱后,返回分层划分,每个划分类的比例与样本原始比例一致)

以上方法除了留一法都有几个同样的参数:

n_splits:设置划分次数

random_state:设置随机种子

以上的划分方法各有各的优点,留一法、K折交叉验证充分利用了数据,但开销比随机划分要高,随机划分方法可以较好的控制训练集与测试集的比例。(通过设置train_size参数)。关于划分数据集的使用可以参照上面例子中的ShuffleSplit的用法,其他的函数使用方法大同小异,详细可查看官方文档。

超参的搜索

我们上面已经初步得出模型,并且效果看起来还不错,所以我们现在应该下想办法进一步优化这一个模型了。

我们在调参的时候需要将数据集分为三部分,分别是:训练集、验证集以及测试集。训练集用于模型的训练,然后我们根据验证集的结果去调整出泛化能力较强的模型,最后通过测试集得出模型的泛化能力。如果只把数据分为训练集和测试集,也许你能调出对于测试集最合适的参数,但模型的泛化能力也许并没有在测试集上表现的那么强。

由于鸢尾属植物的数据集并不大,如果将数据分为三部分的话,训练数据就太少了,可能提高不了模型的性能。在此只是简单的介绍sklearn中的调参方法。

model_seletion里面还提供自动调参的函数,以格搜索(GridSearchCV)为例。

通过传入字典,对比使用不同的参数的估计器的效果,得出最优的参数。这里是对逻辑回归的精度进行调整。另外我们还可以使用不同的指标来选择参数,不同的指标在sklearn.metrics

特征选择

当特征特别多的时候,且有冗余的情况下,对特征进行选择不仅能使训练速度加快,还可以排除一些负面特征的干扰。sklearnfeature_seletion提供了它许多特征选取函数,目前包括单变量选择方法递归特征消除算法。它们均为转化器,故在此不举例说明如何使用。

除了使用feature_seletion的方法选取特征外,我们也可以选择那些带有特征选择的模型进行选择特征,例如随机森林会根据特征的重要程度对特征打分。

Pineline

使用pineline可以按顺序构建从数据处理到和训练模型的整个过程。pineline中间的步骤必须转化器(对数据进行处理)。使用pineline的好处就是可以封装一个学习的过程,使得重新调用这个过程变得更加方便。中间的过程用多个二元组组成的列表表示。

上面的封装的估计器,会先用PCA将数据降至两维,在用逻辑回归去拟合。

小结

本期介绍sklearn只做简单介绍,还有一些方面没有涉及,例如特征抽取、降维等等,这些在官方文档中有详细使用方法及参数介绍。

参考来源

http://scikit-learn.org/stable/documentation.html 官方文档

https://www.jianshu.com/p/c6bfc9052325

前言

于sklearn的使用来说,目前只是想成为一名调包侠,但是调包侠起码也得知道有哪些包可以调,为此找了一些教程想快速入门,通过一番查找,终于找到了一名大佬叫做莫烦写的教程,教程短小实用,对我想快速了解sklearn来说是再适合不过了。
在教程里完成sklearn的一般使用的教程之后,为了巩固,为此写此笔记,加深理解和日后的复习。

通用模板

实例化

对于sklearn这个库来说,是用面向对象的思想来使用的。
就是每种算法都是一个对象,要使用某种算法解决问题,可以将其import进来,此时它只是个对象,只有在实例化之后才可以对数据学习和预测

from sklearn.neighbors import KNeighborsClassifier

obj = KNeighborsClassifier()

此时实例obj可以对数据训练学习之后再对数据进行预测了,但是此时并没有数据
不过sklearn中有数据供我们使用

获取数据

from sklearn import datasets

iris = datasets.load_iris()
x = iris.data
y = iris.target

导入的数据是个训练集,并不能直接传递给实例对其学习,因为实例需要特征和标签才能开始学习(这个实例是这个情况的,无监督学习现在还不那么清楚是个什么样的情况)
不过特征和标签都存储在data和target标签中,可以轻松的获得

开始训练和预测

这个时候,实例有了,数据也有了,可以开始对数据训练和学习了

obj.fit(x, y)
y_pred = obj.predict(x[:4, :]
print(y - y_pred)

输出结果:

[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0
-1 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0]

准确度还是蛮高的,到此已经完成了一个机器学习的基本过程

划分训练集

一般把训练集划分为训练集和测试集,这样来验证算法的准确性比较好

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

其中参数test_size=0.3代表将把训练集的30%数据当做测试集使用
现在有了训练集和测试集,重复之前的步骤,对训练集训练:

knn = KNeighborsClassifier()
knn.fit(x_train, y_train)
y_pred = knn.predict(x_test)
print(y_pred - y_test)

输出结果:

[ 0  0  0  0  0 -1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

注意,每次运行的输出结果可能不一样

参数获取

对于每个学习到的模型,也就是一个假设函数,都有一些参数
还有预测的时候也是有参数设置的
对于这两个参数的获取,可以通过实例化后的实例的coef_,intercept_属性和get_params()获得
由于分类好像没有实例的那几个属性,换个线性回归的的模型:

from sklearn import datasets
from sklearn.linear_model import LinearRegression loaded_data = datasets.load_boston()
data_X = loaded_data.data
data_y = loaded_data.target model = LinearRegression()
model.fit(data_X, data_y)
y_pred = model.predict(data_X[:4, :]) print(model.coef_)
print(model.intercept_)

输出:

[-1.07170557e-01  4.63952195e-02  2.08602395e-02  2.68856140e+00
-1.77957587e+01 3.80475246e+00 7.51061703e-04 -1.47575880e+00
3.05655038e-01 -1.23293463e-02 -9.53463555e-01 9.39251272e-03
-5.25466633e-01]
36.49110328036133

获得训练学习时设置的参数:

print(model.get_params())

# {'n_jobs': 1, 'copy_X': True, 'normalize': False, 'fit_intercept': True}

评估模型

最经常用的评估方法,越接近于1的效果越好:

print(model.score(data_X, data_y))

sklearn的基本使用的更多相关文章

  1. 机器学习之sklearn——EM

    GMM计算更新∑k时,转置符号T应该放在倒数第二项(这样计算出来结果才是一个协方差矩阵) from sklearn.mixture import GMM    GMM中score_samples函数第 ...

  2. 机器学习之sklearn——聚类

    生成数据集方法:sklearn.datasets.make_blobs(n_samples,n_featurs,centers)可以生成数据集,n_samples表示个数,n_features表示特征 ...

  3. 机器学习之sklearn——SVM

    sklearn包对于SVM可输出支持向量,以及其系数和数目: print '支持向量的数目: ', clf.n_support_ print '支持向量的系数: ', clf.dual_coef_ p ...

  4. 使用sklearn做单机特征工程

    目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...

  5. 使用sklearn进行集成学习——实践

    系列 <使用sklearn进行集成学习——理论> <使用sklearn进行集成学习——实践> 目录 1 Random Forest和Gradient Tree Boosting ...

  6. 【原】关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化

    一.标准化(Z-Score),或者去除均值和方差缩放 公式为:(X-mean)/std  计算时对每个属性/每列分别进行. 将数据按期属性(按列进行)减去其均值,并处以其方差.得到的结果是,对于每个属 ...

  7. sklearn 增量学习 数据量大

    问题 实际处理和解决机器学习问题过程中,我们会遇到一些"大数据"问题,比如有上百万条数据,上千上万维特征,此时数据存储已经达到10G这种级别.这种情况下,如果还是直接使用传统的方式 ...

  8. 使用sklearn优雅地进行数据挖掘【转】

    目录 1 使用sklearn进行数据挖掘 1.1 数据挖掘的步骤 1.2 数据初貌 1.3 关键技术2 并行处理 2.1 整体并行处理 2.2 部分并行处理3 流水线处理4 自动化调参5 持久化6 回 ...

  9. Sklearn库例子——决策树分类

    Sklearn上关于决策树算法使用的介绍:http://scikit-learn.org/stable/modules/tree.html 1.关于决策树:决策树是一个非参数的监督式学习方法,主要用于 ...

  10. sklearn学习笔记3

    Explaining Titanic hypothesis with decision trees decision trees are very simple yet powerful superv ...

随机推荐

  1. H3C CSMA/CA

  2. dfs 排列组合——找所有子集(重复元素和不重复元素)

    17. 子集 中文 English 给定一个含不同整数的集合,返回其所有的子集. 样例 样例 1: 输入:[0] 输出: [ [], [0] ] 样例 2: 输入:[1,2,3] 输出: [ [3], ...

  3. spring-boot子模块打包的jar中去掉BOOT-INF文件夹

    1.spring-boot maven打包,一般pom.xml文件里会加 <plugin> <groupId>org.springframework.boot</grou ...

  4. 【转载】TCP协议

    首部格式 图释: 各个段位说明: 源端口和目的端口:各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现 序号:占 4 字节.TCP 连接中传送的数据流中的每一个 ...

  5. (尚028)Vue_案例_交互删除

    删除一条;1.鼠标移入移除这一条时颜色有变化 2.删除当前的todo ================================================================= ...

  6. html5有哪些新特性?如何处理html5新标签的浏览器兼容问题?如何区分html和html5?

    h5新特性: 语义化标签:<hrader></header> .<footer></footer>.<nav></nav>.&l ...

  7. ES5对象新增的方法

    Object.is()-----判断是否全等,和===一样Object.assign()-----对象的复制Object.keys()-----以数组的形式返回所有可遍历属性的键名,原型上的属性不能遍 ...

  8. swoolefy PHP的异步、并行、高性能网络通信引擎内置了Http/WebSocket服务器端/客户端

    近半年来努力付出,项目终于要正式结项了,团队4人经历了很多困难,加班加点,最终完成了!剩下的时间将总结一下在该项目中用到知识和遇到问题.今天就从swoole说起!项目中实现异步大文件传输的功能,在服务 ...

  9. 【JZOJ5551】【20190625】旅途

    题目 \(n\)个点\(m\)条边的无向图,一条路径的代价定义为路径上前\(k\)大边的边权和 对于$k = n \to 1 $,求1-n的最短路 \(n,m \le 3000 \ , \ w_i \ ...

  10. SpringBoot2.0给所有Controller添加统一前缀

    需求 给所有Controller添加统一前缀 实现 在配置文件中添加:server.servlet.context-path: /api(不同SpringBoot版本会有区别,这里是采用2.0) 结果 ...