机器学习算法中如何执行回归数据的特征选择( 四 )


机器学习算法中如何执行回归数据的特征选择

文章插图
 
让我们采用另一种方法,尝试使用该方法删除一些冗余特征,而不是所有冗余特征 。
为此,我们可以将所选特征的数量设置为一个更大的值(在本例中为88),希望它可以找到并丢弃90个冗余特征中的12个 。
下面列出了完整的示例 。
该示例报告了使用相关统计量选择的100个输入特征中的88个的模型性能 。
在本例中,我们可以看到,删除一些冗余特征使性能有了小幅提升,误差约为0.085,而基线的误差约为0.086 。
机器学习算法中如何执行回归数据的特征选择

文章插图
 
(三)使用相关信息特征构建的模型下面列出了实现此目的的select_features()函数的更新版本 。
def select_features(X_train, y_train, X_test): # configure to select a subset of features fs = SelectKBest(score_func=mutual_info_regression, k=88) # learn relationship from training data fs.fit(X_train, y_train) # transform train input data X_train_fs = fs.transform(X_train) # transform test input data X_test_fs = fs.transform(X_test) return X_train_fs, X_test_fs, fs下面列出了使用相关信息进行特征选择以拟合线性回归模型的完整示例 。
from sklearn.datasets import make_regressionfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import mutual_info_regressionfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_absolute_error # feature selectiondef select_features(X_train, y_train, X_test): # configure to select a subset of features fs = SelectKBest(score_func=mutual_info_regression, k=88) # learn relationship from training data fs.fit(X_train, y_train) # transform train input data X_train_fs = fs.transform(X_train) # transform test input data X_test_fs = fs.transform(X_test) return X_train_fs, X_test_fs, fs # load the datasetX, y = make_regression(n_samples=1000, n_features=100, n_informative=10, noise=0.1, random_state=1)# split into train and test setsX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)# feature selectionX_train_fs, X_test_fs, fs = select_features(X_train, y_train, X_test)# fit the modelmodel = LinearRegression()model.fit(X_train_fs, y_train)# evaluate the modelyhat = model.predict(X_test_fs)# evaluate predictionsmae = mean_absolute_error(y_test, yhat)print('MAE: %.3f' % mae)运行这个例子符合该模型在前88个选择使用相关信息特征选择 。
在这种情况下,我们可以看到与相关统计量相比误差的进一步减少,在这种情况下,相对于上一节的0.085,MAE达到了大约0.084 。
机器学习算法中如何执行回归数据的特征选择

文章插图
 
四、调整所选特征的数量在上一个示例中,我们选择了88个特征,但是如何知道要选择的特征数量是否是最佳 。
无需猜测,我们可以系统地测试一系列不同数量的所选特征,并发现哪种结果会产生最佳性能的模型 。这称为网格搜索,其中可以调整SelectKBest类的k参数 。
使用重复分层k-fold cross-validation来评估回归任务上的模型配置是一种好习惯 。我们将通过RepeatedKFold类使用三个重复的10倍交叉验证 。
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)我们可以定义一条通道,以正确准备训练集上的特征选择变换,并将其应用于交叉验证的每一折的训练集和测试集 。
在这种情况下,我们将使用相关信息统计方法来选择特征 。
# define the pipeline to evaluatemodel = LinearRegression()fs = SelectKBest(score_func=mutual_info_regression)pipeline = Pipeline(steps=[('sel',fs), ('lr', model)])然后,我们可以定义值的网格以评估为80到100 。
请注意,网格是要搜索的参数到值的字典映射,并且假设我们使用的是Pipeline,则可以通过给我们提供的名称“ sel ”和参数名称“ k ” 来访问SelectKBest对象 。两个下划线或“ sel__k ” 。
# define the gridgrid = dict()grid['sel__k'] = [i for i in range(X.shape[1]-20, X.shape[1]+1)]然后,我们可以定义并运行搜索 。
在这种情况下,我们将使用负平均绝对误差(neg_mean_absolute_error)评估模型 。它是负数,因为scikit-learn需要使分数最大化,因此MAE变为负数,这意味着分数从-infinity到0(最佳) 。
# define the grid searchsearch = GridSearchCV(pipeline, grid, scoring='neg_mean_absolure_error', n_jobs=-1, cv=cv)# perform the searchresults = search.fit(X, y)下面列出了完整的示例


推荐阅读