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 不会预测新数据点。