ML神器:sklearn的快速使用及入门


Posted in Python onJuly 11, 2019

传统的机器学习任务从开始到建模的一般流程是:获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测,分类。本文我们将依据传统机器学习的流程,看看在每一步流程中都有哪些常用的函数以及它们的用法是怎么样的。希望你看完这篇文章可以最为快速的开始你的学习任务。

1. 获取数据

1.1 导入sklearn数据集

sklearn中包含了大量的优质的数据集,在你学习机器学习的过程中,你可以通过使用这些数据集实现出不同的模型,从而提高你的动手实践能力,同时这个过程也可以加深你对理论知识的理解和把握。(这一步我也亟需加强,一起加油!^-^)

首先呢,要想使用sklearn中的数据集,必须导入datasets模块:

from sklearn import datasets

下图中包含了大部分sklearn中数据集,调用方式也在图中给出,这里我们拿iris的数据来举个例子:

ML神器:sklearn的快速使用及入门

ML神器:sklearn的快速使用及入门

iris = datasets.load_iris() # 导入数据集
X = iris.data # 获得其特征向量
y = iris.target # 获得样本label

1.2 创建数据集

你除了可以使用sklearn自带的数据集,还可以自己去创建训练样本,具体用法参见《Dataset loading utilities》,这里我们简单介绍一些,sklearn中的samples generator包含的大量创建样本数据的方法:

ML神器:sklearn的快速使用及入门

ML神器:sklearn的快速使用及入门

下面我们拿分类问题的样本生成器举例子:

from sklearn.datasets.samples_generator import make_classification

X, y = make_classification(n_samples=6, n_features=5, n_informative=2, 
  n_redundant=2, n_classes=2, n_clusters_per_class=2, scale=1.0, 
  random_state=20)

# n_samples:指定样本数
# n_features:指定特征数
# n_classes:指定几分类
# random_state:随机种子,使得随机状可重
>>> for x_,y_ in zip(X,y):
  print(y_,end=': ')
  print(x_)

  
0: [-0.6600737 -0.0558978  0.82286793 1.1003977 -0.93493796]
1: [ 0.4113583  0.06249216 -0.90760075 -1.41296696 2.059838 ]
1: [ 1.52452016 -0.01867812 0.20900899 1.34422289 -1.61299022]
0: [-1.25725859 0.02347952 -0.28764782 -1.32091378 -0.88549315]
0: [-3.28323172 0.03899168 -0.43251277 -2.86249859 -1.10457948]
1: [ 1.68841011 0.06754955 -1.02805579 -0.83132182 0.93286635]

2. 数据预处理

数据预处理阶段是机器学习中不可缺少的一环,它会使得数据更加有效的被模型或者评估器识别。下面我们来看一下sklearn中有哪些平时我们常用的函数:

from sklearn import preprocessing

2.1 数据归一化

为了使得训练数据的标准化规则与测试数据的标准化规则同步,preprocessing中提供了很多Scaler:

data = [[0, 0], [0, 0], [1, 1], [1, 1]]
# 1. 基于mean和std的标准化
scaler = preprocessing.StandardScaler().fit(train_data)
scaler.transform(train_data)
scaler.transform(test_data)

# 2. 将每个特征值归一化到一个固定范围
scaler = preprocessing.MinMaxScaler(feature_range=(0, 1)).fit(train_data)
scaler.transform(train_data)
scaler.transform(test_data)
#feature_range: 定义归一化范围,注用()括起来

