用Scikit-Learn(sklearn)建立模型
1 环境搭建
Python 3+NumPy+Pandas+Scikit-Learn (sklearn)
2 导入库和模块
Numpy是比Python自身的嵌套列表(nested list structure)结构要高效的多的一种开源的数值计算扩展。NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。
Pandas(Python Data Analysis Library)是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
-
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 导入红酒数据
Pandas为我们提供了可以读取来自CSV、SQL、SAS等格式的数据的方法
这里我们用其中的read_csv( )方法,可以读取任何CSV文件,包括来自URL 的
-
dataset_url = 'http://mlr.cs.umass.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv'
-
data = pd.read_csv(dataset_url)
4 把数据分解为训练集和测试集
首先,我们将我们的目标特征y与我们的输入特征X分开,然后我们利用Scikit-Learn的train_test_split函数
设置20%的数据作为测试数据
-
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 声明数据预处理步骤
第三步得到的数据的精度是不一样的,所以要把它们标准化。
标准化是机器学习任务的常见要求,许多算法都假设所有特征都以零为中心并具有大致相同的方差。
一个建模流水线,首先使用StandardScaler()转换数据,然后使用随机森林回归器RandomForestRegressor()拟合模型。
-
pipeline = make_pipeline(preprocessing.StandardScaler(),
-
RandomForestRegressor(n_estimators= 100))
6 声明超参数
超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。如下所见,格式应该是Python字典(键值对的数据结构),其中键是超参数名称,值是要尝试的设置列表,值的选项可以在文档页面找到。
-
hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'],
-
'randomforestregressor__max_depth': [ None, 5, 3, 1]}
7 模型调优
交叉验证(Cross-validation)是一种通过使用相同方法多次训练和评估您的模型来可靠地估计构建模型的方法的性能的过程。
-
clf = GridSearchCV(pipeline, hyperparameters, cv=10)
-
clf.fit(X_train, y_train)
8 评估模型并预测
y_pred = clf.predict(X_test)
-
-
print r2_score(y_test, y_pred)
-
print mean_squared_error(y_test, y_pred)
完整代码
-
# -*- coding: utf-8 -*-
-
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
-
-
#导入数据
-
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.describe())
-
-
#把数据分为训练集和测试集
-
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)
-
-
#声明数据预处理步骤
-
pipeline = make_pipeline(preprocessing.StandardScaler(),
-
RandomForestRegressor(n_estimators= 100))
-
-
#声明超参数
-
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)
-
-
#评估模型及预测
-
pred = clf.predict(X_test)
-
print(r2_score(y_test, pred))
-
print(mean_squared_error(y_test, pred))
详见:https://elitedatascience.com/python-machine-learning-tutorial-scikit-learn