From 2deef78aa7138e41dae0c7ffec93fc33e4e2fc51 Mon Sep 17 00:00:00 2001 From: Charles Date: Sat, 25 Jan 2020 18:44:25 +0100 Subject: model template logreg_train and logreg_predict call model --- logistic_regression_notebook.ipynb | 50 +++++++++++++++++------------------ src/logreg_predct.py | 11 ++++++++ src/logreg_train.py | 11 ++++++++ src/model.py | 54 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 25 deletions(-) create mode 100644 src/logreg_predct.py create mode 100644 src/logreg_train.py diff --git a/logistic_regression_notebook.ipynb b/logistic_regression_notebook.ipynb index 3b4f165..cd9f013 100644 --- a/logistic_regression_notebook.ipynb +++ b/logistic_regression_notebook.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -20,13 +20,13 @@ "Text(0.5, 1.0, 'Data representation')" ] }, - "execution_count": 3, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -91,7 +91,7 @@ "Text(0.5, 1.0, 'Sigmoid function')" ] }, - "execution_count": 8, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, @@ -124,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -133,13 +133,13 @@ "Text(0.5, 1.0, 'Approximation')" ] }, - "execution_count": 18, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -211,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -254,7 +254,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 5, "metadata": { "scrolled": true }, @@ -265,7 +265,7 @@ "Text(0.5, 1.0, 'cost function')" ] }, - "execution_count": 32, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, @@ -297,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -326,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -406,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -427,34 +427,34 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ - "def gradient_descent(xs, ys, theta, alpha=0.1, iterations=100):\n", - " for _ in range(iterations):\n", + "def gradient_descent(xs, ys, theta, alpha=1, epoch=100):\n", + " for _ in range(epoch):\n", " theta = theta - alpha * cost_gradient(xs, ys, theta) \n", " return theta" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "weights: 10.159570236692419 -1.6360674177180405\n", - "train cost: 0.011264210236902399\n", - "test cost: 0.011623228480782\n" + "weights: 29.40983934878407 -5.527334155188794\n", + "train cost: 0.007186648908279271\n", + "test cost: 0.010992176598402464\n" ] } ], "source": [ "theta = np.random.randn(len(X_train[0]) + 1)\n", - "theta = gradient_descent(X_train, Y_train, theta, 1, 500)\n", + "theta = gradient_descent(X_train, Y_train, theta, 4, 500)\n", "print('weights: ', *theta)\n", "print('train cost:', cost(X_train, Y_train, theta))\n", "print('test cost: ', cost(X_test, Y_test, theta))" @@ -462,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -471,13 +471,13 @@ "Text(0.5, 1.0, 'Optimized model')" ] }, - "execution_count": 52, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] diff --git a/src/logreg_predct.py b/src/logreg_predct.py new file mode 100644 index 0000000..ae416b0 --- /dev/null +++ b/src/logreg_predct.py @@ -0,0 +1,11 @@ +import sys + +from model import Model + + +if __name__ == '__main__': + if len(sys.argv) != 3: + raise 'Usage: {} dataset_path weights_path'.path(*sys.argv[1:]) + m = Model() + m.predict() + diff --git a/src/logreg_train.py b/src/logreg_train.py new file mode 100644 index 0000000..8bc9a25 --- /dev/null +++ b/src/logreg_train.py @@ -0,0 +1,11 @@ +import sys + +from model import Model + + +if __name__ == '__main__': + if len(sys.argv) != 2: + raise 'Usage: {} dataset_path'.format(sys.argv[0]) + m = Model() + m.train() + # write diff --git a/src/model.py b/src/model.py index e69de29..f777b16 100644 --- a/src/model.py +++ b/src/model.py @@ -0,0 +1,54 @@ +class Model: + def __init__(self, weights_filename='weights'): + self.weights_filename = weights_filename + + def train(self, xs, ys, alpha=1, epoch=1000): + for _ in range(epoch): + theta = theta - alpha * self.gradient(xs, ys) + + def gradient(self, xs, ys): + return np.array([self.partial(xs, ys, i) for i in range(len(self.theta))]) + + def partial(self, xs, ys, theta_j): + total = 0 + for x_i, y_i in zip(xs, ys): + temp = self.hypothesis(x_i) - y_i + if theta_j != 0: + temp *= x_i[theta_j - 1] + total += temp + return total / len(xs) + + def hypothesis(self, x): + return 1 if self._sigmoid(x.dot(self.theta)) >= 0.5 else 0 + + def logloss(self, x, y): + if y == 1: + return -np.ln(self.hypothesis(x)) + elif y == 0: + return -np.ln(1 - self.hypothesis(x)) + else: + raise "y != 1 and y != 0" + + def cost(self, xs, ys): + return sum([self.logloss(x, y) for x, y in zip(xs, ys)]) / len(xs) + + def _sigmoid(self, x): + return 1 / (1 + np.exp(-x)) + + def _normalize(self, x): + return (x - x.min()) / (x.max() - x.min()) + + def _read_weights(self): + try: + with open(self.weights_filename, 'r') as file: + self.weights = np.array( + [float(s) for s in file.read().strip().split(',')]) + except IOError: + raise 'Couldn\'t read weights file at: {}'.format(self.weights_filename) + + def _write_weights(self): + try: + with open(self.weights_filename, 'w') as file: + file.write(','.join([str(w) for w in self.weights]) + except IOError: + raise 'Couldn\'t write weights file at: {}'.format(self.weights_filename) -- cgit