sklearn:多元线性回归,模型训练/评估/调优

·  阅读 937
sklearn:多元线性回归,模型训练/评估/调优
多元线性回归: 虽然有多个自变量,但是每个自变量的阶次都是1
复制代码

1/数据集的导入以及自变量和因变量的选取

作为机器学习的入门知识点和模型,网上有很多sklearn库实现线性回归的例子。
不过在这里我会从最开始的模型训练到最后的模型调优,统一地进行一个练习,以便对线性回归有个更深入浅出的理解。
首先我们先导入一些相关的包:
复制代码
   import pandas as pd
   import matplotlib.pyplot as plt
   import matplotlib as mpl
   from sklearn.linear_model import LinearRegression
   from sklearn.model_selection import cross_val_predict, train_test_split
   from sklearn import datasets
   %matplotlib inline
   mpl.rcParams['font.family'] = ['sans-serif']
   mpl.rcParams['font.sans-serif'] = ['SimHei']
   mpl.rcParams['axes.unicode_minus']=False
复制代码
作为回归模型练习的数据集,从经典的波士顿房价数据集来进行训练就好,这是sklearn库中自带的小数据集。
在这里,作为自变量X的就是数据集中的feature_names维度,总共有13个维度,
所以这是一个多元线性回归模型.
因变量y就是我们数据集中的target维度——房价。
复制代码
   # 通过load_boston()函数得到原始数据data,包含自变量,因变量。
   data = datasets.load_boston()   
   
   # 构建一个dataframe数据对象,data.data是自变量数据
   x_df = pd.DataFrame(data=data.data,columns=data.feature_names)  
   
   # 构建一个dataframe数据对象,data.target是因变量数据
   y_df = pd.DataFrame(data=data.target,columns=['MEDV'])   
   x = x_df
   y = y_df

复制代码

2/划分训练集和测试集

    x_train,x_test,y_train,y_test = train_test_split(x,y, test_size=0.5, random_state=1)  
    # test_size=0.5就是把原始数据的一半作为测试集
    print(x_train.shape)  # (253,13)  253行,13列
    print(x_test.shape)
复制代码

3/模型的训练

    #划分好训练集和测试集后,就是对模型进行训练了,然后我们输出截距和权重系数,看下模型
    lr = LinearRegression()
    lr.fit(x_train, y_train)  # 把训练集的自变量,因变量添加到函数fit()中,进行训练
    print(lr.coef_)  # lr.coef_得到的是每个自变量的权重系数
    print(lr.intercept_)  # lr.intercept_得到的是截距 
复制代码

因此,波士顿房价的多元线性模型就此诞生,下面就要评估下这两个系数拟合的模型能否相对准确地预测出因变量y——房价了。
  
复制代码

4.模型的评估

对于多元线性回归模型的评估,主要有四种指标,这里我选用了RMSE——均方差根,数值越小说明模型拟合度越高
复制代码
   y_pred = lr.predict(x_test)
   from sklearn import metrics
   MSE = metrics.mean_squared_error(y_test, y_pred)
   RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))

   print('MSE:',MSE)
   print('RMSE:',RMSE)
复制代码

图中可以看到RMSE有4.779,说明拟合度还不够高,我们通过可视化来看一下训练后的预测和真实值之间的差异:
plt.figure(figsize=(15,5))
plt.plot(range(len(y_test)), y_test, 'r', label='测试数据')
plt.plot(range(len(y_test)), y_pred, 'b', label='预测数据')
plt.legend()
复制代码

可以看到许多地方,红线会明显超出蓝线,说明的确,我们的模型拟合度不够,再换个散点图来更直观地看一下:
plt.scatter(y_test, y_pred)
plt.plot([y_test.min(),y_test.max()], [y_test.min(),y_test.max()], 'k--')
plt.xlabel('真实值')
plt.ylabel('预测值') 
复制代码

图中我们可以看到,如果完全拟合,散点应该和直线相重合,这里发现,y_test=50的地方,有较多的异常值,而线性回归模型的一大缺点就是对异常值很敏感,会极大影响模型的准确性,因此,下一步,我们就根据这一点,对模型进行优化
   
复制代码

5.模型调优

# 去除MEDV=50的异常值
drop_index = y[y['MEDV']==50].index.values
x = X.drop(drop_index)
y = y.drop(drop_index)
# 这里划分训练集和测试集的参数random_state都是1,表示随机分配的数据是同一组
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=1)  # test_size=0.25,说明训练样本多了
# 对训练集进行训练
lr = LinearRegression()
lr.fit(x_train, y_train)
# 对测试集进行预测
y_pred = lr.predict(x_test)
RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
print('RMSE:',RMSE)  # 得到RMSE指标是3.573
      
可以看到,该模型的RMSE变成了3.573,大大提高了模型的准确率。这里我对回归模型的调优主要是两个方面:
      1. 增加了训练集的数量,提高训练准确度;
      2. 去除异常值,提高准确度。
      
      
复制代码

6/总结:

线性回归模型的评估可以根据RMSE来判断;
调优模型主要通过放大训练集数量以及排除异常值来进行;
LinearRegression本身的参数只有四个,大多数情况下也不需要进行参数调整,默认的就OK。

SSE(和方差、误差平方和):The sum of squares due to error
MSE(均方差、方差):Mean squared error
RMSE(均方根、标准差):Root mean squared error
R-square(确定系数):Coefficient of determination
Adjusted R-square:Degree-of-freedom adjusted coefficient of determination

一、SSE(和方差)
  该统计参数计算的是拟合数据和原始数据对应点的误差的平方和,计算公式如下:
  均方根值(RMS)+ <wbr>均方根误差(RMSE)
  SSE越接近于0,说明模型选择和拟合更好,数据预测也越成功。接下来的MSE和RMSE因为和SSE是同出一宗,所以效果一样

二、MSE(均方差)
  该统计参数是预测数据和原始数据对应点误差的平方和的均值,也就是SSE/n,和SSE没有太大的区别,计算公式如下:
  均方根值(RMS)+ <wbr>均方根误差(RMSE)

三、RMSE(均方根)
  该统计参数,也叫回归系统的拟合标准差,是MSE的平方根,就算公式如下
  均方根值(RMS)+ <wbr>均方根误差(RMSE)

在这之前,我们所有的误差参数都是基于预测值(y_hat)和原始值(y)之间的误差(即点对点)。从下面开始是所有的误差都是相对原始数据平均值(y_ba)而展开的(即点对全)!!!

四、R-square(确定系数)
  在讲确定系数之前,我们需要介绍另外两个参数SSR和SST,因为确定系数就是由它们两个决定的
  (1)SSR:Sum of squares of the regression,即预测数据与原始数据均值之差的平方和,公式如下
  均方根值(RMS)+ <wbr>均方根误差(RMSE)

  (2)SST:Total sum of squares,即原始数据和均值之差的平方和,公式如下
  均方根值(RMS)+ <wbr>均方根误差(RMSE)

  细心的网友会发现,SST=SSE+SSR,呵呵只是一个有趣的问题。而我们的“确定系数”是定义为SSR和SST的比值,故
  均方根值(RMS)+ <wbr>均方根误差(RMSE)

 其实“确定系数”是通过数据的变化来表征一个拟合的好坏。由上面的表达式可以知道“确定系数”的正常取值范围为[0,1],越接近1,表明方程的变量对y的解释能力越强,这个模型对数据拟合的也较好.


  
复制代码
分类:
人工智能
标签: