Python玩机器学习简易教程

本文介绍利用Python和Python的机器学习库scikit-learn完成一个端到端的机器学习项目。

俗话说,“师傅领进门,修行在个人”。本文就是扮演领进门这种角色,至于各位看官能够修行到什么境界,全凭自己。

  • 1 设置环境
  • 2 导入所需库和模块
  • 3 加载数据集
  • 4 数据集划分为训练集和测试集
  • 5 数据预处理
  • 6 参数调优
  • 7 模型优化(交叉验证)
  • 8 全数据拟合
  • 9 模型评估
  • 10 模型保存

1 设置环境

检查电脑是否安装了Python以及相应库numpy/pandas/scikit-learn。 若是没有,推荐一键式安装Anaconda(安装教程)。 安装好后,测试一下版本号。 Code:

import sysprint("Python版本:%s" %sys.version)
import numpyprint("numpy版本:%s" %numpy.__version__)
import matplotlibprint("matplotlib版本:%s" %matplotlib.__version__)
import pandasprint("pandas版本:%s" %pandas.__version__)
import sklearnprint("sklearn版本:%s" %sklearn.__version__)

Result:

2 导入所需库和模块

科学计算库numpy 数据处理和分析库pandas 数据集划分模块train_test_split 数据预处理模块preprocessing 数据算法模块RandomForestRegressor 模型优化模块make_pipeline和GridSearchCV 模型评估模块mean_squared_error和r2_score 模型保存模块joblib

Code:

import numpy as np 
import pandas as pd 
from sklearn.model_selection 
import train_test_splitfrom sklearn 
import preprocessingfrom sklearn.ensemble 
import RandomForestRegressorfrom sklearn.pipeline 
import make_pipelinefrom sklearn.model_selection 
import GridSearchCVfrom sklearn.metrics 
import mean_squared_error, r2_scorefrom sklearn.externals 
import joblib

3 加载数据集

俗话说“巧妇难为无米之炊”。 “数据”是原材料。 本教程使用wine data数据集。 加载数据集和数据简单探索性分析。 Code:

dataset_url = "http://mlr.cs.umass.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"data = pd.read_csv(dataset_url, sep = ";")print(data.head())print(data.shape)print(data.describe())

4 数据集划分为训练集和测试集

数据集划分目的用来评估模型的性能和效果。 Code:

y = data.qualityX = data.drop("quality", axis = 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 123, stratify=y)

train_test_split模块的参数说明:

  • test_size: 设置测试集占总样本的比例
  • random_state: 设置随机种子,便于可重复性试验
  • stratify=y:让训练集和测试集具有相似性,服务模型评估

5 数据预处理

使用Transformer API 做数据预处理,具体步骤如下:

  • 对训练数据集拟合生成一个转换器(保存均值和标准差)
  • 利用转换器对训练集做预处理
  • 利用转换器对测试集做预处理(使用了与训练集相同的均值和标准差) 代码如下: 有时候,我们设置交叉验证管道(pipeline)时,不需要手工设置Transformer API,我们可以创建一个管道对象,如下: 这个pipeline对象首先使用StandardScaler()对数据做预处理,然后用随机森林回归算法拟合生成一个模型。
    1. pipeline = make_pipeline(preprocessing.StandardScaler(), RandomForestRegressor(n_estimators=100))
    2. scaler = preprocessing.StandardScaler().fit(X_train)
    3. X_train_scaled = scaler.transform(X_train)
    4. print(X_train_scaled.mean(axis=0))
    5. print(X_train_scaled.std(axis=0))
    6. X_test_scaled = scaler.transform(X_test)
    7. print(X_test_scaled.mean(axis=0))
    8. print(X_test_scaled.std(axis=0))

6 参数调优

一个模型里面包括两个方面的参数:

  • 方面一:模型参数,从数据中最终可以学习到的参数,例如回归算法的系数。
  • 方面二:超参数,从数据中学习不到的参数,在做模型之前需要事先设置好的参数。

举例说明:随机森林回归算法的超参数 随机森林需要生成多少棵树? 随机森林中树产生的标准?(MSE或者MAE) 下面罗列随机森林回归算法的超参数 代码如下:

print(pipeline.get_params())

与超参数相关结果如下:

RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,max_features='auto', max_leaf_nodes=None,min_impurity_split=1e-07, min_samples_leaf=1,min_samples_split=2, min_weight_fraction_leaf=0.0,n_estimators=100, n_jobs=1, oob_score=False, random_state=None,verbose=0, warm_start=False)

交叉验证时设置需要调整的超参数 代码如下:

hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'],'randomforestregressor__max_depth': [None, 5, 3, 1]}

7 模型优化(交叉验证)

交叉验证是模型性能评估的一种可靠方法。 常用10-折交叉验证为例。

  1. 把数据集划分成10等分;
  2. 利用9等分训练模型;
  3. 剩下的1等分评估模型效果;
  4. 重复2和3步10次,每次采用不同的1等分用来做模型验证;
  5. 聚合10次模型评估性能,当做模型性能最终值;

基于管道对象实现交叉验证 代码

clf = GridSearchCV(pipeline, hyperparameters, cv=10)clf.fit(X_train, y_train)print(clf.best_params_)

结果发现超参数默认值为最佳。

8 全数据拟合

当使用交叉验证方法找到最佳的超参数后,为了进一步改善模型的性能需要对全部训练数据做模型拟合。 GridSearchCV已经用最佳超参数对全部训练数据集做了模型拟合,代码查看如下。

print(clf.refit)

结果为True

9 模型评估

在测试集上做模型评估 代码如下

y_pred = clf.predict(X_test)print(r2_score(y_test, y_pred))print(mean_squared_error(y_test, y_pred))

结果如下: 0.465495005751 0.344901875

截止到目前,基于随机森林回归模型,已经完成了。这个模型是否为解决问题的最佳模型呢?可以从以下三方面思考。

  1. 模型能否解决好问题?
  2. 模型的性能相对于基准线是什么情况?
  3. 模型的性能优化点有哪些?

改善模型性能的常用方法总结。

  • 收集更多的数据
  • 花更多时间做好特征工程
  • 尝试其他模型和算法(正则化回归、提升树等)
  • 吸收更多有用的领域知识
  • 采用集成学习的思想

10 模型保存

模型保存,以便后续使用和模型部署与实施。 代码

joblib.dump(clf, 'rf_regressor.pkl')
clf2 = joblib.load('rf_regressor.pkl')
clf2.predict(X_test)

附录:完整代码参考

## Python玩机器学习简易教程##开始时间:2017年8月24日##结束时间:2017年9月16日## 第一步:设置环境
import sysprint("Python版本:%s" %sys.version)
import numpyprint("numpy版本:%s" %numpy.__version__)
import matplotlibprint("matplotlib版本:%s" %matplotlib.__version__)
import pandasprint("pandas版本:%s" %pandas.__version__)
import sklearnprint("sklearn版本:%s" %sklearn.__version__)
## 第二步:导入所需库
import numpy as np 
import pandas as pd 
from sklearn.model_selection 
import train_test_splitfrom sklearn 
import preprocessingfrom sklearn.ensemble 
import RandomForestRegressorfrom sklearn.pipeline 
import make_pipelinefrom sklearn.model_selection 
import GridSearchCVfrom sklearn.metrics 
import mean_squared_error, r2_scorefrom sklearn.externals 
import joblib
## 第三步:加载数据集
dataset_url = "http://mlr.cs.umass.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
data = pd.read_csv(dataset_url, sep = ";")
print(data.head())print(data.shape)
print(data.describe())
## 第四步:数据集划分
y = data.qualityX = data.drop("quality", axis = 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 123, stratify=y)
## 第五步:数据预处理## 对训练集的所有特征进行标准化处理
pipeline = make_pipeline(preprocessing.StandardScaler(), RandomForestRegressor(n_estimators=100))
## 第六步:参数调优
print(pipeline.get_params())
hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'], 'randomforestregressor__max_depth': [None, 5, 3, 1]}
## 第七步:模型优化(交叉验证)
clf = GridSearchCV(pipeline, hyperparameters, cv=10)
clf.fit(X_train, y_train)print(clf.best_params_)
## 第八步:全数据拟合print(clf.refit)
## 第九步:模型评估
y_pred = clf.predict(X_test)
print(r2_score(y_test, y_pred))
print(mean_squared_error(y_test, y_pred))
## 第十步:模型保存
joblib.dump(clf, 'rf_regressor.pkl')
clf2 = joblib.load('rf_regressor.pkl')
# 加载模型预测新的数据集clf2.predict(X_test)

原文发布于微信公众号 - 数据科学与人工智能(DS_AI_shujuren)

原文发表时间:2017-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

TensorFlow-2: 用 CNN 识别数字

---- 本文结构: CNN 建立模型 code ---- 昨天只是用了简单的 softmax 做数字识别,准确率为 92%,这个太低了,今天用 CNN 来提高...

3635
来自专栏杨熹的专栏

用 Tensorflow 建立 CNN

稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记。 还有 google 在 udacity 上的 CNN 教程。 CNN(Convolutional Neura...

3976
来自专栏ATYUN订阅号

在Python中如何差分时间序列数据集

差分是一个广泛用于时间序列的数据变换。在本教程中,你将发现如何使用Python将差分操作应用于时间序列数据。 完成本教程后,你将学到: 关于差分运算,包括延迟差...

6024
来自专栏ATYUN订阅号

【教程】利用Tensorflow目标检测API确定图像中目标的位置

深度学习提供了另一种解决“Wally在哪儿”(美国漫画)问题的方法。与传统的图像处理计算机视觉方法不同的是,它只使用了少量的标记出Wally位置的示例。 在我的...

7176
来自专栏CNN

MobileNet V1官方预训练模型的使用

MobileNet V1的网络结构可以直接从官方Github库中下载定义网络结构的文件,地址为:https://raw.githubusercontent.co...

7422
来自专栏简书专栏

基于tensorflow+CNN的新闻文本分类

tensorflow是谷歌google的深度学习框架,tensor中文叫做张量,flow叫做流。 CNN是convolutional neural netwo...

4864
来自专栏机器之心

教程 | TensorEditor :一个小白都能快速玩转的神经网络搭建工具

2206
来自专栏云时之间

深度学习的fine-tuning过程

在深度学习过程中,获取数据集后,在搭建自己的网络之前需要进行的是微调,通过别人现有的网络观察自己数据的实验结果,并在此基础上,初步确定自己网络的大体结构,其中微...

3776
来自专栏杨熹的专栏

TensorFlow -2: 用 CNN 识别数字

昨天只是用了简单的 softmax 做数字识别,准确率为 92%,这个太低了,今天用 CNN 来提高一下准确率。关于 CNN,可以看这篇:图解何为CNN简单看一...

1.6K0
来自专栏计算机视觉与深度学习基础

【深度学习】使用tensorflow实现VGG19网络

接上一篇AlexNet,本文讲述使用tensorflow实现VGG19网络。 VGG网络与AlexNet类似,也是一种CNN,VGG在2014年的 ILSV...

5514

扫码关注云+社区

领取腾讯云代金券