📜  机器学习-多元线性回归

📅  最后修改于: 2020-09-27 02:11:57             🧑  作者: Mango

多元线性回归

在上一主题中,我们了解了简单线性回归,其中使用了一个独立变量/预测变量(X)来对响应变量(Y)进行建模。但是在许多情况下,响应变量会受到多个预测变量的影响;在这种情况下,将使用多元线性回归算法。

此外,多元线性回归是简单线性回归的扩展,因为它需要多个预测变量来预测响应变量。我们可以将其定义为:

多元线性回归是重要的回归算法之一,它对单个因变量和多个自变量之间的线性关系进行建模。

例:

根据发动机尺寸和汽车气缸数预测二氧化碳排放量。

有关MLR的一些关键点:

  • 对于MLR,因变量或目标变量(Y)必须为连续/实数,但预测变量或自变量可以为连续或分类形式。
  • 每个特征变量都必须与因变量建立线性关系模型。
  • MLR试图通过数据点的多维空间拟合回归线。

MLR方程:

在多元线性回归中,目标变量(Y)是多个预测变量x1,x2,x3,…,xn的线性组合。由于它是对简单线性回归的增强,因此对多元线性回归方程式也是如此,该方程式变为:

Y= b0+b1x1+ b2x2+ b3x3+...... bnxn       ............... (a)

哪里,

Y =输出/响应变量

b0,b1,b2,b3,bn …. =模型的系数。

x1,x2,x3,x4,… =各种独立/功能变量

多重线性回归的假设:

  • 目标变量和预测变量之间应存在线性关系
  • 回归残差必须为正态分布
  • MLR假设数据中几乎没有多重共线性 (自变量之间的相关性)。

使用Python实现多重线性回归模型:

要使用Python实现MLR,我们存在以下问题:

问题描述:

我们有一个包含50家初创公司的数据集。该数据集包含五个主要信息:一个财政年度的R&D支出,管理支出,营销支出,状态和利润。我们的目标是创建一个模型,可以轻松确定哪个公司的利润最高,哪个是影响公司利润的最大因素。

由于我们需要找到利润,因此它是因变量,而其他四个变量是自变量。以下是部署MLR模型的主要步骤:

  • 数据预处理步骤
  • 将MLR模型拟合到训练集
  • 预测测试集的结果

步骤1:数据预处理步骤:

第一步是数据预处理,我们已经在本教程中讨论过了。此过程包含以下步骤:

  • 导入库:首先,我们将导入库,这将有助于构建模型。下面是它的代码:
# importing libraries
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd
  • 导入数据集:现在,我们将导入包含所有变量的数据集(50_CompList)。下面是它的代码:
#importing datasets
data_set= pd.read_csv('50_CompList.csv')

输出:我们将获得数据集为:

在上面的输出中,我们可以清楚地看到有五个变量,其中四个变量是连续的,一个是分类变量。

  • 提取因变量和自变量:
#Extracting Independent and dependent Variable
x= data_set.iloc[:, :-1].values
y= data_set.iloc[:, 4].values

输出:

出[5]:

array([[165349.2, 136897.8, 471784.1, 'New York'],
       [162597.7, 151377.59, 443898.53, 'California'],
       [153441.51, 101145.55, 407934.54, 'Florida'],
       [144372.41, 118671.85, 383199.62, 'New York'],
       [142107.34, 91391.77, 366168.42, 'Florida'],
       [131876.9, 99814.71, 362861.36, 'New York'],
       [134615.46, 147198.87, 127716.82, 'California'],
       [130298.13, 145530.06, 323876.68, 'Florida'],
       [120542.52, 148718.95, 311613.29, 'New York'],
       [123334.88, 108679.17, 304981.62, 'California'],
       [101913.08, 110594.11, 229160.95, 'Florida'],
       [100671.96, 91790.61, 249744.55, 'California'],
       [93863.75, 127320.38, 249839.44, 'Florida'],
       [91992.39, 135495.07, 252664.93, 'California'],
       [119943.24, 156547.42, 256512.92, 'Florida'],
       [114523.61, 122616.84, 261776.23, 'New York'],
       [78013.11, 121597.55, 264346.06, 'California'],
       [94657.16, 145077.58, 282574.31, 'New York'],
       [91749.16, 114175.79, 294919.57, 'Florida'],
       [86419.7, 153514.11, 0.0, 'New York'],
       [76253.86, 113867.3, 298664.47, 'California'],
       [78389.47, 153773.43, 299737.29, 'New York'],
       [73994.56, 122782.75, 303319.26, 'Florida'],
       [67532.53, 105751.03, 304768.73, 'Florida'],
       [77044.01, 99281.34, 140574.81, 'New York'],
       [64664.71, 139553.16, 137962.62, 'California'],
       [75328.87, 144135.98, 134050.07, 'Florida'],
       [72107.6, 127864.55, 353183.81, 'New York'],
       [66051.52, 182645.56, 118148.2, 'Florida'],
       [65605.48, 153032.06, 107138.38, 'New York'],
       [61994.48, 115641.28, 91131.24, 'Florida'],
       [61136.38, 152701.92, 88218.23, 'New York'],
       [63408.86, 129219.61, 46085.25, 'California'],
       [55493.95, 103057.49, 214634.81, 'Florida'],
       [46426.07, 157693.92, 210797.67, 'California'],
       [46014.02, 85047.44, 205517.64, 'New York'],
       [28663.76, 127056.21, 201126.82, 'Florida'],
       [44069.95, 51283.14, 197029.42, 'California'],
       [20229.59, 65947.93, 185265.1, 'New York'],
       [38558.51, 82982.09, 174999.3, 'California'],
       [28754.33, 118546.05, 172795.67, 'California'],
       [27892.92, 84710.77, 164470.71, 'Florida'],
       [23640.93, 96189.63, 148001.11, 'California'],
       [15505.73, 127382.3, 35534.17, 'New York'],
       [22177.74, 154806.14, 28334.72, 'California'],
       [1000.23, 124153.04, 1903.93, 'New York'],
       [1315.46, 115816.21, 297114.46, 'Florida'],
       [0.0, 135426.92, 0.0, 'California'],
       [542.05, 51743.15, 0.0, 'New York'],
       [0.0, 116983.8, 45173.06, 'California']], dtype=object)

