|
29 | 29 | parser.add_argument("--out", type=str, default="tfidf", choices=["tfidf", "count"],
|
30 | 30 | help="Type of document vectors (default: tfidf)")
|
31 | 31 |
|
| 32 | +parser.add_argument("--test", action="store_false", dest="validation", |
| 33 | + help="Include this flag if models should be tuned on the test set instead.") |
| 34 | +parser.set_defaults(validation=True) |
| 35 | + |
32 | 36 | parser.add_argument("--min", type=float, default=0)
|
33 | 37 | parser.add_argument("--max", type=float, default=5)
|
34 | 38 |
|
|
45 | 49 | y_train = train.labels
|
46 | 50 | y_test = test.labels
|
47 | 51 |
|
48 |
| -# Split training set & validation set |
49 |
| -validation_index = -1 * int(0.1 * float(len(y_train))) |
50 |
| -x_train, x_valid = x_train[:validation_index], x_train[validation_index:] |
51 |
| -y_train, y_valid = y_train[:validation_index], y_train[validation_index:] |
| 52 | +if args.validation: |
| 53 | + # Split training set & validation set |
| 54 | + validation_index = -1 * int(0.1 * float(len(y_train))) |
| 55 | + x_train, x_valid = x_train[:validation_index], x_train[validation_index:] |
| 56 | + y_train, y_valid = y_train[:validation_index], y_train[validation_index:] |
| 57 | +else: |
| 58 | + x_valid, y_valid = [], [] |
52 | 59 |
|
53 | 60 | # Print information about the dataset
|
54 | 61 | print("")
|
|
69 | 76 | # Training
|
70 | 77 | # ==================================================
|
71 | 78 |
|
72 |
| -acc_dict = {} |
| 79 | +# Generate C values to test [min, max, 0.1] |
73 | 80 | C_arr = [float('%.1f' % i) for i in np.arange(args.min, args.max + 0.1, 0.1)]
|
| 81 | + |
| 82 | +# Train & test models with different hyperparameter values |
| 83 | +acc_dict = {} |
74 | 84 | for i in C_arr:
|
75 | 85 | if i <= 0:
|
76 | 86 | continue
|
77 | 87 | svm_clf = LinearSVC(C=i)
|
78 | 88 | svm_clf.fit(x_train, y_train)
|
79 |
| - predicted = svm_clf.predict(x_valid) |
80 |
| - svm_acc = np.mean(predicted == y_valid) |
| 89 | + if args.validation: |
| 90 | + predicted = svm_clf.predict(x_valid) |
| 91 | + svm_acc = np.mean(predicted == y_valid) |
| 92 | + else: |
| 93 | + predicted = svm_clf.predict(x_test) |
| 94 | + svm_acc = np.mean(predicted == y_test) |
81 | 95 | acc_dict[i] = svm_acc
|
82 | 96 | print("C {:.2f}: {:g}".format(i, svm_acc))
|
83 | 97 |
|
84 | 98 | print(acc_dict)
|
85 | 99 | print("")
|
86 | 100 |
|
87 |
| -x_train = vstack((x_train, x_valid)) |
88 |
| -y_train = np.concatenate((y_train, y_valid), axis=0) |
| 101 | +# Concatenate training set & validation set to form original train set |
| 102 | +if args.validation: |
| 103 | + x_train = vstack((x_train, x_valid)) |
| 104 | + y_train = np.concatenate((y_train, y_valid), axis=0) |
| 105 | + |
| 106 | +# Get optimized hyperparameter |
89 | 107 | max_C = max(acc_dict.keys(), key=(lambda key: acc_dict[key]))
|
90 | 108 |
|
| 109 | +# Re-train & test model with chosen hyperparameter |
91 | 110 | svm_clf = LinearSVC(C=max_C)
|
92 | 111 | svm_clf.fit(x_train, y_train)
|
93 | 112 | predicted = svm_clf.predict(x_test)
|
94 | 113 | svm_acc = np.mean(predicted == y_test)
|
95 | 114 |
|
| 115 | +# Print result of final model |
96 | 116 | utils.print_result(args.dataset, "linear_svc", svm_acc, data_str, str(int(time.time())),
|
97 | 117 | hyperparams="{{C: {}}}".format(max_C))
|
0 commit comments