[英]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()
来转换分类特征
OrdinalEncoder()
转换特征LabelEncoder()
转换目标值.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)]]
dict()
将每个概率list
从tuples
列表转换为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.