从上面的输出中可以看到,最后一列包含分类变量,这些变量不适合直接应用于拟合模型。因此,我们需要对该变量进行编码。

编码虚拟变量:

由于我们有一个类别变量(State),它不能直接应用于模型,因此我们将对其进行编码。要将分类变量编码为数字,我们将使用LabelEncoder类。但这还不够,因为它仍然具有某些关系顺序,这可能会创建错误的模型。因此,为了消除此问题,我们将使用OneHotEncoder,它将创建虚拟变量。下面是它的代码:

#Catgorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_x= LabelEncoder()
x[:, 3]= labelencoder_x.fit_transform(x[:,3])
onehotencoder= OneHotEncoder(categorical_features= [3])  
x= onehotencoder.fit_transform(x).toarray()

在这里,我们仅编码一个自变量,它是状态,因为其他变量是连续的。

输出:

从上面的输出中可以看到,状态列已转换为伪变量(0和1)。在此,每个虚拟变量列都对应一个状态。我们可以通过将其与原始数据集进行比较来进行检查。第一列对应于加利福尼亚州,第二列对应于佛罗里达州,第三列对应于纽约州。

注意:我们不应该同时使用所有虚拟变量,因此它必须比虚拟变量总数少1,否则会创建虚拟变量陷阱。

  • 现在,我们正在编写一行代码,只是为了避免虚拟变量陷阱:
#avoiding the dummy variable trap:
x = x[:, 1:]

如果我们不删除第一个虚拟变量,那么它可能会在模型中引入多重共线性。

如上图所示,第一列已被删除。

  • 现在,我们将数据集分为训练集和测试集。下面给出了此代码:
# Splitting the dataset into training and test set.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.2, random_state=0)

上面的代码会将我们的数据集分为训练集和测试集。

输出:上面的代码将数据集分为训练集和测试集。您可以通过单击Spyder IDE中提供的变量资源管理器选项来检查输出。测试集和训练集如下图所示:

测试集:

训练集:


注意:在MLR中,我们不会进行功能缩放,因为库会谨慎处理它,因此我们不需要手动进行缩放。

步骤:2-将我们的MLR模型拟合到训练集:

现在,我们已经准备好数据集以提供训练,这意味着我们将使回归模型适合训练集。这将与我们在简单线性回归模型中所做的相似。此代码为:

#Fitting the MLR model to the training set:
from sklearn.linear_model import LinearRegression
regressor= LinearRegression()
regressor.fit(x_train, y_train)

输出:

Out[9]: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

现在,我们已经使用训练数据集成功地训练了模型。在下一步中,我们将使用测试数据集来测试模型的性能。

步骤:3-测试集结果的预测:

我们模型的最后一步是检查模型的性能。我们将通过预测测试集结果来做到这一点。为了进行预测,我们将创建一个y_pred向量。下面是它的代码:

#Predicting the Test set result;
y_pred= regressor.predict(x_test)

通过执行以上代码行,将在变量资源管理器选项下生成一个新的向量。我们可以通过比较预测值和测试集值来测试模型。

输出:

在上面的输出中,我们已经预测了结果集和测试集。我们可以通过按索引比较这两个值来检查模型性能。例如,第一指数的预测价值为利润103015 $,测试/实际价值为103282 $。差异仅为267 $,这是一个很好的预测,因此,最终,我们的模型在这里完成。

  • 我们还可以检查训练数据集和测试数据集的分数。下面是它的代码:
print('Train Score: ', regressor.score(x_train, y_train))
print('Test Score: ', regressor.score(x_test, y_test))

输出:得分是:

Train Score:  0.9501847627493607
Test Score:  0.9347068473282446

上面的分数表明,我们的模型对训练数据集的准确性为95%,对测试数据集的准确性为93%。

注意:在下一个主题中,我们将看到如何使用“向后消除”过程改善模型的性能。

多元线性回归的应用:

多元线性回归主要有两个应用:

  • 自变量对预测的有效性:
  • 预测变更的影响: