Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 特征选择:在嵌套交叉验证之后还是在嵌套交叉验证期间?_Python_Scikit Learn_Cross Validation_Feature Selection_Hyperparameters - Fatal编程技术网

Python 特征选择:在嵌套交叉验证之后还是在嵌套交叉验证期间?

Python 特征选择:在嵌套交叉验证之后还是在嵌套交叉验证期间?,python,scikit-learn,cross-validation,feature-selection,hyperparameters,Python,Scikit Learn,Cross Validation,Feature Selection,Hyperparameters,我已经成功地编写了一些代码,使用lightGBM作为回归器进行嵌套交叉验证,并使用sklearn.pipeline包装everying 最终,我现在想做特征选择(或者仅仅是获取特征对最终模型的重要性),但我想知道从这里开始的最佳路径是什么。我想有两种可能: 1#使用此方法使用最佳超参数构建模型(使用.fit和.predict)。然后检查此模型的功能的重要性 2#在嵌套cv的内部折叠中进行特征选择,但我不确定如何准确地进行选择 我想#1是最简单的,但我不确定如何为每个外层文件夹获取最佳超参数 这条

我已经成功地编写了一些代码,使用lightGBM作为回归器进行嵌套交叉验证,并使用sklearn.pipeline包装everying

最终,我现在想做特征选择(或者仅仅是获取特征对最终模型的重要性),但我想知道从这里开始的最佳路径是什么。我想有两种可能:

1#使用此方法使用最佳超参数构建模型(使用.fit和.predict)。然后检查此模型的功能的重要性

2#在嵌套cv的内部折叠中进行特征选择,但我不确定如何准确地进行选择

我想#1是最简单的,但我不确定如何为每个外层文件夹获取最佳超参数

这条线碰到了它:

但选定的答案会完全删除交叉验证分数,这意味着它不再是嵌套交叉验证(在获得内部折叠的最佳超参数后,我仍然希望在外部折叠上执行CV)

因此,我的问题如下:

  • 我可以得到外CV(我是 注意,如果我有5个折叠,我将得到5组不同的特征 重要性)?如果是,怎么做
  • 或者,我是否应该为每个参数获取最佳超参数 折叠(如何?)并在整个数据集上构建一个没有CV的新模型, 基于这些超参数
  • 以下是我目前掌握的代码:

    将numpy导入为np
    作为pd进口熊猫
    将lightgbm作为lgb导入
    从sklearn.model_选择导入交叉值、随机搜索CV、KFold
    从sklearn.preprocessing导入StandardScaler
    从sklearn.pipeline导入管道
    从sklearn.compose导入ColumnTransformer
    将scipy.stats导入为st
    #用于建立再现性模型的参数
    X=X_年龄
    y=y_年龄
    RNGesus=42
    州=13
    外部评分='负平均绝对错误'
    内部评分='负平均值\绝对误差'
    ####带随机网格搜索的嵌套CV####
    #具有标准标度的管道和回归器
    回归器=[lgb.LGBMRegressor(random_state=state)]
    连续转换器=管道([('scaler',StandardScaler())])
    预处理器=列转换器([('cont',continuous\u transformer,continuous\u variables)],余数='passthrough')
    对于回归中的reg:
    步骤=[('preprocessor',preprocessor),('regressor',reg)]
    管道=管道(步骤)
    #要使用的内部和外部折叠
    内部循环=KFold(n\u分割=5,随机循环=真,随机状态=RNGesus)
    外部循环=KFold(n次分割=5,随机循环=True,随机状态=RNGesus)
    #使用随机搜索优化回归器的超参数
    参数={
    “回归器最大深度”:(3,5,7,10),
    “回归器λ1”:标准均匀(0,5),
    “回归器λ2”:标准均匀(0,3)
    }
    #将随机搜索CV传递给cross_val_分数
    回归=随机搜索cv(估计器=管道,参数分布=参数,评分=内部评分,cv=内部评分,n_iter=200,详细=3,n_作业=-1)
    嵌套评分=交叉评分(回归,X=X,y=y,cv=外部评分,评分=外部评分)
    打印('\n lightGBM模型预测年龄的MAE:%.3f'(abs(嵌套的评分.mean()))
    
    print('\n'str(嵌套的评分)+'我在导入
    lightGBM
    模块时遇到问题,因此我无法运行您的代码。但下面将解释如何无法获得“获胜”或最佳超参数(以及
    功能的重要性)
    )通过
    cross\u val\u score
    进行嵌套交叉验证。简单地说,原因是
    cross\u val\u score
    仅返回测量值

  • 我能获得外部CV每个折叠的特征重要性吗(我知道如果我有5个折叠,我将获得5组不同的特征重要性)?如果是,如何获得
  • 对于
    cross\u val\u score
    ,答案是否定的。但是如果你按照那篇文章中的代码进行操作,你将能够通过
    GSCV.fit()之后的for循环下的
    GSCV.best\u estimator\u.feature\u importance\u
    获得
    功能的重要性

  • 或者,我是否应该为每个折叠获取最佳超参数(如何?),并基于这些超参数在整个数据集上构建一个没有CV的新模型

  • 这正是那篇文章所说的:通过嵌套cv获得“最佳”超参数。理想情况下,你将观察到一个始终获胜的超参数组合,这就是你将用于最终模型(整个训练集)的超参数。但是当不同的“最佳”时超参数组合出现在cv期间,据我所知,没有标准的方法来处理它。

    我在导入
    lightGBM
    模块时遇到问题,因此我无法运行您的代码。但这里解释了如何无法获得“获胜”或最佳超参数(以及
    功能的重要性)
    )通过
    cross\u val\u score
    进行嵌套交叉验证。简单地说,原因是
    cross\u val\u score
    仅返回测量值

  • 我能获得外部CV每个折叠的特征重要性吗(我知道如果我有5个折叠,我将获得5组不同的特征重要性)?如果是,如何获得
  • 对于
    cross\u val\u score
    ,答案是否定的。但是如果你按照那篇文章中的代码进行操作,你将能够通过
    GSCV.fit()之后的for循环下的
    GSCV.best\u estimator\u.feature\u importance\u
    获得
    功能的重要性

  • 或者,我是否应该为每个折叠获取最佳超参数(如何?),并基于这些超参数在整个数据集上构建一个没有CV的新模型
  • 这正是那篇文章所说的:通过嵌套cv获得“最佳”超参数。理想情况下,你会观察到一个超参数组合,它一直获胜,这就是你将用于最终模型(整个训练集)的超参数。但是当