我正在比较两个Naive Bayes分类器:一个来自NLTK,另一个来自scikit-learn.我正在处理一个多类分类问题(3个类:正(1),负(-1)和中性(0)).
在不执行任何特征选择的情况下(即,使用所有可用功能),并使用70,000个实例的训练数据集(噪声标记,实例分布为17%为正,4%为负,78%为中性),我训练了两个分类器,第一个是nltk.NaiveBayesClassifier,第二个是sklearn.naive_bayes.MultinomialNB(带fit_prior=True).
训练结束后,我在30,000个实例的测试集上评估了分类器,得到了以下结果:
**NLTK's NaiveBayes**
accuracy: 0.568740
class: 1
precision: 0.331229
recall: 0.331565
F-Measure: 0.331355
class: -1
precision: 0.079253
recall: 0.446331
F-Measure: 0.134596
class: 0
precision: 0.849842
recall: 0.628126
F-Measure: 0.722347
**Scikit's MultinomialNB (with fit_prior=True)**
accuracy: 0.834670
class: 1
precision: 0.400247
recall: 0.125359
F-Measure: 0.190917
class: -1
precision: 0.330836
recall: 0.012441
F-Measure: 0.023939
class: 0
precision: 0.852997
recall: 0.973406
F-Measure: 0.909191
**Scikit's MultinomialNB (with fit_prior=False)**
accuracy: 0.834680
class: 1
precision: 0.400380
recall: 0.125361 …Run Code Online (Sandbox Code Playgroud) 我试图使用卡方(scikit-learn 0.10)选择最佳功能.从总共80个培训文档中我首先提取了227个特征,并从这227个特征中我想选择前10个特征.
my_vectorizer = CountVectorizer(analyzer=MyAnalyzer())
X_train = my_vectorizer.fit_transform(train_data)
X_test = my_vectorizer.transform(test_data)
Y_train = np.array(train_labels)
Y_test = np.array(test_labels)
X_train = np.clip(X_train.toarray(), 0, 1)
X_test = np.clip(X_test.toarray(), 0, 1)
ch2 = SelectKBest(chi2, k=10)
print X_train.shape
X_train = ch2.fit_transform(X_train, Y_train)
print X_train.shape
Run Code Online (Sandbox Code Playgroud)
结果如下.
(80, 227)
(80, 14)
Run Code Online (Sandbox Code Playgroud)
如果我设置k相等,它们是相似的100.
(80, 227)
(80, 227)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
*编辑:一个完整的输出示例,现在没有剪切,我请求30并获得32:
Train instances: 9 Test instances: 1
Feature extraction...
X_train:
[[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 …Run Code Online (Sandbox Code Playgroud) 我正在使用Python在Web应用程序中实现tf-idf算法,但它运行速度非常慢.我基本上做的是:
1)创建2个词典:
现在,有一个用户请求获得文档d的tfidf结果.我所做的是:
2)循环文档d的第二个字典的唯一单词,并为每个唯一单词w得到:
2.1)tf得分(在d:循环显示文档第一个字典的单词列表中w出现的次数)
2.2)df得分(有多少文档包含w:循环遍历所有文档的单词集(第二个字典)并检查是否包含w).我正在使用一个集合,因为检查集合是否包含与列表相比的单词似乎更快.
步骤2.2非常慢.例如,拥有1000个文档,对于具有2313个唯一字的文档,输出结果大约需要5分钟.
还有其他方法可以让步骤2.2更快吗?词典迭代速度慢吗?
最近,我使用numpy在Python上实现了针对LDA主题模型的Gibbs采样,并将来自站点的一些代码作为参考.在Gibbs采样的每次迭代中,我们删除一个(当前)单词,根据从LDA模型推断的后验条件概率分布对该单词的新主题进行采样,并更新单词 - 主题计数,如下所示:
for m, doc in enumerate(docs): #m: doc id
for n, t in enumerate(doc): #n: id of word inside document, t: id of the word globally
# discount counts for word t with associated topic z
z = z_m_n[m][n]
n_m_z[m][z] -= 1
n_z_t[z, t] -= 1
n_z[z] -= 1
n_m[m] -= 1
# sample new topic for multinomial
p_z_left = (n_z_t[:, t] + beta) / (n_z + V * beta)
p_z_right = (n_m_z[m] + alpha) / ( n_m[m] …Run Code Online (Sandbox Code Playgroud) 我正在处理文本分类问题(情绪分析).我想知道scikit中是否有任何选项 - 学习为特征添加"权重"(作为重要性的度量).我检查了文档并找到了SVC的属性"coefs",定义如下:
coef_ array, shape = [n_class-1, n_features]
Weights asigned to the features (coefficients in the primal problem).
This is only available in the case of linear kernel.coef_ is readonly property derived from dual_coef_ and support_vectors_
Run Code Online (Sandbox Code Playgroud)
但是,此属性似乎是只读的.
我在一台150gb ssd和3tb硬盘的机器上有一个弹性搜索节点.由于我在ssd中空间不足,我想将一个索引从ssd移动到hdd.这可能吗?如果是这样的话?
我可以在硬盘上创建另一个节点,但我宁愿在机器上有一个节点......
谢谢!
python ×4
scikit-learn ×3
scikits ×2
chi-squared ×1
dictionary ×1
lda ×1
nltk ×1
numpy ×1
svm ×1
tf-idf ×1