-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLDA_model.py
More file actions
96 lines (77 loc) · 3.74 KB
/
Copy pathLDA_model.py
File metadata and controls
96 lines (77 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# -*- coding=utf-8 -*-
import os
from sklearn.feature_extraction.text import TfidfVectorizer,CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.linear_model import LogisticRegression
import numpy as np
import random
import data_helper
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
from sklearn.metrics import recall_score,precision_score,accuracy_score
from sklearn import tree
import pandas as pd
import graphviz
INPUT_PATH='/home/zju/slx/binarylearning/bisheData/newData/'
def tf_idf_model(train_data,test_data):
tfidf_vector = TfidfVectorizer()
tfidf_train = tfidf_vector.fit_transform(train_data)
tfidf_test = tfidf_vector.transform(test_data)
print tfidf_train.shape,tfidf_test.shape
return tfidf_train,tfidf_test
def lda_model(train_data,test_data):
tf_vectorizer = CountVectorizer()
tf_train_vector = tf_vectorizer.fit_transform(train_data)
tf_test_vector = tf_vectorizer.transform(test_data)
lda = LatentDirichletAllocation(n_components=35,learning_method='batch')
doc_topic_distribution = lda.fit_transform(tf_train_vector)
test_doc_topic_distribution = lda.transform(tf_test_vector)
return lda,doc_topic_distribution,test_doc_topic_distribution
def lda_model_for_asseble(corpus):
tfidf_vectorizer = TfidfVectorizer(analyzer='word')
tfidf_vector = tfidf_vectorizer.fit_transform(corpus)
tf_vectorizer = CountVectorizer()
tf_vector = tf_vectorizer.fit_transform(corpus)
lda = LatentDirichletAllocation(n_components=35, learning_method='batch')
doc_topic_distribution = lda.fit_transform(tf_vector)
return lda,doc_topic_distribution
def evaluate(estimator,test_x,test_y):
pred_y = estimator.predict(test_x)
recall = recall_score(y_true=test_y,y_pred=pred_y,average='macro')
precision = precision_score(y_true=test_y,y_pred=pred_y,average='macro')
acc = accuracy_score(y_true=test_y,y_pred=pred_y)
print 'accuracy recall precision is {0} {1} {2}'.format(acc,recall,precision)
def train(train_path,test_path,is_bytecode):
print 'loading data'
train_x ,train_y = data_helper.prepare_classification_data(train_path,is_bytecode)
test_x,test_y = data_helper.prepare_classification_data(test_path,is_bytecode)
print 'start fit LDA model'
lda_train,train_doc_topic,test_doc_topic = lda_model(train_x,test_x)
print 'complete fitting LDA model,using DOC-TOPIC feature to decision tree '
DT = DecisionTreeClassifier()
DT.fit(train_doc_topic,train_y)
print 'COMPLETE FITTING DECISION TREE '
#dot = export_graphviz(DT,out_file='./tree.dot')
evaluate(DT,test_doc_topic,test_y)
def eval_model(real, predict, name):
assert len(predict) == len(real)
print name
print 'crosstab:{0}'.format(pd.crosstab(np.asarray(real), np.asarray(predict), margins=True))
print 'precision:{0}'.format(precision_score(real, predict, average='macro'))
print 'recall:{0}'.format(recall_score(real, predict, average='macro'))
print 'accuracy:{0}'.format(accuracy_score(real, predict))
def train_tfidf(train_path, test_path, is_bytecode):
train_x, train_y = data_helper.prepare_classification_data(train_path, is_bytecode)
test_x, test_y = data_helper.prepare_classification_data(test_path, is_bytecode)
print len(train_y)
print len(train_x)
tfidf_train,tfidf_test = tf_idf_model(train_x,test_x)
# clf = MultinomialNB().fit(x_train, y_train)
clf = tree.DecisionTreeClassifier().fit(tfidf_train, train_y)
evaluate(estimator=clf,test_x=tfidf_test,test_y=test_y)
return clf
if __name__ == '__main__':
TRAIN_INPUT = INPUT_PATH+'train.txt'
TEST_INPUT = INPUT_PATH+'test.txt'
DEV_INPUT = INPUT_PATH+'dev.txt'
train_tfidf(TRAIN_INPUT,TEST_INPUT,True)