我想找到 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_na
和 X
传输到 imputer 管道,我无法指示它进行比较通过评分
(mse) 估算的X_na
和X
。管道必须有一些 .fit()
接受 X
和 y
的对象。
最佳答案
并非所有的输入器都有预测
方法。您可以创建一个仅返回输入的自定义函数,即返回传递的估算矩阵,下面是我从 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/