使用一组功能预测多个y

时间:2017-01-31 12:24:26

标签: python machine-learning

我有以下样本集(显然真正的样本集更大但仅用于再现目的)。数据集包含某些功能(前三列) 和两个人的

import pandas as pd
df = pd.DataFrame([[0, 0, 1, "Tree", "Flower"], [1,1,0,'Tree','Water'], [0,1,0,'Tree','NA'], [2,1,0,'Water','Wood'], [1,1,0,'Flower','NA'], [1,1,1,'Tree','Flower'], [2,2,0,'Flower','NA'] ], columns=('feature1', 'feature2', 'feature3', 'outcome1', 'outcome2'))

我现在想做的是预测不同的y。显然,我可以创建一个测试和训练集,区分功能和标签,然后创建一个这样的决策树:

my_tree_one = tree.DecisionTreeClassifier()
my_tree_one = my_tree_one.fit(train_features, train_outcome)
my_dt_prediction = my_tree_one.predict(test_features)

然而,这只会给我一个y。我正在寻找(可能是多个)y。

我正在寻找一种方法来预测特定标签考虑特征性质的可能性。然后应显示值高于特定阈值的标签。因此,如果我有特征0,1,2的新数据并将阈值设置为50%,结果应该是:

  • 60%的机会标记"树"
  • 标签变化55%" Water"

有没有人对如何获得我想要的输出有反馈?

1 个答案:

答案 0 :(得分:1)

您的问题是多标签分类之一,这自然比简单分类更难。

在scikit学习中有几种方法可以解决它,其中一种方法是使用OneVSall制度和OneVsRestClassifier,如下所示:

import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn import tree
from sklearn.multiclass import OneVsRestClassifier

df = pd.DataFrame([[0, 0, 1, "Tree", "Flower"], [1,1,0,'Tree','Water'], [0,1,0,'Tree','NA'], [2,1,0,'Water','Wood'], [1,1,0,'Flower','NA'], [1,1,1,'Tree','Flower'], [2,2,0,'Flower','NA'] ], columns=('feature1', 'feature2', 'feature3', 'outcome1', 'outcome2'))

# Binarize your classes
outcomes = zip(list(df['outcome1']), list(df['outcome2']))
MLB = MultiLabelBinarizer()
Y = MLB.fit_transform(outcomes)

# Extract your data
X = df[['feature1', 'feature2', 'feature3']]

# Define base classifier and meta-classifier
my_tree_one = tree.DecisionTreeClassifier()
clf = OneVsRestClassifier(my_tree_one)

# Train your classifier and output your predictions
clf.fit(X, Y)
predictions = clf.predict(X)  # predict on a new X
print MLB.inverse_transform(predictions)

如果您想为最终分类使用不同的阈值,可以使用predict_proba代替predict并自行进行最终分类,如下所示:

threshold = 0.6
predictions = []

probabilities = clf.predict_proba(X)
for probability_row in probabilities:
    predictions.append([1 if p > threshold else 0 for p in probability_row])
predictions = np.asarray(predictions)