我正在尝试根据本教程的指导为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设置中有什么东西是错的......我可能会错过一个包或类似的东西吗?我刚刚检查过我能成功 import pickle
回溯(最近一次调用最后一次):文件“”,第5行,在文件“C:\ Users \ jjaaae \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ sklearn \ model_selection_search.py”中,行945,在fit return self._fit(X,y,groups,ParameterGrid(self.param_grid))文件“C:\ Users \ jjaaae \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ sklearn \ model_selection_search .py“,第564行,在_fit中为parameter_iterable文件中的参数”C:\ Users \ jjaaae \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ sklearn \ externals \ joblib \ parallel.py“,line 768,在调用self.retrieve()文件“C:\ Users \ jjaaae \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ sklearn \ externals \ joblib \ parallel.py”,第719行,检索在检索self._output.extend(作业)中引发异常文件“C:\ Users \ jjaaae \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ sklearn \ externals \ joblib \ parallel.py”,第682行.get(timeout = self.timeout))文件“C:\ Users \ jjaaae \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ multiprocessin g \ pool.py“,第608行,在get raise self._value文件中”C:\ Users \ jjaaae \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ multiprocessing \ pool.py“,第385行,在_handle_tasks中(任务)文件“C:\ Users \ jjaaae \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ sklearn \ externals \ joblib \ pool.py”,第371行,发送CustomizablePickler(缓冲区,自我 . _reducers).dump(obj)_pickle.PicklingError:无法pickle:内置函数上的属性查找SelectBestPercFeats失败
1 回答
pickle包需要在另一个模块中定义自定义类,然后导入 . 因此,创建另一个python包文件(例如
transformation.py
),然后像from transformation import SelectBestPercFeats
一样导入它 . 这将解决酸洗错误 .