首页 > 解决方案 > 如何将 MultinomialNB 与 MultiOutputClassifier 和 partial_fit 一起使用?

问题描述

我在任何地方都找不到这个问题的答案,也找不到针对我的特定案例的 scikit learn 文档中的示例。

我想使用MultinomialNBwithMultiOutputClassifier和 partial_fit

我无法弄清楚函数的类参数的格式partial_fit(这不是fit()函数所必需的,它工作得很好)

我在这里想念什么?

谢谢你的帮助

import pandas as pd
import numpy as np   

from sklearn.naive_bayes import MultinomialNB
from sklearn.multioutput import MultiOutputClassifier

df_train = pd.DataFrame({'feature': [1, 2, 3, 3, 4, 4, 5]})

df_train_labels = pd.DataFrame({'class1': ['1-3', '1-3','1-3', '1-3', '4-5', '4-5', '4-5'], 'class2': ['1-2', '1-2', '3-5', '3-5', '3-5', '3-5', '3-5']})

prediction_model = MultiOutputClassifier(MultinomialNB())

prediction_model.fit(df_train, df_train_labels) # Works fine

prediction_model.partial_fit(df_train,\
                                 df_train_labels,\
                                 np.unique(df_train_labels))  # Error

ValueError:预期的类数组(数组或非字符串序列),得到 '1-2'

标签: pythonscikit-learn

解决方案


类参数值必须是每个目标变量的唯一值列表。

从文档:

类:numpy 数组列表,形状(n_outputs)。
每个数组是 str/int 中一个输出的唯一类,可以通过 via 获得
[np.unique(y[:, i]) for i in range(y.shape[1])],其中 y 是
整个数据集的目标矩阵。

第一次调用 partial_fit 时需要此参数,
并且可以在后续调用中省略。
请注意, y 不需要包含classes.

import pandas as pd
import numpy as np   

from sklearn.naive_bayes import MultinomialNB
from sklearn.multioutput import MultiOutputClassifier

df_train = pd.DataFrame({'feature': [1, 2, 3, 3, 4, 4, 5]})

df_train_labels = pd.DataFrame({'class1': ['1-3', '1-3','1-3', '1-3', '4-5', '4-5', '4-5'], 
                                'class2': ['1-2', '1-2', '3-5', '3-5', '3-5', '3-5', '3-5']})

prediction_model = MultiOutputClassifier(MultinomialNB())



classes = [df_train_labels[c].unique() for c in df_train_labels]
prediction_model.partial_fit(df_train,\
                             df_train_labels,\
                             classes) 
prediction_model.predict([[1],[8,]])
# array([['1-3', '3-5'],
#        ['1-3', '3-5']], dtype='<U3')

推荐阅读