繁体   English   中英

如何从 scikit-learn predict_proba 中恢复输入分类符号?

[英]How to recover input categorical symbols from scikit-learn predict_proba?

我有一个相同长度的单词列表。 我将长度存储在变量LENGTH中。 单词列表称为wordlist 我想预测所有其他字母的第一个字母。 但是,我在最后阶段遇到了问题,我想将predict_proba的概率与字母相关联。

这是我到目前为止的工作:

我的目标向量是分类的,我的特征也是如此。 特别是它们可以从 ASCII 字母表中获取值。 为了进行分类,我首先将所有内容都转换为整数。 为此,我制作了两个字典,一个从字母映射到整数 (alphabet_map),另一个从整数映射到字母 (inv_alphabet_map)。

alphabet = set()
for word in wordlist:
    alphabet = alphabet.union(set(word))
alphabet_size = len(alphabet)
alphabet_map = dict()
alphabet_stored = sorted(alphabet)
inv_alphabet_map = dict()
for i in range(alphabet_size):
    inv_alphabet_map[i] = alphabet_stored[i]
    alphabet_map[alphabet_stored[i]] = i

然后我使 X 和 y 如下:

def makeX_simple(words, alphabet_map):
    X = []
    for idx in range(len(words)):
        X.append(list(words[idx]))
    X = [ [ alphabet_map[letter] for letter in sublist ] for sublist in X ]
    X = np.array(X)
    return X

X = makeX_simple(wordlist, alphabet_map)
y = X[:,0]
X = np.delete(X, 0, axis = 1)

现在我可以构建分类器:

model = HistGradientBoostingClassifier(categorical_features=range(LENGTH-1), verbose=2,learning_rate=0.02).fit(X,y)

然后我可以做以下测试:

models[0].predict_proba(X[0].reshape(1, -1))[0]

但是我怎么知道哪些概率与我原始输入中的哪些字母相关联呢? predict_proba 是否对目标变量进行排序,我是否需要从 output 数组中的索引到原始输入中的字母再创建一个 map?

一个困难是我需要从字母到整数的映射对于 X 和 y 是相同的。

做这一切的正确方法是什么?

要转换目标标签,您可以使用LabelEncoder() ,您可以使用OrdinalEncoder()来转换分类特征

  1. 训练时使用OrdinalEncoder()转换特征
  2. 训练时使用LabelEncoder()转换目标值
  3. 预测后,使用.classes_和 zip 从LabelEncoder()获取目标标签,每个预测概率列表和目标标签列表。 这会给你类似的东西:
[[('TARGET_A', 0.1),('TARGET_B',0.5),('TARGET_C',0.4)], [('TARGET_A', 0.5),('TARGET_B',0.3),('TARGET_C',0.2)]]
  1. 使用dict()将每个概率listtuples列表转换为dict ,以便更轻松地访问值,以获得:
[{'TARGET_A': 0.1,'TARGET_B',0.5:'TARGET_C':0.4}, {'TARGET_A': 0.5),'TARGET_B':0.3,'TARGET_C':0.2}]

这是一个示例:

训练/适合的代码:

from sklearn.preprocessing import LabelEncoder, OrdinalEncoder
import joblib

# while training
X = # your_categorical_features
Y = # your_target_labels

ordinal_encoder = OrdinalEncoder()
ordinal_encoder.fit(X)
x = ordinal_encoder.transform(X)

label_encoder = LabelEncoder()
label_encoder.fit(Y)
y = label_encoder.transform(Y)

model = HistGradientBoostingClassifier(categorical_features=range(LENGTH-1), verbose=2,learning_rate=0.02).fit(x,y)
# save label_encoder object
joblib.dump(label_encoder, label_encoder_filename)
# save ordinal_encoder object
joblib.dump(ordinal_encoder, ordinal_encoder_filename)

预测代码:

# later while predicting
import joblib

# load label_encoder object
label_encoder = joblib.load(label_encoder_filename)
# load ordinal_encoder object
ordinal_encoder = joblib.load(ordinal_encoder_filename)

X = # your values to predict
x = ordinal_encoder.transform(X)

predictions = model.predict(x)
prediction_pobas = model.predict_proba(x)
p_labels = label_encoder.inverse_transform(predictions)

proba_list = []
for idx in range(len(prediction_pobas)):
    proba_list.append(dict([*zip(label_encoder.classes_, prediction_pobas[idx])]))

# access prediction probability by
target_A_probability = proba_list[0]['target_A']

# To use predicted value to call predict_proba again encode using ordinal_encoder
X = # your new values to predict
x = ordinal_encoder.transform(X)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM