Pickle 文件为 DBSCAN 聚类的新观察抛出错误结果的结果
Result from pickle file throwing wrong results for new observation for DBSCAN clustering
我建立了一个DBSCAN聚类模型,输出结果和使用pkl文件后的结果不匹配
下面,第一个记录的簇是 0
但是在从 'pkl' 文件 运行 之后,它显示预测结果为 [-1]
数据框:
HD MC WT Cluster
200 Other 4.5 0
150 Pep 5.6 0
100 Pla 35 -1
50 Same 15 0
代码
######## Label encoder for column MC ##############
le = preprocessing.LabelEncoder()
df['MC encoded'] = le.fit_transform(df['MC'])
col_1 = ['HD','MC encoded','WT']
data = df[col_1]
data = data.fillna(value=0)
######### DBSCAN Clustering ##################
model = DBSCAN(eps=7, min_samples=2).fit(data)
outliers_df = pd.DataFrame(data)
print(Counter(model.labels_))
######## Predict ###############
x = model.fit_predict(data)
df["Cluster"] = x
####### Create model pkl files and dump ################
filename1 = '/model.pkl'
model_df = open(filename1, 'wb')
pickle.dump(model,model_df)
model_df.close()
######## Create Encoder pkl files and dump ############
output = open('/MC.pkl', 'wb')
pickle.dump(le, output)
output.close()
####### Load the model pkl file ##############
with open('model.pkl', 'rb') as file:
pickle_model = pickle.load(file)
########## Load Encoder pkl file ############
pkl_file = open('MC.pkl', 'rb')
le_mc = pickle.load(pkl_file)
pkl_file.close()
######## Function to predict new data ##############
def testing(HD,MC,WT):
test = {'HD':[HD],'MC':[MC], 'WT':[WT]}
test = pd.DataFrame(test)
test['MC_encoded'] = le_mc.transform(test['MC'])
pred_val = pickle_model.fit_predict(test[['HD','MC_encoded',WT]])
print(pred_val)
return(pred_val)
###### Predict with new observation ###########
pred_val = testing(200,'Other',4.5)
生成的集群
[-1]
预期集群
[0]
聚类是不可预测的。
如果要对新实例进行分类,请使用分类器。
所以在我看来,您完全是在错误的前提下使用它...
不过,你的错误在于你使用了错误的函数。
fit_predict
字面意思是丢弃旧模型,然后fit
,return标签。这是因为 sklearn 的设计非常糟糕,它将学习算法和生成的模型混为一谈。模型不应该再有 fit
方法,训练算法不应该 predict
因为还没有模型...
现在,如果您 fit
到少于 min_samples
个点的数据集,根据定义,它们都必须是噪音 (-1)。您打算仅使用 predict
- 这不存在,因为 DBSCAN 不会预测新数据点。
我建立了一个DBSCAN聚类模型,输出结果和使用pkl文件后的结果不匹配
下面,第一个记录的簇是 0 但是在从 'pkl' 文件 运行 之后,它显示预测结果为 [-1]
数据框:
HD MC WT Cluster
200 Other 4.5 0
150 Pep 5.6 0
100 Pla 35 -1
50 Same 15 0
代码
######## Label encoder for column MC ##############
le = preprocessing.LabelEncoder()
df['MC encoded'] = le.fit_transform(df['MC'])
col_1 = ['HD','MC encoded','WT']
data = df[col_1]
data = data.fillna(value=0)
######### DBSCAN Clustering ##################
model = DBSCAN(eps=7, min_samples=2).fit(data)
outliers_df = pd.DataFrame(data)
print(Counter(model.labels_))
######## Predict ###############
x = model.fit_predict(data)
df["Cluster"] = x
####### Create model pkl files and dump ################
filename1 = '/model.pkl'
model_df = open(filename1, 'wb')
pickle.dump(model,model_df)
model_df.close()
######## Create Encoder pkl files and dump ############
output = open('/MC.pkl', 'wb')
pickle.dump(le, output)
output.close()
####### Load the model pkl file ##############
with open('model.pkl', 'rb') as file:
pickle_model = pickle.load(file)
########## Load Encoder pkl file ############
pkl_file = open('MC.pkl', 'rb')
le_mc = pickle.load(pkl_file)
pkl_file.close()
######## Function to predict new data ##############
def testing(HD,MC,WT):
test = {'HD':[HD],'MC':[MC], 'WT':[WT]}
test = pd.DataFrame(test)
test['MC_encoded'] = le_mc.transform(test['MC'])
pred_val = pickle_model.fit_predict(test[['HD','MC_encoded',WT]])
print(pred_val)
return(pred_val)
###### Predict with new observation ###########
pred_val = testing(200,'Other',4.5)
生成的集群
[-1]
预期集群
[0]
聚类是不可预测的。
如果要对新实例进行分类,请使用分类器。
所以在我看来,您完全是在错误的前提下使用它...
不过,你的错误在于你使用了错误的函数。
fit_predict
字面意思是丢弃旧模型,然后fit
,return标签。这是因为 sklearn 的设计非常糟糕,它将学习算法和生成的模型混为一谈。模型不应该再有 fit
方法,训练算法不应该 predict
因为还没有模型...
现在,如果您 fit
到少于 min_samples
个点的数据集,根据定义,它们都必须是噪音 (-1)。您打算仅使用 predict
- 这不存在,因为 DBSCAN 不会预测新数据点。