【问题标题】:Wrapper custom class for scikit-learn's Iterative Imputer for use with cross_val_score()scikit-learn 的 Iterative Imputer 的包装器自定义类,用于与 cross_val_score() 一起使用
【发布时间】:2021-07-30 19:30:53
【问题描述】:

Scikit-learn 的 Iterative Imputer 可以以 round-robin 方式估算缺失值。为了评估其与其他传统回归器的性能,可以构建一个简单的管道并从 cross_val_score 获取评分指标。问题是Iterative Imputer没有根据错误的“预测”方法:

AttributeError: 'IterativeImputer' object has no attribute 'predict'

查看尝试实现的目标的最小示例:

# import libraries
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline

# define scaler, model and pipeline
scaler = StandardScaler() # use any scaler
imputer = IterativeImputer() # with any estimator, default = BayesianRidge()
pipeline = Pipeline(steps=[('s', scaler), ('i', imputer)])

train, test = df.values, df['A'].values 
scores = cross_val_score(pipeline, train, test, cv=10, scoring='r2')
print(scores)

存在哪些可能的解决方案?如果需要自定义包装器,应如何编写以包含“预测”方法?

【问题讨论】:

  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • 您必须将model 添加为Pipeline 中的最后一个元素。而model 将有predict

标签: python machine-learning scikit-learn missing-data imputation


【解决方案1】:

cross_val_score 需要pipelinemodel 结尾(有predict

scaler  = StandardScaler()
imputer = IterativeImputer()
model   = BayesianRidge()  # any model

pipeline = Pipeline(steps=[('s', scaler), ('i', imputer), ('m', model)])

cross_val_score 没有model 毫无意义。


我还看到了其他问题 - 您在 cross_val_score 中使用的值 traintest

它应该是 Xy 而不是 traintest,但它只是名称,所以它不是那么重要,但重要的是你对变量的赋值。

问题是X 应该没有y,但你使用train = df.values 所以你创建Xy

df_train = pd.DataFrame({
                'X': range(20), 
                'y': range(20),
           })

X_train = df_train[ ['X'] ]  # it needs inner `[]` to create DataFrame, not Series
y_train = df_train[  'y'  ]  # it has to be single column (Series)

scores = cross_val_score(pipeline, X_train, y_train, cv=10, scoring='r2')

(顺便说一句:你不必使用.values

多列也一样

df_train = pd.DataFrame({
                'A': range(20), 
                'B': range(20), 
                'y': range(20),
           })

X_train = df_train[ ['A', 'B'] ]
y_train = df_train[ 'y' ]

最少的工作代码,但带有假数据(无用)

# import libraries
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.linear_model import BayesianRidge

df_train = pd.DataFrame({
                'A': range(100),  # fake data
                'B': range(100),  # fake data
                'y': range(100),  # fake data
           })

df_test = pd.DataFrame({
                'A': range(20),  # fake data
                'B': range(20),  # fake data
                'y': range(20),  # fake data
           })

# define scaler, model and pipeline
scaler  = StandardScaler()
imputer = IterativeImputer()
model   = BayesianRidge()

pipeline = Pipeline(steps=[('s', scaler), ('i', imputer), ('m', model)])

X_train = df_train[ ['A', 'B'] ]  # it needs inner `[]` to create DataFrame, not Series
y_train = df_train[ 'y' ]         # it has to be single column (Series)

scores = cross_val_score(pipeline, X_train, y_train, cv=10, scoring='r2')
print(scores)

X_test = df_test[['A', 'B']]
y_test = df_test['y']

scores = cross_val_score(pipeline, X_test, y_test, cv=10, scoring='r2')
print(scores)

【讨论】:

  • 感谢您的详细回复和发布建议!如果 IterativeImputer() 方法本身被用作回归器方法来预测缺失值,那怎么可能呢?例如,给定 A、B 和 C 列,目的是使用 IterativeImputer() 使用 A、B 列(使用定义的回归估计器)预测(和估算)列 C 的值。
  • IterativeImputer 仅用于填充缺失值 - 不用于预测值。也许它使用回归来填充值,但它并不是为了作为预测的真实模型而创建的。创建它只是为了在将缺失值用于真实模型之前填充缺失值。它仅用于预处理数据。
猜你喜欢
  • 1970-01-01
  • 2019-12-02
  • 2020-09-23
  • 2016-12-18
  • 2018-06-21
  • 2020-07-01
  • 2021-02-02
  • 2014-05-01
  • 1970-01-01
相关资源
最近更新 更多