2.2 正则化(normalize

当你想要计算两个样本的相似度时必不可少的一个操作,就是正则化。其思想是:首先求出样本的p-范数,然后该样本的所有元素都要除以该范数,这样最终使得每个样本的范数都为1。

>>> X = [[ 1., -1., 2.],
...   [ 2., 0., 0.],
...   [ 0., 1., -1.]]
>>> X_normalized = preprocessing.normalize(X, norm='l2')

>>> X_normalized                   
array([[ 0.40..., -0.40..., 0.81...],
    [ 1. ..., 0. ..., 0. ...],
    [ 0. ..., 0.70..., -0.70...]])

2.3 one-hot编码

one-hot编码是一种对离散特征值的编码方式,在LR模型中常用到,用于给线性模型增加非线性能力。

data = [[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]
encoder = preprocessing.OneHotEncoder().fit(data)
enc.transform(data).toarray()

3. 数据集拆分

在得到训练数据集时,通常我们经常会把训练数据集进一步拆分成训练集和验证集,这样有助于我们模型参数的选取。

# 作用:将数据集划分为 训练集和测试集
# 格式:train_test_split(*arrays, **options)
from sklearn.mode_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
"""
参数
---
arrays:样本数组,包含特征向量和标签

test_size:
float-获得多大比重的测试样本 (默认:0.25)

int - 获得多少个测试样本

train_size: 同test_size

random_state:

int - 随机种子(种子固定,实验可复现)


shuffle - 是否在分割之前对数据进行洗牌(默认True)

返回
---
分割后的列表,长度=2*len(arrays), 

(train-test split)
"""

4. 定义模型

在这一步我们首先要分析自己数据的类型,搞清出你要用什么模型来做,然后我们就可以在sklearn中定义模型了。sklearn为所有模型提供了非常相似的接口,这样使得我们可以更加快速的熟悉所有模型的用法。在这之前我们先来看看模型的常用属性和功能:

# 拟合模型
model.fit(X_train, y_train)
# 模型预测
model.predict(X_test)

# 获得这个模型的参数
model.get_params()
# 为模型进行打分
model.score(data_X, data_y) # 线性回归:R square; 分类问题: acc

4.1 线性回归

from sklearn.linear_model import LinearRegression
# 定义线性回归模型
model = LinearRegression(fit_intercept=True, normalize=False, 
  copy_X=True, n_jobs=1)
"""
参数
---
  fit_intercept:是否计算截距。False-模型没有截距
  normalize: 当fit_intercept设置为False时,该参数将被忽略。 如果为真,则回归前的回归系数X将通过减去平均值并除以l2-范数而归一化。
   n_jobs:指定线程数
"""

ML神器:sklearn的快速使用及入门

4.2 逻辑回归LR

from sklearn.linear_model import LogisticRegression
# 定义逻辑回归模型
model = LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, 
  fit_intercept=True, intercept_scaling=1, class_weight=None, 
  random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', 
  verbose=0, warm_start=False, n_jobs=1)

"""参数
---
  penalty:使用指定正则化项(默认:l2)
  dual: n_samples > n_features取False(默认)
  C:正则化强度的反,值越小正则化强度越大
  n_jobs: 指定线程数
  random_state:随机数生成器
  fit_intercept: 是否需要常量
"""

4.3 朴素贝叶斯算法NB

from sklearn import naive_bayes
model = naive_bayes.GaussianNB() # 高斯贝叶斯
model = naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
model = naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
"""
文本分类问题常用MultinomialNB
参数
---
  alpha:平滑参数
  fit_prior:是否要学习类的先验概率;false-使用统一的先验概率
  class_prior: 是否指定类的先验概率;若指定则不能根据参数调整
  binarize: 二值化的阈值,若为None,则假设输入由二进制向量组成
"""

4.4 决策树DT

from sklearn import tree 
model = tree.DecisionTreeClassifier(criterion='gini', max_depth=None, 
  min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, 
  max_features=None, random_state=None, max_leaf_nodes=None, 
  min_impurity_decrease=0.0, min_impurity_split=None,
   class_weight=None, presort=False)
"""参数
---
  criterion :特征选择准则gini/entropy
  max_depth:树的最大深度,None-尽量下分
  min_samples_split:分裂内部节点,所需要的最小样本树
  min_samples_leaf:叶子节点所需要的最小样本数
  max_features: 寻找最优分割点时的最大特征数
  max_leaf_nodes:优先增长到最大叶子节点数
  min_impurity_decrease:如果这种分离导致杂质的减少大于或等于这个值,则节点将被拆分。
"""

4.5 支持向量机SVM

from sklearn.svm import SVC
model = SVC(C=1.0, kernel='rbf', gamma='auto')
"""参数
---
  C:误差项的惩罚参数C
  gamma: 核相关系数。浮点数,If gamma is ‘auto' then 1/n_features will be used instead.
"""

4.6 k近邻算法KNN

from sklearn import neighbors
#定义kNN分类模型
model = neighbors.KNeighborsClassifier(n_neighbors=5, n_jobs=1) # 分类
model = neighbors.KNeighborsRegressor(n_neighbors=5, n_jobs=1) # 回归
"""参数
---
  n_neighbors: 使用邻居的数目
  n_jobs:并行任务数
"""

4.7 多层感知机(神经网络)

from sklearn.neural_network import MLPClassifier
# 定义多层感知机分类算法
model = MLPClassifier(activation='relu', solver='adam', alpha=0.0001)
"""参数
---
  hidden_layer_sizes: 元祖
  activation:激活函数
  solver :优化算法{‘lbfgs', ‘sgd', ‘adam'}
  alpha:L2惩罚(正则化项)参数。
"""

5. 模型评估与选择篇

5.1 交叉验证

from sklearn.model_selection import cross_val_score
cross_val_score(model, X, y=None, scoring=None, cv=None, n_jobs=1)
"""参数
---
  model:拟合数据的模型
  cv : k-fold
  scoring: 打分参数-‘accuracy'、‘f1'、‘precision'、‘recall' 、‘roc_auc'、'neg_log_loss'等等
"""

5.2 检验曲线

使用检验曲线,我们可以更加方便的改变模型参数,获取模型表现。

from sklearn.model_selection import validation_curve
train_score, test_score = validation_curve(model, X, y, param_name, param_range, cv=None, scoring=None, n_jobs=1)
"""参数
---
  model:用于fit和predict的对象
  X, y: 训练集的特征和标签
  param_name:将被改变的参数的名字
  param_range: 参数的改变范围
  cv:k-fold
  
返回值
---
  train_score: 训练集得分(array)
  test_score: 验证集得分(array)
"""

例子

6. 保存模型

最后,我们可以将我们训练好的model保存到本地,或者放到线上供用户使用,那么如何保存训练好的model呢?主要有下面两种方式:

6.1 保存为pickle文件

import pickle

# 保存模型
with open('model.pickle', 'wb') as f:
  pickle.dump(model, f)

# 读取模型
with open('model.pickle', 'rb') as f:
  model = pickle.load(f)
model.predict(X_test)

6.2 sklearn自带方法

from sklearn.externals import joblib

# 保存模型
joblib.dump(model, 'model.pickle')

#载入模型
model = joblib.load('model.pickle')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络编程学习笔记(六):Web客户端访问
Jun 09 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
TensorFlow 合并/连接数组的方法
Jul 27 Python
python高阶爬虫实战分析
Jul 29 Python
python学习开发mock接口
Apr 28 Python
python实现函数极小值
Jul 10 Python
浅谈python多进程共享变量Value的使用tips
Jul 16 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
python为什么要安装到c盘
Jul 20 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 Python
python 随机森林算法及其优化详解
Jul 11 #Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 #Python
python常用库之NumPy和sklearn入门
Jul 11 #Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 #Python
Python实现K折交叉验证法的方法步骤
Jul 11 #Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 #Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 #Python
You might like
PHP语法速查表
2006/12/06 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
python3将变量输入的简单实例
2020/08/19 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
影子教师研修方案
2014/06/14 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
工程合作意向书范本
2015/05/09 职场文书
感恩教育观后感
2015/06/17 职场文书
心理学培训心得体会
2016/01/22 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
Golang ort 中的sortInts 方法
2022/04/24 Golang