基本流程:
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 |
数据标签:
data.info()
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 |
这个表现足够好吗??
经验法则是你的第一个模型可能不是最好的模型。但是,我们建议结合使用三种策略来确定您对模型性能是否满意。
有多种方法可以改进模型。我们将有更多指南详细介绍如何提高模型性能,但这里有一些快速尝试:
最后要注意的是,当您尝试其他模型系列时,我们建议您使用与您用于拟合随机森林模型相同的训练和测试集。这是在模型之间进行真正的苹果对比比较的最佳方式。
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