使用scikit-learn构建第一个随机森林模型

基本流程:

1.设置环境

2.导入库和模块

3.加载数据

4.将数据拆分为训练和测试集

5.声明数据预处理步骤

6.声明超参数以进行调整

7.使用交叉验证管道调整模型

8.改装整个训练集

9.评估测试数据的模型管道

10.保存模型以供进一步使用

1.设置环境

python3.6 ,numpy,pandas,scikit-learn

2.导入包

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split 
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline  #交叉验证工具
from sklearn.model_selection import GridSearchCV #交叉验证工具
from sklearn.metrics import mean_squared_error,r2_score  #性能评估
from sklearn.externals import joblib  #保留模型

3.数据加载--直接下载网页数据

1

2

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

data = pd.read_csv(dataset_url,sep=';')

data

使用scikit-learn构建第一个随机森林模型_第1张图片 

数据标签:

  • 质量(目标)
  • 固定酸度
  • 挥发性酸度
  • 柠檬酸
  • 残糖
  • 氯化物
  • 游离二氧化硫
  • 总二氧化硫
  • 密度
  • pH值
  • 硫酸盐

data.info()

使用scikit-learn构建第一个随机森林模型_第2张图片

4.将数据集拆分为训练和测试集

首先将输入与输出分开

y=data.quality
x=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)

5.声明数据预处理

from sklearn import preprocessing
X_train_scaled = preprocessing.scale(X_train)

对数据进行缩放,以O为中心,具有单位差异

但是不会这样去做,原因是我们无法在测试基上执行完全相同的转换

现在使用Scikit-learn中的Transformaer API拟合训练数据

scaler=preprocessing.StandardScaler().fit(X_train) 

X_train_scaled = scaler.transform(X_train)

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

一个建模管道,首先使用StandardScaler()转换数据,然后使用随机森林回归器拟合模型。

6.声明超参数进行调整

什么是超参数?我们需要担心两种类型的参数:模型参数和超参数。模型参数可以直接从数据中学习(回归参数),而超参数表达关于模型的更高级别的结构信息,并且通常在训练模型之前设置他们

示例:随机森林超参数

在每个决策树,计算机可以凭经验在哪里创建分支或者均方误差(MSE)或平均绝对误差(MAE).因此,实际的分支位置就是模型参数

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

格式应该是Python字典(键值对的数据结构),其中键是超参数名称,值是要尝试的设置列表。可以在文档页面上找到参数值的选项。

7.使用交叉验证管道调整模型

什么是交叉验证(CV)?

交叉验证是通过使用相同方法多次训练和评估模型来可靠地估计建模的方法的性能的过程

CV的步骤:

1.将数据拆分为K个相等的部分(通常K=10)

2.训练模型在K-1折叠

3.在剩余的数据上评估它

4.执行步骤2和3  K次,每次都进行不同的折叠

5.在K次折叠中聚合性能。

clf = GridSearchCV(pipeline, hyperparameters, cv=10)
 
#训练模型
clf.fit(X_train, y_train)

8.重新调整整个训练集

在使用交叉验证适当调整超参数之后,通常可以通过在整个训练集上重新设置模型来获得较小的性能提升。

9.评估测试数据的模型管道

1

y_pred = clf.predict(X_test)

 

现在我们可以使用之前导入的指标来评估我们的模型性能。

1

2

3

4

5

print r2_score(y_test, y_pred)

# 0.45044082571584243

 

print mean_squared_error(y_test, y_pred)

# 0.35461593750000003

这个表现足够好吗??

经验法则是你的第一个模型可能不是最好的模型。但是,我们建议结合使用三种策略来确定您对模型性能是否满意。

  1. 从模型的目标开始。如果模型与业务问题挂钩,您是否已成功解决问题?
  2. 查看学术文献,了解特定类型数据的当前性能基准。
  3. 尝试从改善模型的方法中找到悬而未决的成果

有多种方法可以改进模型。我们将有更多指南详细介绍如何提高模型性能,但这里有一些快速尝试:

  1. 尝试其他回归模型族(例如正则化回归,增强树等)。
  2. 如果价格便宜,请收集更多数据。
  3. 在花费更多时间进行探索性分析后,设计更智能的功能。
  4. 与领域专家交谈以获得更多背景信息(...这是品尝葡萄酒的好借口!)。

最后要注意的是,当您尝试其他模型系列时,我们建议您使用与您用于拟合随机森林模型相同的训练和测试集。这是在模型之间进行真正的苹果对比比较的最佳方式。

10.保存模型

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

下次使用:

clf2 = joblib.load('rf_regressor.pkl')
 
# Predict data set using loaded model
clf2.predict(X_test)

完整代码:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

# 2. Import libraries and modules

import numpy as np

import pandas as pd

 

from sklearn.model_selection import train_test_split

from sklearn import preprocessing

from sklearn.ensemble import RandomForestRegressor

from sklearn.pipeline import make_pipeline

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import mean_squared_error, r2_score

from sklearn.externals import joblib

 

# 3. Load red wine data.

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

data = pd.read_csv(dataset_url, sep=';')

 

# 4. Split data into training and test sets

y = data.quality

X = 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)

 

# 5. Declare data preprocessing steps

pipeline = make_pipeline(preprocessing.StandardScaler(),

                         RandomForestRegressor(n_estimators=100))

 

# 6. Declare hyperparameters to tune

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

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

 

# 7. Tune model using cross-validation pipeline

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

 

clf.fit(X_train, y_train)

 

# 8. Refit on the entire training set

# No additional code needed if clf.refit == True (default is True)

 

# 9. Evaluate model pipeline on test data

pred = clf.predict(X_test)

print r2_score(y_test, pred)

print mean_squared_error(y_test, pred)

 

# 10. Save model for future use

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

# To load: clf2 = joblib.load('rf_regressor.pkl')

 

参考:https://elitedatascience.com/python-machine-learning-tutorial-scikit-learn

你可能感兴趣的:(python)