天天看点

利用Sklearn实现DataFrame数据的回归预测,以及对预测结果进行评价。

      最近在学习利用Python的Sklearn模块实现对数据的回归,分类,以及聚类任务,并分别对其结果进行指标分析。这一篇主要是总结对数据的回归预测,写这篇文章的主要目的是理顺思路,方便以后查找使用。

      对数据的回归预测,分为如下步骤:1、数据预处理;  2、选择合适的回归模型;  3、模型训练;  4、模型预测;  5、模型评估;6、根据评估结果,调整模型参数; 7、确定最优参数模型,保存模型;8、将预测模型应用于实际预测;  9、模型使用,数据收集,对模型进行更新微调。

      第一步,数据预处理。提到数据分析,那么首先是数据的处理,包括数据清洗,特征筛选,转化数据格式等,因为实际需求,我的数据都是以pandas模块中的Dataframe数据存储格式。以Sklearn中自带的数据为例,主要包括:

               1、    鸢尾花数据集:load_iris():用于分类任务的数据集。

               2、    手写数字数据集:load_digits():用于分类任务或者降维任务的数据集。

               3、    乳腺癌数据集load-barest-cancer():简单经典的用于二分类任务的数据集。

               4、    糖尿病数据集:load-diabetes():用于回归数据集。

               5、    波士顿房价数据集:load-boston():回归任务的数据集。

               6、   体能训练数据集:load-linnerud():多变量回归任务的数据集。。

       对Sklearn中的数据集的导入主要分为三步:数据加载,将数据转化为DataFrame格式,数据分割(分为训练集,测试集)。

代码如下:

#加载数据集
from sklearn.datasets import load_breast_cancer
import  pandas as pd
df = load_breast_cancer()

#将数据转化为DataFrame
df = pd.DataFrame(df.data, columns=df.feature_names)

#数据分割,将数据的后百分之20作为测试集(-df.shape[0]//5为获取测试集的起始index)
df_train = df.values[:-(df.shape[0]//5),:]
df_test = df.values[-(df.shape[0]//5):,:]
#将训练集与测试集分为特征X,预测Y
X_train = df_train[:,:-1]
Y_train = df_train[:,-1]
X_test = df_test[:,:-1]
Y_test =  df_test[:,-1]




           

第二步,选择合适的回归模型。Sklearn中包含了丰富的回归模型供用户选择,包括但不限于:支持向量机(VSM)回归模型,决策树回归,以及由集成学习的随机森林和XGBoost(需要额外安装XGBoost模块),逻辑回归,梯度上升,神经网络。每个模型具体的调用格式可以自行查找。我以随机森林为例(随机森林效果较好,且对参数不是很敏感),调用格式为:

from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
           

其中 RandomForestRegressor中包含很多需要调整的参数,每个参数的具体作用和取值类型,利用 帮助文档【help(RandomForestRegressor)】即可得知。

第三步,模型训练。当确定了模型参数后,利用模型中自带的fit方法(sklea中fit方法基本对所有回归分类算法适用)进行训练,并且保存。

from sklearn.externals import joblib #joblib为模型存储的方法,path为模型的保存地址
model.fit(X_train, Y_train)
joblib.dump(model, path)
           

第四步,模型预测。利用训练模型自带的predict()方法,进行预测,输出为格式跟Y_train相同的一列预测值Y_pred。

Y_pred = model.predict(X_test)
           

第五步,预测结果评价。回归的评价指标,我主要利用如下三个:

平均绝对误差(MAE)
R2决定系数(r2_score)
均方根误差差(RMSE)

在python中的调用方法为:

#平均绝对误差(MAE)
from sklearn.metrics import mean_absolute_error
#  R2 决定系数(r2_score)
from sklearn.metrics import r2_score
           

第6步,第七步,第八步,第九步不做描述。模型调参方法在网上很容易找到。

由此,得到数据回归的整体流程:

#加载数据集
from sklearn.datasets import load_breast_cancer
import  pandas as pd
import scipy as sp
from sklearn.ensemble import RandomForestRegressor
from sklearn.externals import joblib
#平均绝对误差(MAE)
from sklearn.metrics import mean_absolute_error
#  R2 决定系数(r2_score)
from sklearn.metrics import r2_score


#第一步,传入数据,分割数据。
df = load_breast_cancer()
df = pd.DataFrame(df.data, columns=df.feature_names)
df_train = df.values[:-(df.shape[0]//5),:]
df_test = df.values[-(df.shape[0]//5):,:]
X_train = df_train[:,:-1]
Y_train = df_train[:,-1]
X_test = df_test[:,:-1]
Y_test =  df_test[:,-1]


#第二,三:选择模型,训练
path = "H:\新实验\VSM.model"
model = RandomForestRegressor()
model.fit(X_train,Y_train)
joblib.dump(model,path)
Y_pred = model.predict(X_test)
#将预测结果,跟真实结果放在一起,存储。
out_pred = pd.DataFrame()
out_pred["Y_test"] = Y_test
out_pred["Y_pred"] = Y_pred

#第四步,预测评价。将预测结果存为dict,最后转化为dataframe保存。
out_dict = {}
MAE = mean_absolute_error(Y_test, Y_pred)
MAE = round(MAE,3)
MAE_list = []
MAE_list.append(MAE)
out_dict["平均绝对误差(MAE)"] = MAE_list

R2 = r2_score(Y_test, Y_pred)
R2 = round(R2,3)
R2_list = []
R2_list.append(R2)
out_dict["R2 决定系数"] = R2_list

RMSE = sp.sqrt(sp.mean((Y_test - Y_pred) ** 2))
RMSE = round(RMSE,3)
RMSE_list = []
RMSE_list.append(RMSE)
out_dict["均方根误差RMSE"] = RMSE_list

out_Err = pd.DataFrame(out_dict)
print(out_pred)
print(out_Err)
           
上面代码的运行之后,我们得到了一个训练模型,用来后续的预测工作:
           
利用Sklearn实现DataFrame数据的回归预测,以及对预测结果进行评价。

代码的运行结果(第一列为真实值,第二列为预测值),:

利用Sklearn实现DataFrame数据的回归预测,以及对预测结果进行评价。

下面为预测结果评价,如果评价结果不理想,需要继续对模型参数进行调整。

利用Sklearn实现DataFrame数据的回归预测,以及对预测结果进行评价。

第一次接触数据分析,也是第一次写博客。写的不正确的地方,请路过的大佬们指教,以便我继续提高,感谢。