📅  最后修改于: 2020-09-27 02:09:12             🧑  作者: Mango
向后消除是构建机器学习模型时的功能选择技术。它用于删除那些对因变量或输出预测没有重大影响的功能。在机器学习中有多种构建模型的方法,包括:
以上是在机器学习中构建模型的可能方法,但是我们这里仅使用“反向淘汰”过程,因为它是最快的方法。
以下是用于应用反向消除过程的一些主要步骤:
步骤1:首先,我们需要选择一个显着性水平以保留在模型中。 (SL = 0.05)
步骤2:使用所有可能的预测变量/独立变量拟合完整模型。
步骤3:选择具有最高P值的预测变量。
步骤4:删除该预测变量。
步骤5:重建模型并使用其余变量进行拟合。
在上一章中,我们讨论并成功创建了多元线性回归模型,该模型中我们采用了4个自变量(研发支出,管理支出,市场营销支出和状态(虚拟变量))和一个因变量(利润)。但是该模型不是最佳模型,因为我们已经包含了所有独立变量,并且不知道哪个独立模型对预测的影响最大,哪个独立模型对预测的影响最小。
不必要的功能会增加模型的复杂性。因此,最好仅具有最重要的功能,并保持模型简单以得到更好的结果。
因此,为了优化模型的性能,我们将使用“后向消除”方法。此过程用于优化MLR模型的性能,因为它将仅包括影响最大的功能,而删除影响最小的功能。让我们开始将其应用于我们的MLR模型。
我们将使用与MLR上一章中构建的模型相同的模型。以下是完整的代码:
# 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
#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()
#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)
#Fitting the MLR model to the training set:
from sklearn.linear_model import LinearRegression
regressor= LinearRegression()
regressor.fit(x_train, y_train)
#Predicting the Test set result;
y_pred= regressor.predict(x_test)
#Checking the score
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
两个分数之间的差异为0.0154。
注意:基于此分数,我们将在使用后向消除过程后估计特征对模型的影响。
步骤:1-准备向后淘汰:
import statsmodels.api as smf
x = nm.append(arr = nm.ones((50,1)).astype(int), values=x, axis=1)
在这里,我们要使用轴= 1,因为我们想添加一列。为了添加一行,我们可以使用轴= 0。
输出:通过执行上述代码行,新列将添加到要素矩阵中,所有值均等于1。我们可以通过单击变量资源管理器选项下的x数据集进行检查。
如我们在上面的输出图像中看到的,成功添加了第一列,它对应于MLR方程的常数项。
第2步:
x_opt=x [:, [0,1,2,3,4,5]]
regressor_OLS=sm.OLS(endog = y, exog=x_opt).fit()
regressor_OLS.summary()
输出:通过执行上述代码行,我们将获得一个摘要表。考虑下图:
在上图中,我们可以清楚地看到所有变量的p值。 x1,x2是虚拟变量,x3是研发支出,x4是管理支出,x5是市场营销支出。
从表中,我们将选择最高的p值,即x1 = 0.953。现在,我们拥有最高的p值,该值大于SL值,因此将从表中删除x1变量(虚拟变量),然后将调整模型。下面是它的代码:
x_opt=x[:, [0,2,3,4,5]]
regressor_OLS=sm.OLS(endog = y, exog=x_opt).fit()
regressor_OLS.summary()
输出:
正如我们在输出图像中看到的那样,现在剩下五个变量。在这些变量中,最高p值为0.961。因此,我们将在下一次迭代中将其删除。
x_opt= x[:, [0,3,4,5]]
regressor_OLS=sm.OLS(endog = y, exog=x_opt).fit()
regressor_OLS.summary()
输出:
在上面的输出图像中,我们可以看到虚拟变量(x2)已被删除。下一个最大值是.602,仍然大于.5,因此我们需要将其删除。
x_opt=x[:, [0,3,5]]
regressor_OLS=sm.OLS(endog = y, exog=x_opt).fit()
regressor_OLS.summary()
输出:
如上图所示,变量(管理员支出)已被删除。但是仍然剩下一个变量,那就是市场营销支出,因为它具有较高的p值(0.60)。因此,我们需要将其删除。
x_opt=x[:, [0,3]]
regressor_OLS=sm.OLS(endog = y, exog=x_opt).fit()
regressor_OLS.summary()
输出:
如上图所示,仅剩下两个变量。因此,只有R&D自变量是预测的重要变量。因此,我们现在可以使用此变量进行有效预测。
在上一个主题中,当我们使用所有特征变量时,我们已经计算了模型的训练和测试分数。现在,我们将仅使用一个功能变量(R&D支出)检查分数。我们的数据集现在看起来像:
以下是仅使用研发支出来构建多元线性回归模型的代码:
# importing libraries
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd
#importing datasets
data_set= pd.read_csv('50_CompList1.csv')
#Extracting Independent and dependent Variable
x_BE= data_set.iloc[:, :-1].values
y_BE= data_set.iloc[:, 1].values
# Splitting the dataset into training and test set.
from sklearn.model_selection import train_test_split
x_BE_train, x_BE_test, y_BE_train, y_BE_test= train_test_split(x_BE, y_BE, test_size= 0.2, random_state=0)
#Fitting the MLR model to the training set:
from sklearn.linear_model import LinearRegression
regressor= LinearRegression()
regressor.fit(nm.array(x_BE_train).reshape(-1,1), y_BE_train)
#Predicting the Test set result;
y_pred= regressor.predict(x_BE_test)
#Cheking the score
print('Train Score: ', regressor.score(x_BE_train, y_BE_train))
print('Test Score: ', regressor.score(x_BE_test, y_BE_test))
输出:
执行上述代码后,我们将获得培训和测试成绩:
Train Score: 0.9449589778363044
Test Score: 0.9464587607787219
我们可以看到,训练分数的准确度为94%,测试分数的准确度也为94%。两个分数之间的差是.00149。这个分数非常接近先前的分数,即0.0154,其中已包含所有变量。
通过仅使用一个自变量(R&D支出)而不是四个变量来获得此结果。因此,现在,我们的模型是简单而准确的。