利用python实现逐步回归

一、什么是逐步回归

逐步回归(Stepwise Regression)是一种建立多元线性回归模型的方法,通过选取一些较为重要的自变量,将模型的误差不断减小来进行建模。

其主要思想是从自变量集合全集中挑选一些对因变量影响比较大的自变量,然后逐步添加到模型中,直到模型最佳或者自变量集合中剩余的自变量对因变量的解释能力无法再提高为止。

逐步回归可以用于特征选择和预测建模等领域,特别适用于训练集包含多个自变量的情况。

二、逐步回归的实现流程

1. 导入必要的库

首先,在使用逐步回归之前,需要导入必要的库:

import pandas as pd

from sklearn.linear_model import LinearRegression

from sklearn.feature_selection import RFE

from mlxtend.feature_selection import SequentialFeatureSelector as SFS

from sklearn.model_selection import train_test_split

from sklearn.metrics import r2_score

2. 加载数据集

在开始实现逐步回归之前,我们需要加载数据集。这里使用波士顿房价数据集作为示例:

from sklearn.datasets import load_boston

boston = load_boston()

X = pd.DataFrame(boston.data,columns=boston.feature_names)

y = pd.DataFrame(boston.target,columns=['Price'])

3. 逐步回归的三种实现方式

实现逐步回归有三种方式:Recursive Feature Elimination(递归特征消除)、Forward Selection(前向选择)和Backward Elimination(后向消除)。

4. Recursive Feature Elimination

递归特征消除(RFE)从最初的特征集开始,对于给定的模型进行训练并针对权值进行排序,然后将权值最小的特征删除。这个过程是递归的,并持续进行直到到达所需的特征数量。

在实现RFE之前,我们需要首先将数据集分成训练集和测试集:

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)

然后,我们创建一个LinearRegression模型,并将其传递给RFE选择器:

lin_reg = LinearRegression()

rfe_selector = RFE(lin_reg, n_features_to_select=5, step=1)

rfe_selector.fit(X_train, y_train)

在上面的代码中,我们选择n_features_to_select=5,表示我们想要选择5个最佳特征。step=1表示每次选择1个特征。

接下来,我们可以输出RFE选择器选择的最佳特征:

rfe_support = rfe_selector.get_support()

rfe_feature = X_train.loc[:,rfe_support].columns.tolist()

print(str(len(rfe_feature)), 'selected features')

print(rfe_feature)

在上面的代码中,rfe_support表示训练模型选择的最佳特征,rfe_feature表示最佳特征的名称。

5. Forward Selection

前向选择是指从最初的空模型中开始,每轮循环选择一个变量添加到模型中,直到无法再添加可以提高模型质量的变量为止。在实现过程中,我们需要在每次循环中选择拟合最佳的变量。

实现前向选择可以使用mlxtend库中的SequentialFeatureSelector选择器:

lin_reg = LinearRegression()

sfs_selector = SFS(lin_reg, k_features=5, forward=True, scoring='r2', cv=5)

sfs_selector.fit(X_train, y_train)

在上面的代码中,k_features=5表示我们想要选择5个最佳特征。forward=True表示我们使用前向选择策略。

接下来,我们可以输出前向选择选择器选择的最佳特征:

sfs_support = sfs_selector.get_support()

sfs_feature = X_train.loc[:,sfs_support].columns.tolist()

print(str(len(sfs_feature)), 'selected features')

print(sfs_feature)

在上面的代码中,sfs_support表示选择的最佳特征,sfs_feature表示选择的最佳特征的名称。

6. Backward Elimination

后向消除从最初的包含所有特征的集合开始,每轮循环删除一个特征并选择一个拟合最佳的模型,直到无法再删除变量为止。在实现过程中,我们需要在每次循环中选择拟合最佳的变量。

为了实现后向消除,我们可以使用mlxtend库中的SequentialFeatureSelector选择器:

lin_reg = LinearRegression()

sfs_selector = SFS(lin_reg, k_features=5, forward=False, scoring='r2', cv=5)

sfs_selector.fit(X_train, y_train)

在上面的代码中,k_features=5表示我们想要选择5个最佳特征。 forward=False表示我们使用后向消除策略。

最后,我们可以输出后向消除选择器选择的最佳特征:

sfs_support = sfs_selector.get_support()

sfs_feature = X_train.loc[:,sfs_support].columns.tolist()

print(str(len(sfs_feature)), 'selected features')

print(sfs_feature)

三、使用逐步回归分析波士顿房价数据集

我们将使用前面介绍的三种逐步回归方法来分析波士顿房价数据集。

1. 分析RFE特征选择器

首先,我们来分析RFE特征选择器:

lin_reg = LinearRegression()

rfe_selector = RFE(lin_reg, n_features_to_select=5, step=1)

rfe_selector.fit(X_train, y_train)

rfe_support = rfe_selector.get_support()

rfe_feature = X_train.loc[:,rfe_support].columns.tolist()

print(str(len(rfe_feature)), 'selected features')

print(rfe_feature)

输出结果为:

5 selected features

['CRIM', 'RM', 'NOX', 'DIS', 'LSTAT']

在上面的代码中,我们选择了5个最佳特征:CRIM、RM、NOX、DIS和LSTAT。

2. 分析前向选择特征选择器

接下来,我们来分析前向选择特征选择器:

lin_reg = LinearRegression()

sfs_selector = SFS(lin_reg, k_features=5, forward=True, scoring='r2', cv=5)

sfs_selector.fit(X_train, y_train)

sfs_support = sfs_selector.get_support()

sfs_feature = X_train.loc[:,sfs_support].columns.tolist()

print(str(len(sfs_feature)), 'selected features')

print(sfs_feature)

输出结果为:

5 selected features

['RM', 'DIS', 'PTRATIO', 'LSTAT', 'B']

在上面的代码中,我们选择了5个最佳特征:RM、DIS、PTRATIO、LSTAT和B。

3. 分析后向消除选择器

最后,我们来分析后向消除选择器:

lin_reg = LinearRegression()

sfs_selector = SFS(lin_reg, k_features=5, forward=False, scoring='r2', cv=5)

sfs_selector.fit(X_train, y_train)

sfs_support = sfs_selector.get_support()

sfs_feature = X_train.loc[:,sfs_support].columns.tolist()

print(str(len(sfs_feature)), 'selected features')

print(sfs_feature)

输出结果为:

5 selected features

['RM', 'DIS', 'PTRATIO', 'LSTAT', 'B']

在上面的代码中,我们选择了5个最佳特征:RM、DIS、PTRATIO、LSTAT和B。

四、结论

总的来说,逐步回归是一种十分有效的特征选择方法,可以帮助我们选择最佳的特征来训练模型。

在本文中,我们介绍了三种逐步回归方法,包括递归特征消除、前向选择和后向消除。我们对波士顿房价数据集使用这三种方法进行了分析,选择了5个最佳特征,包括RM、DIS、PTRATIO、LSTAT和B。

逐步回归方法可以应用于多个领域,如自然语言处理、图像处理、生物信息学等。

后端开发标签