python - 使用 Sklearn 的 GridSearchCV 寻找无需估计器的最佳插补方法

标签 python scikit-learn missing-data imputation

我想找到 Scikit-learn 中缺失数据的最佳插补方法。

我有一个数据集 X,并且在 X_na 中创建了它的人为损坏版本,因此我可以测量不同插补的质量。此时我想知道是否可以使用 sklearn 的 GridSearchCV 来搜索可能的输入器版本,如下所示:

imputer_pipeline = Pipeline([("imputer":SimpleImputer())]

params = [{"imputer":[SimpleImputer()]},
          {"imputer":[IterativeImputer()]},
          {"imputer":[KNNImputer()], "imputer__n_neighbors": [3, 5, 7]}]

imputer_grid = GridSearchCV(imputer_pipe, param_grid=params, scoring="mse", cv=5)
imputer_grid.fit(X_na, X)

但问题是 imputer_grid.fit 不会将 X_naX 传输到 imputer 管道,我无法指示它进行比较通过评分 (mse) 估算的X_naX。管道必须有一些 .fit() 接受 Xy 的对象。

最佳答案

并非所有的输入器都有预测方法。您可以创建一个仅返回输入的自定义函数,即返回传递的估算矩阵,下面是我从 DummyRegressor 中摘取的内容:

class IdentityFunction(MultiOutputMixin, RegressorMixin, BaseEstimator):

    def __init__(self):
        pass

    def fit(self, X, y):

        y = check_array(y, ensure_2d=False)
        if len(y) == 0:
            raise ValueError("y must not be empty.")

        check_consistent_length(X, y)

        return self

    def predict(self, X):
        return (X)

然后我们使用示例数据集定义管道:

from sklearn.pipeline import Pipeline
from sklearn.experimental import enable_iterative_imputer  # noqa
from sklearn.impute import IterativeImputer
from sklearn.impute import SimpleImputer, IterativeImputer, KNNImputer
from sklearn.model_selection import GridSearchCV
import numpy as np

imputer_pipe = Pipeline([("imputer" , SimpleImputer()),
                        ("identity", IdentityFunction())])

params = [{"imputer":[SimpleImputer()]},
          {"imputer":[IterativeImputer()]},
          {"imputer":[KNNImputer()], "imputer__n_neighbors": [3, 5, 7]}]

使用虚拟数据集并拟合:

X = np.random.uniform(0,1,(100,3))
X_na = np.where(X<0.3,np.nan,X) 

imputer_grid = GridSearchCV(imputer_pipe, param_grid=params,
                            scoring="neg_mean_squared_error", cv=5)
imputer_grid.fit(X_na, X)

结果在这里没有用,因为虚拟矩阵中没有有用的信息可以估算:

Pipeline(steps=[('imputer', IterativeImputer()),
                ('identity', IdentityFunction())])

关于python - 使用 Sklearn 的 GridSearchCV 寻找无需估计器的最佳插补方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73721740/

相关文章:

python - Flask:是否可以返回一个集合作为 JSON 响应

python - 从 for 循环内部保存数据帧

python - 计算所有列差异的最快方法

python - 网格搜索 SVM-anova 的超参数并在 Sklearn 中获取所选特征

python - 如何将自己的类别添加到 OneHotEncoder

python - TfidfVectorizer 与 tf-idf 的定义

python-3.x - Python使用apply函数跳过Nan

c# - 查找序列中缺失的数字

r - 现有功能可查找缺失和完整案例的数量

python - 如果缺少连续值,则添加 nan