gpt4 book ai didi

python - 自定义 sklearn 管道变压器提供 "pickle.PicklingError"

转载 作者:太空狗 更新时间:2023-10-30 02:16:14 26 4
gpt4 key购买 nike

我正在尝试根据本教程的指导为 Python sklearn 管道创建自定义转换器:http://danielhnyk.cz/creating-your-own-estimator-scikit-learn/

现在我的自定义类/转换器看起来像这样:

class SelectBestPercFeats(BaseEstimator, TransformerMixin):
def __init__(self, model=RandomForestRegressor(), percent=0.8,
random_state=52):
self.model = model
self.percent = percent
self.random_state = random_state


def fit(self, X, y, **fit_params):
"""
Find features with best predictive power for the model, and
have cumulative importance value less than self.percent
"""
# Check parameters
if not isinstance(self.percent, float):
print("SelectBestPercFeats.percent is not a float, it should be...")
elif not isinstance(self.random_state, int):
print("SelectBestPercFeats.random_state is not a int, it should be...")

# If checks are good proceed with fitting...
else:
try:
self.model.fit(X, y)
except:
print("Error fitting model inside SelectBestPercFeats object")
return self

# Get feature importance
try:
feat_imp = list(self.model.feature_importances_)
feat_imp_cum = pd.Series(feat_imp, index=X.columns) \
.sort_values(ascending=False).cumsum()

# Get features whose cumulative importance is <= `percent`
n_feats = len(feat_imp_cum[feat_imp_cum <= self.percent].index) + 1
self.bestcolumns_ = list(feat_imp_cum.index)[:n_feats]
except:
print ("ERROR: SelectBestPercFeats can only be used with models with"\
" .feature_importances_ parameter")
return self


def transform(self, X, y=None, **fit_params):
"""
Filter out only the important features (based on percent threshold)
for the model supplied.

:param X: Dataframe with features to be down selected
"""
if self.bestcolumns_ is None:
print("Must call fit function on SelectBestPercFeats object before transforming")
else:
return X[self.bestcolumns_]

我正在将此类集成到这样的 sklearn 管道中:

# Define feature selection and model pipeline components
rf_simp = RandomForestRegressor(criterion='mse', n_jobs=-1,
n_estimators=600)
bestfeat = SelectBestPercFeats(rf_simp, feat_perc)
rf = RandomForestRegressor(n_jobs=-1,
criterion='mse',
n_estimators=200,
max_features=0.4,
)

# Build Pipeline
master_model = Pipeline([('feat_sel', bestfeat), ('rf', rf)])

# define GridSearchCV parameter space to search,
# only listing one parameter to simplify troubleshooting
param_grid = {
'feat_select__percent': [0.8],
}

# Fit pipeline model
grid = GridSearchCV(master_model, cv=3, n_jobs=-1,
param_grid=param_grid)

# Search grid using CV, and get the best estimator
grid.fit(X_train, y_train)

每当我运行最后一行代码 (grid.fit(X_train, y_train)) 时,我都会收到以下“PicklingError”。任何人都可以在我的代码中看到导致此问题的原因吗?

编辑:

或者,我的 Python 设置中是否存在错误...我可能缺少某个包或类似的东西?我刚刚检查过我可以导入 pickle 成功

Traceback (most recent call last): File "", line 5, in File "C:\Users\jjaaae\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\model_selection_search.py", line 945, in fit return self._fit(X, y, groups, ParameterGrid(self.param_grid)) File "C:\Users\jjaaae\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\model_selection_search.py", line 564, in _fit for parameters in parameter_iterable File "C:\Users\jjaaae\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\externals\joblib\parallel.py", line 768, in call self.retrieve() File "C:\Users\jjaaae\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\externals\joblib\parallel.py", line 719, in retrieve raise exception File "C:\Users\jjaaae\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\externals\joblib\parallel.py", line 682, in retrieve self._output.extend(job.get(timeout=self.timeout)) File "C:\Users\jjaaae\AppData\Local\Programs\Python\Python36\lib\multiprocessing\pool.py", line 608, in get raise self._value File "C:\Users\jjaaae\AppData\Local\Programs\Python\Python36\lib\multiprocessing\pool.py", line 385, in _handle_tasks put(task) File "C:\Users\jjaaae\AppData\Local\Programs\Python\Python36\lib\site-packages\sklearn\externals\joblib\pool.py", line 371, in send CustomizablePickler(buffer, self._reducers).dump(obj) _pickle.PicklingError: Can't pickle : attribute lookup SelectBestPercFeats on builtins failed

最佳答案

pickle 包需要在另一个模块中定义自定义类,然后导入。因此,创建另一个 Python 包文件(例如 transformation.py),然后像这样导入它 from transformation import SelectBestPercFeats。这将解决 pickle 错误。

关于python - 自定义 sklearn 管道变压器提供 "pickle.PicklingError",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com