98 lines
3.5 KiB
Python
98 lines
3.5 KiB
Python
from __future__ import print_function, division
|
|
from time import time
|
|
import argparse
|
|
import numpy as np
|
|
|
|
from sklearn.dummy import DummyClassifier
|
|
|
|
from sklearn.datasets import fetch_20newsgroups_vectorized
|
|
from sklearn.metrics import accuracy_score
|
|
from sklearn.utils.validation import check_array
|
|
|
|
from sklearn.ensemble import RandomForestClassifier
|
|
from sklearn.ensemble import ExtraTreesClassifier
|
|
from sklearn.ensemble import AdaBoostClassifier
|
|
from sklearn.linear_model import LogisticRegression
|
|
from sklearn.naive_bayes import MultinomialNB
|
|
|
|
ESTIMATORS = {
|
|
"dummy": DummyClassifier(),
|
|
"random_forest": RandomForestClassifier(n_estimators=100,
|
|
max_features="sqrt",
|
|
min_samples_split=10),
|
|
"extra_trees": ExtraTreesClassifier(n_estimators=100,
|
|
max_features="sqrt",
|
|
min_samples_split=10),
|
|
"logistic_regression": LogisticRegression(),
|
|
"naive_bayes": MultinomialNB(),
|
|
"adaboost": AdaBoostClassifier(n_estimators=10),
|
|
}
|
|
|
|
|
|
###############################################################################
|
|
# Data
|
|
|
|
if __name__ == "__main__":
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-e', '--estimators', nargs="+", required=True,
|
|
choices=ESTIMATORS)
|
|
args = vars(parser.parse_args())
|
|
|
|
data_train = fetch_20newsgroups_vectorized(subset="train")
|
|
data_test = fetch_20newsgroups_vectorized(subset="test")
|
|
X_train = check_array(data_train.data, dtype=np.float32,
|
|
accept_sparse="csc")
|
|
X_test = check_array(data_test.data, dtype=np.float32, accept_sparse="csr")
|
|
y_train = data_train.target
|
|
y_test = data_test.target
|
|
|
|
print("20 newsgroups")
|
|
print("=============")
|
|
print("X_train.shape = {0}".format(X_train.shape))
|
|
print("X_train.format = {0}".format(X_train.format))
|
|
print("X_train.dtype = {0}".format(X_train.dtype))
|
|
print("X_train density = {0}"
|
|
"".format(X_train.nnz / np.product(X_train.shape)))
|
|
print("y_train {0}".format(y_train.shape))
|
|
print("X_test {0}".format(X_test.shape))
|
|
print("X_test.format = {0}".format(X_test.format))
|
|
print("X_test.dtype = {0}".format(X_test.dtype))
|
|
print("y_test {0}".format(y_test.shape))
|
|
print()
|
|
|
|
print("Classifier Training")
|
|
print("===================")
|
|
accuracy, train_time, test_time = {}, {}, {}
|
|
for name in sorted(args["estimators"]):
|
|
clf = ESTIMATORS[name]
|
|
try:
|
|
clf.set_params(random_state=0)
|
|
except (TypeError, ValueError):
|
|
pass
|
|
|
|
print("Training %s ... " % name, end="")
|
|
t0 = time()
|
|
clf.fit(X_train, y_train)
|
|
train_time[name] = time() - t0
|
|
t0 = time()
|
|
y_pred = clf.predict(X_test)
|
|
test_time[name] = time() - t0
|
|
accuracy[name] = accuracy_score(y_test, y_pred)
|
|
print("done")
|
|
|
|
print()
|
|
print("Classification performance:")
|
|
print("===========================")
|
|
print()
|
|
print("%s %s %s %s" % ("Classifier ", "train-time", "test-time",
|
|
"Accuracy"))
|
|
print("-" * 44)
|
|
for name in sorted(accuracy, key=accuracy.get):
|
|
print("%s %s %s %s" % (name.ljust(16),
|
|
("%.4fs" % train_time[name]).center(10),
|
|
("%.4fs" % test_time[name]).center(10),
|
|
("%.4f" % accuracy[name]).center(10)))
|
|
|
|
print()
|