在此端到端Python机器学习教程中,您将学习如何使用Scikit-Learn来构建和调整有监督的学习模型!
我们将训练和调整随机森林的葡萄酒品质(由葡萄酒专家判断)基于酸度,残留糖和酒精浓度等特征。
链接:https://pan.baidu.com/s/1XZnPibKchT-Wu_ALpzytSQ
提取码:qzfy
1.设置您的环境。
2.导入库和模块。
3.加载红酒数据。
4.将数据分为训练和测试集。
5.声明数据预处理步骤。
6.声明要调整的超参数。
7.使用交叉验证管道调整模型。
8.重新安装整个训练集。
9.根据测试数据评估模型管道。
10.保存模型以备将来使用。
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
#导入一种方法来保留我们的模型以供将来使用。
import joblib
步骤3:加载红酒数据。
dataset_url = 'data/winequality-red.csv'
data = pd.read_csv(dataset_url)
print(data.head())
data = pd.read_csv(dataset_url, sep=';')
print(data.head())
print(data.shape)
print(data.describe())
特征标量:
质量(目标) 固定酸度 挥发性酸度 柠檬酸 残留糖 氯化物 游离二氧化硫 总二氧化硫 密度 pH值 硫酸盐 醇
结果:
fixed acidity;"volatile acidity";"citric acid";"residual sugar";"chlorides";"free sulfur dioxide";"total sulfur dioxide";"density";"pH";"sulphates";"alcohol";"quality"
0 7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;5
1 7.8;0.88;0;2.6;0.098;25;67;0.9968;3.2;0.68;9.8;5
2 7.8;0.76;0.04;2.3;0.092;15;54;0.997;3.26;0.65;...
3 11.2;0.28;0.56;1.9;0.075;17;60;0.998;3.16;0.58...
4 7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;5
fixed acidity volatile acidity citric acid ... sulphates alcohol quality
0 7.4 0.70 0.00 ... 0.56 9.4 5
1 7.8 0.88 0.00 ... 0.68 9.8 5
2 7.8 0.76 0.04 ... 0.65 9.8 5
3 11.2 0.28 0.56 ... 0.58 9.8 6
4 7.4 0.70 0.00 ... 0.56 9.4 5
[5 rows x 12 columns]
(1599, 12)
fixed acidity volatile acidity ... alcohol quality
count 1599.000000 1599.000000 ... 1599.000000 1599.000000
mean 8.319637 0.527821 ... 10.422983 5.636023
std 1.741096 0.179060 ... 1.065668 0.807569
min 4.600000 0.120000 ... 8.400000 3.000000
25% 7.100000 0.390000 ... 9.500000 5.000000
50% 7.900000 0.520000 ... 10.200000 6.000000
75% 9.200000 0.640000 ... 11.100000 6.000000
max 15.900000 1.580000 ... 14.900000 8.000000
[8 rows x 12 columns]
步骤4:将数据分为训练集和测试集。
y = data.quality
X = data.drop('quality', axis=1)
注:stratify=y : 按照数据集中y的比例分配给train和test,使得train和test中各类别数据的比例与原数据集的比例一致。
举例:
原数据集中有100条数据,A类有80条,B类有20条,且前80条全为A类。
那么我们在不指定stratify参数的情况下,切分出前80条的数据就全部为A类。
所以我们要设置stratify=y来使得切分出的测试集与训练集中包含的类别为4:1。
通常在数据集的分类分布不平衡的情况下会用到stratify。
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
random_state=123,
stratify=y)
步骤5:声明数据预处理步骤。
https://zhuanlan.zhihu.com/p/120780686 标准化
首先,这里是一些我们不会使用的代码 ...
X_train_scaled = preprocessing.scale(X_train)
#print(X_train_scaled)
X_train_mean = X_train_scaled.mean(axis=0)
print(X_train_mean)
X_train_std = X_train_scaled.std(axis=0)
print(X_train_std)
很好,但是为什么我们说我们 将不使用此代码?原因是我们将无法对测试集执行完全相同的转换。
现在,这是我们将使用的预处理代码 ...
该过程如下所示:
将transformer 安装在训练套件上(保存均值和标准偏差)
将transformer 应用于训练集(缩放训练数据)
将transformer 应用于测试仪(使用相同的均值和标准偏差)
scaler = preprocessing.StandardScaler().fit(X_train)
现在, 缩放器 对象已为训练集中的每个特征保存了均值和标准差。让我们确认是否可行:
X_train_scaled = scaler.transform(X_train)
print(X_train_scaled.mean(axis=0))
# [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
print(X_train_scaled.std(axis=0))
# [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
注意我们如何获取缩放器对象并使用它来转换训练集。稍后,我们可以使用与转换训练集完全相同的方法和标准偏差来转换测试集:
X_test_scaled = scaler.transform(X_test)
print(X_test_scaled.mean(axis=0))
print(X_test_scaled.std(axis=0))
请注意,测试集中的缩放特征如何无法完美地以零单位居中于零!这正是我们所期望的,
因为我们正在使用训练集而不是测试集本身的方法来转换测试集。
实际上,当我们建立交叉验证管道时,我们甚至不需要手动安装Transformer API。
相反,我们将仅声明类对象,如下所示:
pipeline = make_pipeline(preprocessing.StandardScaler(),
RandomForestRegressor(n_estimators=100))
这就是它的样子:建模管道,该管道首先使用StandardScaler()转换数据,然后使用
随机森林回归器拟合模型。
步骤6:声明超参数进行调整。
示例:随机森林超参数。
例如,让我们以随机森林进行回归:
在每个决策树,计算机可以凭经验决定在哪里创建基于分支或者 均方误差(MSE)或平均绝对误差(MAE)。因此,实际的分支位置是模型参数。
但是,该算法不知道应使用两个标准(MSE或MAE)中的哪一个。该算法还无法确定森林中要包含多少棵树。这些是用户必须设置的超参数示例 。
print(pipeline.get_params())
#声明要通过交叉验证进行调整的超参数。
hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'],
'randomforestregressor__max_depth': [None, 5, 3, 1]}
步骤7:使用交叉验证管道调整模型。
# cv 交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
clf = GridSearchCV(pipeline, hyperparameters, cv=10)
# Fit and tune model
clf.fit(X_train, y_train)
print("使用CV找到的最佳参数集:", clf.best_params_)
# 使用CV找到的最佳参数集: {'randomforestregressor__max_depth': None, 'randomforestregressor__max_features': 'sqrt'}
随机森林允许单个决策树使用特征的最大数量。 Python为最大特征数提供了多个可选项。 下面是其中的几个:
Auto/None :简单地选取所有特征,每颗树都可以利用他们。这种情况下,每颗树都没有任何的限制。
sqrt :此选项是每颗子树可以利用总特征数的平方根个。 例如,如果变量(特征)的总数是100,所以每颗子树只能取其中的10个。“log2”是另一种相似类型的选项。
0.2:此选项允许每个随机森林的子树可以利用变量(特征)数的20%。如果想考察的特征x%的作用, 我们可以使用“0.X”的格式。'''
步骤8:重新安装整个训练集。
使用交叉验证对超参数进行适当的调整后,通常可以通过在整个训练集上重新拟合模型来获得较小的性能提升。
方便地,来自sklearn的GridSearchCV将使用整个训练集自动使用最佳的超参数集重新拟合模型。
默认情况下,此功能为开,但是您可以确认它:
print(clf.refit) True
步骤9:根据测试数据评估模型管道。
y_pred = clf.predict(X_test)
print(r2_score(y_test, y_pred))
# 0.4559573824081362
print(mean_squared_error(y_test, y_pred))
# 0.35105624999999996
步骤10:保存模型以备将来使用。
我们可以保存训练的模型,以便您将来可以使用该模型。这样做很容易:
joblib.dump(clf, 'rf_regressor.pkl')
就是这样。当您想再次加载模型时,只需使用以下功能:
clf2 = joblib.load('rf_regressor.pkl')
# Predict data set using loaded model
clf2.predict(X_test)
网友评论