![](/img/trans.png)
[英]Facing 'can't pickle _thread.rlock objects' error while saving keras model using pickle
[英]Recursive Feature Elimination (RFE) on Keras Model - TypeError: can't pickle _thread.RLock objects
我想跟進上一個問題( Keras模型上的遞歸特征消除 ),因為我遇到了障礙。 我目前正在嘗試實現以下內容(為了便於閱讀,並非所有代碼都在這里):
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.feature_selection import RFE
k_model = KerasClassifier(build_fn=model, epochs=epochs,
batch_size=bs, verbose=0) #model is a standard Keras MLP
selector = RFE(k_model, step=1)
但是,在我嘗試擬合模型的下一行中,這似乎起作用了:
selector = selector.fit(x_train, y_train)
我收到以下錯誤:
TypeError: can't pickle _thread.RLock objects
任何想法/幫助將不勝感激。 編輯:
# =============================================================================
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils, plot_model
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier as ABC
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.feature_selection import RFE
import numpy as np
import time
# =============================================================================
# Functions:
# MLP(x, y)
# =============================================================================
def MLP(x, y):
s_time = time.clock()
# ATR, MOM, RSI, OBV
# keep_features = ['ATR', 'MOM', 'RSI', 'OBV']
# drop_features = list(set(list(x)).difference(keep_features))
# x.drop(drop_features, axis=1, inplace=True)
# x = x.as_matrix()
# y = y.as_matrix()
# num_features = np.array((5,10,15))
num_classes = 3
epochs = 1
bs = 10
np.random.seed(7)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33)
# y_train = np_utils.to_categorical(y_train, num_classes)
# y_test = np_utils.to_categorical(y_test, num_classes)
# create model
model = Sequential()
model.add( Dense(50, input_shape=(x_train.shape[1],), activation='tanh'))
model.add( Dense(num_classes, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
#
# =============================================================================
# plot_model(model, to_file='../3_Deliverables/Final Paper/data/keras_model.png')
# =============================================================================
# Port Keras Framework into SK-Learn
k_model = KerasClassifier(build_fn=model, epochs=epochs, batch_size=bs, verbose=0)
temp = k_model
selector = RFE(temp, step=1)
out = selector.fit(x_train, y_train)
# evaluate the model
# scores = model.evaluate(x_test, y_test)
# print("\n%s: %.2f%%" % (indicators.metrics_names[1], scores[1]*100))
e_time = time.clock()
print('\n Total Time: ', e_time-s_time)
錯誤堆棧:
File "C:\Miniconda3\lib\site-packages\spyder\utils\site\sitecustomize.py",
line 705, in runfile
execfile(filename, namespace)
File "C:\Miniconda3\lib\site-packages\spyder\utils\site\sitecustomize.py",
line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/Schifman Ben/2_Software/project.py", line 51, in <module>
pred.MLP(x_all, y_all)
File "C:\Users\Schifman Ben\2_Software\prediction.py", line 50, in MLP
out = selector.fit(x_train, y_train)
File "C:\Miniconda3\lib\site-packages\sklearn\feature_selection\rfe.py",
line 134, in fit
return self._fit(X, y)
File "C:\Miniconda3\lib\site-packages\sklearn\feature_selection\rfe.py",
line 169, in _fit
estimator = clone(self.estimator)
File "C:\Miniconda3\lib\site-packages\sklearn\base.py", line 62, in clone
new_object_params[name] = clone(param, safe=False)
File "C:\Miniconda3\lib\site-packages\sklearn\base.py", line 53, in clone
return copy.deepcopy(estimator)
File "C:\Miniconda3\lib\copy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:\Miniconda3\lib\copy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:\Miniconda3\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:\Miniconda3\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:\Miniconda3\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:\Miniconda3\lib\copy.py", line 215, in _deepcopy_list
append(deepcopy(a, memo))
File "C:\Miniconda3\lib\copy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:\Miniconda3\lib\copy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:\Miniconda3\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:\Miniconda3\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:\Miniconda3\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:\Miniconda3\lib\copy.py", line 215, in _deepcopy_list
append(deepcopy(a, memo))
File "C:\Miniconda3\lib\copy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:\Miniconda3\lib\copy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:\Miniconda3\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:\Miniconda3\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:\Miniconda3\lib\copy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:\Miniconda3\lib\copy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:\Miniconda3\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:\Miniconda3\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:\Miniconda3\lib\copy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:\Miniconda3\lib\copy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:\Miniconda3\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:\Miniconda3\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:\Miniconda3\lib\copy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:\Miniconda3\lib\copy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:\Miniconda3\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:\Miniconda3\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:\Miniconda3\lib\copy.py", line 169, in deepcopy
rv = reductor(4)
TypeError: can't pickle _thread.RLock objects
KerasClassifier build_fn
需要指向返回model
的函數的指針,而不是模型本身。
因此,像這樣更改您的代碼:
def MLP(x, y):
...
...
...
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33)
# y_train = np_utils.to_categorical(y_train, num_classes)
# y_test = np_utils.to_categorical(y_test, num_classes)
# This is what you need
# create model
def create_model():
model = Sequential()
model.add(Dense(50, input_shape=(x_train.shape[1],), activation='tanh'))
model.add(Dense(num_classes, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
...
...
# Port Keras Framework into SK-Learn
k_model = KerasClassifier(build_fn=create_model, epochs=epochs, batch_size=bs, verbose=0)
...
...
但是在那之后,您將得到另一個關於feature_importances_
錯誤,因為RFE
與KerasClassifier不兼容。
有關更多詳細信息,請參見此問題: keras模型上的特征選擇
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.