【发布时间】:2019-07-19 10:06:49
【问题描述】:
我正在尝试创建一个模型,将客户电子邮件分类(“案例原因”)。我清理了停用词等,并测试了几个不同的模型,逻辑回归是最准确的。问题是它只有大约 70% 的时间是准确的。这主要是因为数据的扩展性问题(有一些案例原因会导致大多数电子邮件。
我想尝试给代理提供前 3 个(或者可能是 5 个)可供选择的结果,而不是仅仅预测一个结果。
这是我已经拥有的:
# vectorize the text
tfidf = TfidfVectorizer(sublinear_tf=True, min_df=5, norm='l2', encoding='latin-1',
ngram_range=(1, 2), stop_words=internal_stop_words)
features = tfidf.fit_transform(df.Description).toarray()
labels = df.category_id
features.shape
在对所有内容进行矢量化处理后,我通过以下代码块对其进行了测试,以测试 4 个模型中的哪一个模型提供了最佳拟合。这表明 Logistic 回归为 70%,是四个中最好的:
models = [
RandomForestClassifier(n_estimators=200, max_depth=3, random_state=0),
LinearSVC(),
MultinomialNB(),
LogisticRegression(random_state=0),
]
CV = 5
cv_df = pd.DataFrame(index=range(CV * len(models)))
entries = []
for model in models:
model_name = model.__class__.__name__
accuracies = cross_val_score(model, features, labels, scoring='accuracy', cv=CV)
for fold_idx, accuracy in enumerate(accuracies):
entries.append((model_name, fold_idx, accuracy))
cv_df = pd.DataFrame(entries, columns=['model_name', 'fold_idx', 'accuracy'])
我创建了分类器,它是传递值的功能:
X_train, X_test, y_train, y_test = train_test_split(df['Description'], df['Reason'],
random_state = 0)
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
clf = LogisticRegression(solver='saga',multi_class='multinomial').fit(X_train_tfidf, y_train)
print(clf.predict(count_vect.transform(["""i dont know my password"""])))
['Reason #1']
在这种情况下,这不是正确的原因。我可以运行以下命令来获得一个显示每个分类概率的表格:
#Test log res
probs = clf.predict_proba(count_vect.transform(["""I dont know my password"""]))
classes = clf.classes_
probs.shape = (len(category_to_id),1)
output = pd.DataFrame(data=[classes,probs]).T
output.columns= ['reason','prob']
output.sort_values(by='prob', ascending=False)
这会返回:
index reason prob
7 Reason #7 [0.6036937161535804]
6 Reason #6 [0.1576980112870697]
3 Reason #3 [0.13221805369421305]
13 Reason #13 [0.028848040868062686]
8 Reason #8 [0.02264491874676607]
9 Reason #9 [0.01725043255540921]
0 Reason #0 [0.01600640516713904]
10 Reason #10 [0.005444588928021622]
4 Reason #4 [0.0052240828713529894]
5 Reason #5 [0.0048409867159243045]
2 Reason #2 [0.0024794864823573935]
1 Reason #1 [0.0014065266971805264]
11 Reason #11 [0.001393613395266496]
12 Reason #12 [0.0008511364376563769]
所以我按最可能的原因排序,在这种情况下,#3 是正确答案。
如何将前 N 个结果返回到输入,以及测试 N 个结果之一中存在的实际原因的模型准确性?
【问题讨论】:
-
嘿加勒特,我相信这应该是同一个问题,但对于另一个模型stackoverflow.com/questions/54855656/…
-
我想我在这里遗漏了一些我可以让它工作的东西。我有 Top N 件正在返回 topn 类的索引,但我不理解 y_true 部分并确定实际值是否在 topn 中。你能提供任何帮助吗?谢谢!
-
y_true 应该包含数据的实际标签(这里的原因)。如果您设法使其适应您的情况,请告诉我
标签: python scikit-learn