如何将 MultiOutputClassifier 应用于 Naive-Bayes 算法的数据集

数据挖掘 机器学习 深度学习 多标签分类 朴素贝叶斯分类器
2022-03-08 23:01:34

我有一个数据集如下,(它取自网上的一篇文章,我一直在尝试对其进行朴素贝叶斯算法)

原始数据集

y 属性

在做了一些操作之后(按照文章),这些是我用于训练和测试的新数据集,

X火车

y 火车

现在,它包含一个多标签,我被要求查看该问题的多输出分类我一直在尝试理解这种分类并尝试自己实现它,但我无法完成。首先,我尝试按照网站上给出的示例代码,

from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
import numpy as np
X, y1 = make_classification(n_samples=10, n_features=100, n_informative=30, n_classes=3, random_state=1)
y2 = shuffle(y1, random_state=1)
y3 = shuffle(y1, random_state=2)
Y = np.vstack((y1, y2, y3)).T
n_samples, n_features = X.shape # 10,100
n_outputs = Y.shape[1] # 3
n_classes = 3
forest = RandomForestClassifier(n_estimators=100, random_state=1)
multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)
multi_target_forest.fit(X, Y).predict(X)

但是,因为我对这一切都很陌生,所以我什么都不懂。我不明白他为什么要进行 make_classification 调用,然后对数据进行洗牌等。我试图在我的 y_train 变量上实现它然后把它放在我的model.fit中用于Naive-Baysen算法,

from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
Yt = np.vstack(y_train).T
n_samples, n_features = X_train.shape # 10,100
n_outputs = Yt.shape[1] # 3
n_classes = 3
forest = RandomForestClassifier(n_estimators=100, random_state=1)
multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)
model.fit(X_train, multi_target_forest)

但它给出了与我之前收到的相同的错误,这意味着我没有正确地进行多输出分类,

ValueError: y should be a 1d array, got an array of shape () instead.

谁能帮我告诉我如何实际实现这种分类,以便 Y 变量可以用于 Naive Baysen?

1个回答

示例的make_classification、 shuffle 和 stack 只是为了生成多标签数据集。您已经处理过y_train并且不需要任何这些。

然后,您希望基础估计量是朴素贝叶斯,而不是示例中的随机森林。并且所有 sklearn 模型都应该适合model_instance.fit(X, y, sometimes_optional_parameters)引发的错误是因为您传递了模型对象而不是y(并且还使用了错误的模型对象)。所以以下应该做你想要的:

nb = GaussianNB() 
multi_target_nb = MultiOutputClassifier(nb, n_jobs=-1)
multi_target_nb.fit(X_train, y_train)