📅  最后修改于: 2020-09-27 02:11:57             🧑  作者: Mango
在上一主题中,我们了解了简单线性回归,其中使用了一个独立变量/预测变量(X)来对响应变量(Y)进行建模。但是在许多情况下,响应变量会受到多个预测变量的影响;在这种情况下,将使用多元线性回归算法。
此外,多元线性回归是简单线性回归的扩展,因为它需要多个预测变量来预测响应变量。我们可以将其定义为:
多元线性回归是重要的回归算法之一,它对单个因变量和多个自变量之间的线性关系进行建模。
例:
根据发动机尺寸和汽车气缸数预测二氧化碳排放量。
有关MLR的一些关键点:
在多元线性回归中,目标变量(Y)是多个预测变量x1,x2,x3,…,xn的线性组合。由于它是对简单线性回归的增强,因此对多元线性回归方程式也是如此,该方程式变为:
Y= b0+b1x1+ b2x2+ b3x3+...... bnxn ............... (a)
哪里,
Y =输出/响应变量
b0,b1,b2,b3,bn …. =模型的系数。
x1,x2,x3,x4,… =各种独立/功能变量
要使用Python实现MLR,我们存在以下问题:
问题描述:
我们有一个包含50家初创公司的数据集。该数据集包含五个主要信息:一个财政年度的R&D支出,管理支出,营销支出,状态和利润。我们的目标是创建一个模型,可以轻松确定哪个公司的利润最高,哪个是影响公司利润的最大因素。
由于我们需要找到利润,因此它是因变量,而其他四个变量是自变量。以下是部署MLR模型的主要步骤:
步骤1:数据预处理步骤:
第一步是数据预处理,我们已经在本教程中讨论过了。此过程包含以下步骤:
# importing libraries
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd
#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中,我们不会进行功能缩放,因为库会谨慎处理它,因此我们不需要手动进行缩放。
现在,我们已经准备好数据集以提供训练,这意味着我们将使回归模型适合训练集。这将与我们在简单线性回归模型中所做的相似。此代码为:
#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)
现在,我们已经使用训练数据集成功地训练了模型。在下一步中,我们将使用测试数据集来测试模型的性能。
我们模型的最后一步是检查模型的性能。我们将通过预测测试集结果来做到这一点。为了进行预测,我们将创建一个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%。
注意:在下一个主题中,我们将看到如何使用“向后消除”过程改善模型的性能。
多元线性回归主要有两个应用: