网络机器人吧社区

Python玩机器学习简易教程

数据科学与人工智能 2018-12-05 15:44:50

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

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

  • 1 设置环境

  • 2 导入所需库和模块

  • 3 加载数据集

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

  • 5 数据预处理

  • 6 参数调优

  • 7 模型优化(交叉验证)

  • 8 全数据拟合

  • 9 模型评估

  • 10 模型保存

    1 设置环境

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

    1. import sys

    2. print("Python版本:%s" %sys.version)

    3. import numpy

    4. print("numpy版本:%s" %numpy.__version__)

    5. import matplotlib

    6. print("matplotlib版本:%s" %matplotlib.__version__)

    7. import pandas

    8. print("pandas版本:%s" %pandas.__version__)

    9. import sklearn

    10. print("sklearn版本:%s" %sklearn.__version__)

    Result:

    2 导入所需库和模块

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

    Code:

    1. import numpy as np

    2. import pandas as pd

    3. from sklearn.model_selection import train_test_split

    4. from sklearn import preprocessing

    5. from sklearn.ensemble import RandomForestRegressor

    6. from sklearn.pipeline import make_pipeline

    7. from sklearn.model_selection import GridSearchCV

    8. from sklearn.metrics import mean_squared_error, r2_score

    9. from sklearn.externals import joblib

    3 加载数据集

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

    1. dataset_url = "http://mlr.cs.umass.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"

    2. data = pd.read_csv(dataset_url, sep = ";")

    3. print(data.head())

    4. print(data.shape)

    5. print(data.describe())

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

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

    1. y = data.quality

    2. X = data.drop("quality", axis = 1)

    3. 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)
    下面罗列随机森林回归算法的超参数
    代码如下:

    1. print(pipeline.get_params())

    与超参数相关结果如下:

    1. RandomForestRegressor

    2. (bootstrap=True,

    3. criterion='mse',

    4. max_depth=None,

    5. max_features='auto',

    6. max_leaf_nodes=None,

    7. min_impurity_split=1e-07,

    8. min_samples_leaf=1,

    9. min_samples_split=2,

    10. min_weight_fraction_leaf=0.0,

    11. n_estimators=100,

    12. n_jobs=1,

    13. oob_score=False,

    14. random_state=None,

    15. verbose=0,

    16. warm_start=False)

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

    1. hyperparameters =

    2. { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'],

    3. 'randomforestregressor__max_depth': [None, 5, 3, 1]

    4. }

    7 模型优化(交叉验证)

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

    1. 把数据集划分成10等分;

    2. 利用9等分训练模型;

    3. 剩下的1等分评估模型效果;

    4. 重复2和3步10次,每次采用不同的1等分用来做模型验证;

    5. 聚合10次模型评估性能,当做模型性能最终值;

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

    1. clf = GridSearchCV(pipeline, hyperparameters, cv=10)

    2. clf.fit(X_train, y_train)

    3. print(clf.best_params_)

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

    8 全数据拟合

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

    1. print(clf.refit)

    结果为True

    9 模型评估

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

    1. y_pred = clf.predict(X_test)

    2. print(r2_score(y_test, y_pred))

    3. print(mean_squared_error(y_test, y_pred))

    结果如下:
    0.465495005751
    0.344901875

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

    1. 模型能否解决好问题?

    2. 模型的性能相对于基准线是什么情况?

    3. 模型的性能优化点有哪些?

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

    • 收集更多的数据

    • 花更多时间做好特征工程

    • 尝试其他模型和算法(正则化回归、提升树等)

    • 吸收更多有用的领域知识

    • 采用集成学习的思想

    10 模型保存

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

    1. joblib.dump(clf, 'rf_regressor.pkl')

    2. clf2 = joblib.load('rf_regressor.pkl')

    3. clf2.predict(X_test)

    附录:完整代码参考

    1. ## Python玩机器学习简易教程

    2. ##开始时间:2017年8月24日

    3. ##结束时间:2017年9月16日

    4. ## 第一步:设置环境

    5. import sys

    6. print("Python版本:%s" %sys.version)

    7. import numpy

    8. print("numpy版本:%s" %numpy.__version__)

    9. import matplotlib

    10. print("matplotlib版本:%s" %matplotlib.__version__)

    11. import pandas

    12. print("pandas版本:%s" %pandas.__version__)

    13. import sklearn

    14. print("sklearn版本:%s" %sklearn.__version__)

    15. ## 第二步:导入所需库

    16. import numpy as np

    17. import pandas as pd

    18. from sklearn.model_selection import train_test_split

    19. from sklearn import preprocessing

    20. from sklearn.ensemble import RandomForestRegressor

    21. from sklearn.pipeline import make_pipeline

    22. from sklearn.model_selection import GridSearchCV

    23. from sklearn.metrics import mean_squared_error, r2_score

    24. from sklearn.externals import joblib

    25. ## 第三步:加载数据集

    26. dataset_url = "http://mlr.cs.umass.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"

    27. data = pd.read_csv(dataset_url, sep = ";")

    28. print(data.head())

    29. print(data.shape)

    30. print(data.describe())

    31. ## 第四步:数据集划分

    32. y = data.quality

    33. X = data.drop("quality", axis = 1)

    34. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 123, stratify=y)

    35. ## 第五步:数据预处理

    36. ## 对训练集的所有特征进行标准化处理

    37. pipeline = make_pipeline(preprocessing.StandardScaler(), RandomForestRegressor(n_estimators=100))

    38. ## 第六步:参数调优

    39. print(pipeline.get_params())

    40. hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'],

    41.                  'randomforestregressor__max_depth': [None, 5, 3, 1]}

    42. ## 第七步:模型优化(交叉验证)

    43. clf = GridSearchCV(pipeline, hyperparameters, cv=10)

    44. clf.fit(X_train, y_train)

    45. print(clf.best_params_)

    46. ## 第八步:全数据拟合

    47. print(clf.refit)

    48. ## 第九步:模型评估

    49. y_pred = clf.predict(X_test)

    50. print(r2_score(y_test, y_pred))

    51. print(mean_squared_error(y_test, y_pred))

    52. ## 第十步:模型保存

    53. joblib.dump(clf, 'rf_regressor.pkl')

    54. clf2 = joblib.load('rf_regressor.pkl')

    55. # 加载模型预测新的数据集

    56. clf2.predict(X_test)


    阅读原文,更多精彩!

    分享就是收获,传播就是能量!

    Copyright © 网络机器人吧社区@2017