Logistic Regression in Python

by allenlu2007

本文主要參考此文

  

Example1

以兩個分數來決定是否錄取。用 logistic regression on two variables.  同時調用 Scipy 的 optimization function (fmin_bfgs) 來求解。注意 bias 部份是用 bias trick 改為 vector.  見後文。

NewImage

Python code 如下,copy from Github.

同時準確率 89% (based on training set).

————————————————————-

#/usr/bin/env python

def sigmoid(X):
return 1 / (1 + numpy.exp(- X))

def cost(theta, X, y):
p_1 = sigmoid(numpy.dot(X, theta)) # predicted probability of label 1
#print(p_1)
log_l = (-y)*numpy.log(p_1) – (1-y)*numpy.log(1-p_1) # log-likelihood vector

return log_l.mean()

def grad(theta, X, y):
p_1 = sigmoid(numpy.dot(X, theta))
error = p_1 – y # difference between label and prediction
grad = numpy.dot(error, X_1) / y.size # gradient vector

return grad

def predict(theta, X):
p_1 = sigmoid(numpy.dot(X, theta))
return p_1 > 0.5

 

from numpy import loadtxt, where
from pylab import scatter, show, legend, xlabel, ylabel, plot

#load the dataset
data = loadtxt(‘data/ex2data1.txt’, delimiter=’,’)

X = data[:, 0:2]
y = data[:, 2]

 

import scipy.optimize as opt
import numpy

# prefix an extra column of ones to the feature matrix (for intercept term)
theta = 0.1* numpy.random.randn(3)
X_1 = numpy.append( numpy.ones((X.shape[0], 1)), X, axis=1)

theta_1 = opt.fmin_bfgs(cost, theta, fprime=grad, args=(X_1, y))

#Compute accuracy on our training set
p = predict(numpy.array(theta_1), X_1)
print ‘Train Accuracy: %f’ % ((y[where(p == y)].size / float(y.size)) * 100.0)

x_intercept = -theta_1[0]/theta_1[1]
y_intercept = -theta_1[0]/theta_1[2]

print theta_1
print x_intercept
print y_intercept

pos = where(y == 1)
neg = where(y == 0)

scatter(X[pos, 0], X[pos, 1], marker=’o’, c=’b’)
scatter(X[neg, 0], X[neg, 1], marker=’x’, c=’r’)
legend([‘Admitted’, ‘Not Admitted’])

#plot([y_intercept, 0], [0, x_intercept], ‘r’)
plot([x_intercept, 0], [0, y_intercept], ‘g’)
xlabel(‘Exam 1 score’)
ylabel(‘Exam 2 score’)
show()

——————————————————————-

 

Example2 (Go High Dimension!)

Example 1 顯示對於可以 linear separable 的 classification 問題,logistic regression 可以有效處理。

How about 非 linear separable 的 case?  例如下圖的 microchip testing? 明顯可以看出不可能用 linear function 把 data 分成兩類。有兩種方式: (1) 使用 nonlinear classification algorithm (e.g. neural network, nonlinear SVM);  (2) 把 data transform 成 linear separable.

本文 focus on logistic regression, 所以先用 (2) 來解決 not linear separable 的問題。

 

 NewImage

直覺來看,如果把 (x, y) 座標改成極座標似乎有機會變成 linear separable.  但明顯會對能解的問題有很大的限制。比較好的方法是 transform 到高維空間 (either linear transformation or nonlinear transformation).

第一個問題是 How?  

第二個問題是多高維? (2-dim to 10-dim?  or 100-dim?  or 1000-dim?)

高維代表很多的 free parameters, 很容易產生 over-fit 的問題。

How? 一個方法是儘可能把每個 data point create 更多的 features.  當然是 nonlinear 的方式,因為 linear combination 無法變成 linear separable.   常見方式是用 self-prodcut and cross-product 如下:

NewImage

把原來 2-dimension (x1, x2) 變成 28-dimensions (1+2+3+4+5+6+7=28).  在 28-dim 可能變成 linear separable, 最後 project 回 2-dim 會變成 nonlinear decision boundary.   

為了避免 over-fitting, 可以用 regulation 方式 (regulated logistic regression) 避免 over-fit 問題。多高維仍是一個困難的問題,多半需要 try-and-error.

 

Python code 部份仍有問題,先 show 結果如下。之後再補 code (python version problem?)

NewImage

 

 

 

Advertisements