python的自变量选择(所有子集回归,后退法,逐步回归)

  • Post category:Python

Python中的自变量选择是指在建立回归模型时,选择哪些自变量对因变量的影响最大。常用的自变量选择方法包括所有子集回归、后退法和逐步回归。本文将详细介绍这三种方法的实现过程,并提供两个示例说明。

所有子集回归

所有子集回归是一种穷举法,它将所有可能的自变量组合都考虑到,并选择最优的组合。在Python中,我们可以使用mlxtend库中的ExhaustiveFeatureSelector类来实现所有子集回归。下面是一个简单的示例,用于演示如何使用Python进行所有子集回归。

from mlxtend.feature_selection import ExhaustiveFeatureSelector
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target

# 创建线性回归模型
lr = LinearRegression()

# 创建所有子集回归对象
efs = ExhaustiveFeatureSelector(lr, min_features=1, max_features=13, scoring='r2')

# 运行所有子集回归
efs = efs.fit(X, y)

# 输出结果
print('Best subset:', efs.best_idx_)
print('Best score:', efs.best_score_)

在这个示例中,我们首先使用load_boston函数加载波士顿房价数据集。然后,我们创建一个线性回归模型,并使用ExhaustiveFeatureSelector类来实现所有子集回归。我们将最小特征数设置为1,最大特征数设置为13,并将评分指标设置为R2。然后,我们使用fit方法运行所有子集回归,并输出结果。在输出结果中,best_idx_表示最佳特征组合的索引,best_score_表示最佳特征组合的R2得分。

后退法

后退法是一种逐步删除法,它从包含所有自变量的模型开始,每次删除一个自变量,直到删除自变量不再改善模型为止。在Python中,我们可以使用sklearn库中的RFE类来实现后退法。下面是一个简单的示例,用于演示如何使用Python进行后退法。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target

# 创建线性回归模型
lr = LinearRegression()

# 创建后退法对象
rfe = RFE(lr, n_features_to_select=5)

# 运行后退法
rfe = rfe.fit(X, y)

# 输出结果
print('Selected features:', rfe.support_)
print('Feature ranking:', rfe.ranking_)

在这个示例中,我们首先使用load_boston函数加载波士顿房价数据集。然后,我们创建一个线性回归模型,并使用RFE类来实现后退法。我们将要选择的特征数设置为5。然后,我们使用fit方法运行后退法,并输出结果。在输出结果中,support_表示被选中的特征,ranking_表示特征的排名。

逐步回归

逐步回归是一种逐步添加法,它从包含一个自变量的模型开始,每次添加一个自变量,直到添加自变量不再改善模型为止。在Python中,我们可以使用sklearn库中的SequentialFeatureSelector类来实现逐步回归。下面是一个简单的示例,用于演示如何使用Python进行逐步回归。

from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target

# 创建线性回归模型
lr = LinearRegression()

# 创建逐步回归对象
sfs = SequentialFeatureSelector(lr, n_features_to_select=5)

# 运行逐步回归
sfs = sfs.fit(X, y)

# 输出结果
print('Selected features:', sfs.support_)
print('Feature ranking:', sfs.ranking_)

在这个示例中,我们首先使用load_boston函数加载波士顿房价数据集。然后,我们创建一个线性回归模型,并使用SequentialFeatureSelector类来实现逐步回归。我们将要选择的特征数设置为5。然后,我们使用fit方法运行逐步回归,并输出结果。在输出结果中,support_表示被选中的特征,ranking_表示特征的排名。

示例1:使用所有子集回归进行波士顿房价预测

下面是一个示例,用于演示如何使用所有子集回归进行波士顿房价预测。在这个示例中,我们使用所有子集回归来选择最佳特征组合,并使用线性回归模型进行预测。

from mlxtend.feature_selection import ExhaustiveFeatureSelector
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建线性回归模型
lr = LinearRegression()

# 创建所有子集回归对象
efs = ExhaustiveFeatureSelector(lr, min_features=1, max_features=13, scoring='neg_mean_squared_error')

# 运行所有子集回归
efs = efs.fit(X_train, y_train)

# 选择最佳特征组合
X_train_new = X_train[:, efs.best_idx_]
X_test_new = X_test[:, efs.best_idx_]

# 训练模型
lr.fit(X_train_new, y_train)

# 预测测试集
y_pred = lr.predict(X_test_new)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print('MSE:', mse)

在这个示例中,我们首先使用load_boston函数加载波士顿房价数据集。然后,我们将数据集划分为训练集和测试集,其中测试集占总数据集的30%。接下来,我们创建一个线性回归模型,并使用ExhaustiveFeatureSelector类来实现所有子集回归。我们将最小特征数设置为1,最大特征数设置为13,并将评分指标设置为负均方误差。然后,我们使用fit方法运行所有子集回归,并选择最佳特征组合。接下来,我们使用训练集中的最佳特征组合来训练模型,并使用测试集来预测新样本的房价。最后,我们计算模型的均方误差,并输出结果。

示例2:使用后退法进行鸢尾花分类

下面是一个示例,用于演示如何使用后退法进行鸢尾花分类。在这个示例中,我们使用后退法来选择最佳特征组合,并使用逻辑回归模型进行分类。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建逻辑回归模型
lr = LogisticRegression()

# 创建后退法对象
rfe = RFE(lr, n_features_to_select=2)

# 运行后退法
rfe = rfe.fit(X_train, y_train)

# 选择最佳特征组合
X_train_new = X_train[:, rfe.support_]
X_test_new = X_test[:, rfe.support_]

# 训练模型
lr.fit(X_train_new, y_train)

# 预测测试集
y_pred = lr.predict(X_test_new)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)

在这个示例中,我们首先使用load_iris函数加载鸢尾花数据集。然后,我们将数据集划分为训练集和测试集,其中测试集占总数据集的30%。接下来,我们创建一个逻辑回归模型,并使用RFE类来实现后退法。我们将要选择的特征数设置为2。然后,我们使用fit方法运行后退法,并选择最佳特征组合。接下来,我们使用训练集中的最佳特征组合来训练模型,并使用测试集来预测新样本的类别。最后,我们计算模型的准确率,并输出结果。

总结

本文介绍了Python中的自变量选择方法,包括所有子集回归、后退法和逐步回归。我们提供了详细的实现过程,并提供了两个示例说明。在实际应用中,我们可以根据具体的问题选择不同的自变量选择方法,并结合其他算法进行综合处理,实现复杂的数据结构和算法。