📜  机器学习中的后向消除法

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

什么是后向消除?

向后消除是构建机器学习模型时的功能选择技术。它用于删除那些对因变量或输出预测没有重大影响的功能。在机器学习中有多种构建模型的方法,包括:

  • 全能
  • 后向消除
  • 正向选择
  • 双向消除
  • 分数比较

以上是在机器学习中构建模型的可能方法,但是我们这里仅使用“反向淘汰”过程,因为它是最快的方法。

后退步骤

以下是用于应用反向消除过程的一些主要步骤:

步骤1:首先,我们需要选择一个显着性水平以保留在模型中。 (SL = 0.05)

步骤2:使用所有可能的预测变量/独立变量拟合完整模型。

步骤3:选择具有最高P值的预测变量。

  • 如果P值> SL,请转到步骤4。
  • 其他完成,我们的模型已经准备就绪。

步骤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-准备向后淘汰:

  • 导入库:首先,我们需要导入statsmodels.formula.api库,该库用于估计各种统计模型,例如OLS(普通最小二乘)。下面是它的代码:
import statsmodels.api as smf
  • 在要素矩阵中添加一列:正如我们可以在MLR方程(a)中检查的那样,存在一个常数项b 0 ,但是该项在要素矩阵中不存在,因此我们需要手动添加。我们将添加一个与常数项b 0相关联的值x 0 = 1的列。
    要添加此代码,我们将使用Numpy库的append 函数 (已经导入到代码中的nm),并将其值指定为1。下面是该代码。
x = nm.append(arr = nm.ones((50,1)).astype(int), values=x, axis=1)

在这里,我们要使用轴= 1,因为我们想添加一列。为了添加一行,我们可以使用轴= 0。

输出:通过执行上述代码行,新列将添加到要素矩阵中,所有值均等于1。我们可以通过单击变量资源管理器选项下的x数据集进行检查。

如我们在上面的输出图像中看到的,成功添加了第一列,它对应于MLR方程的常数项。

第2步:

  • 现在,我们实际上将应用反向消除过程。首先,我们将创建一个新的特征向量x_opt ,该向量仅包含会严重影响因变量的一组独立特征。
  • 接下来,根据“向后淘汰”过程,我们需要选择一个显着水平(0.5),然后需要对模型进行所有可能的预测。所以对于拟合模型,我们将创建的statsmodels库的新类OLS一个regressor_OLS对象。然后,我们将使用fit()方法对其进行拟合
  • 接下来,我们需要p值与SL 进行比较,为此,我们将使用summary()方法来获取所有值的汇总表。下面是它的代码:
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。因此,我们将在下一次迭代中将其删除。

  • 现在,x1变量的下一个最大值是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,因此我们需要将其删除。

  • 现在,我们将删除p值为.602的管理员支出,然后再次调整模型。
x_opt=x[:, [0,3,5]]
regressor_OLS=sm.OLS(endog = y, exog=x_opt).fit()
regressor_OLS.summary()

输出:

如上图所示,变量(管理员支出)已被删除。但是仍然剩下一个变量,那就是市场营销支出,因为它具有较高的p值(0.60)。因此,我们需要将其删除。

  • 最后,我们将删除另一个变量,该变量的营销支出具有0.60 p值,超过了一个显着水平。
    下面是它的代码:
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支出)而不是四个变量来获得此结果。因此,现在,我们的模型是简单而准确的。