【发布时间】:2021-02-16 02:30:53
【问题描述】:
我已经使用 MultiLabelBinarizer 对我的目标变量进行了编码。然后我以这种方式从转换的结果中创建了一个新的 DataFrame
y_trans = pd.DataFrame(MultiLabelBinarizer().fit_transform(y))
这里是head()
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
-----------------------------------------------------------------------
0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
2 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
3 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
我使用
创建训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X_trans, y_trans, random_state=0)
在拟合RandomForest 或KNN 后,预测X_test 变量会返回一个数组,其中一些预测是这样的
array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
编码的目标变量中不存在这样的类,因为
len(y_trans.where(y_trans == [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]).dropna())
实际上是 0。
我不明白为什么会这样。 Somewhat related question.
重现我的问题
我提供encoded features and labels 供下载。它们以二进制格式腌制。 从那里,重现我的错误的步骤很简单
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import pickle
X_trans = pickle.load(open('features.pkl', 'rb'))
y_trans = pickle.load(open('target.pkl', 'rb'))
X_train, X_test, y_train, y_test = train_test_split(X_trans, y_trans, random_state=0)
rfc = RandomForestClassifier(random_state=0)
rfc.fit(X_train, y_train)
print(rfc.predict(X_test)[1])
打印预测中的第二个值将返回[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
我的分类目标
我的目标是创建一个分类器,它可以预测至少一个“正确的类”,由条目中的 1 表示。
例如,y 的第一个条目是[0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0]。
我会考虑正确的
[0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0][0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]
但这是一个评估问题,一旦预测正确,就会发生。正如我所说,不能有“空洞”的预测。有18个类,127个独特的组合,没有一个是[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]。
Sklearn examples 有同样的“问题”
此时,这个输出必须有意义。但我无法弄清楚。
注意:在这个例子中,使用的分类器是KNN,我显示的是RandomForest,但如果我使用KNN,我会遇到同样的问题。
from sklearn.datasets import make_multilabel_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.neighbors import KNeighborsClassifier
X, y = make_multilabel_classification(n_classes=18, random_state=0)
clf = MultiOutputClassifier(KNeighborsClassifier()).fit(X, y)
clf.predict(X)[3]
>>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
分割成训练集和测试集时同样适用
from sklearn.datasets import make_multilabel_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.neighbors import KNeighborsClassifier
X, y = make_multilabel_classification(n_classes=18, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.2)
clf = MultiOutputClassifier(KNeighborsClassifier()).fit(X_train, y_train)
clf.predict(X_test)[8]
>>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
【问题讨论】:
标签: python machine-learning scikit-learn