Coursera ML(5)-Logistic Regression and Regularization with Python

[线性回归算法]iii.run,可用于房屋价格的估计及股票市场分析。 [Logistic Regression]iii.run(逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。相关公式推导在iii.run


Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2),作业下载链接貌似被墙了,下载链接放这。http://home.ustc.edu.cn/~mmmwhy/machine-learning-ex2.zip

预备知识

这里应该分为 正常、过拟合和欠拟合,三种情况。

  • Cost Function
    {% raw %} $$J(\theta) = - \frac{1}{m} \sum_{i=1}^m \large[ y^{(i)}\ \log (h_\theta (x^{(i)})) + (1 - y^{(i)})\ \log (1 - h_\theta(x^{(i)}))\large] + \frac{\lambda}{2m}\sum_{j=1}^n \theta_j^2$${% endraw %}

  • Gradient Descent
    {% raw %} $$\begin{align} & \text{Repeat}\ \lbrace \newline & \ \ \ \ \theta_0 := \theta_0 - \alpha\ \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y{(i)})x_0{(i)} \newline & \ \ \ \ \theta_j := \theta_j - \alpha\ \left[ \left( \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y{(i)})x_j{(i)} \right) + \frac{\lambda}{m}\theta_j \right] &\ \ \ \ \ \ \ \ \ \ j \in \lbrace 1,2...n\rbrace\newline & \rbrace \end{align}$${% endraw %}

  • Grad
    {% raw %} $$Grad = \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y{(i)})x_j{(i)}+ \frac{\lambda}{m}\theta_j$${% endraw %}

后边有一个$\frac{\lambda}{2m}\sum_{j=1}^n \theta_j^2$和$\frac{\lambda}{m}\theta_j$小尾巴,作用就是进行 Regularization,防止拟合过度。

Logistic Regression

题目介绍

  • you will build a logistic regression model to predict whether a student gets admitted into a university.(根据各科目分数预测该学生是否能录取)
  • For each training example, you have the applicant's scores on two exams and the admissions decision.
  • Your task is to build a classication model that estimates an applicant's probability of admission based the scores from those two exams.
dataset

python code

from numpy import *
import matplotlib.pyplot as plt
from scipy import optimize

def init(path):
    X,y = load_dataset(path) # 调用底下那个东西
    m, n = shape(X)
    initial_theta = zeros(n + 1)
    return X,y,m,n,initial_theta
    
def load_dataset(path):
    data = loadtxt(path, delimiter=',')
    X = data[:,:2]
    y = data[:, 2]
    return X,y

def plotData(X,y):
    plt.plot(X[y==1][:,0],X[y==1][:,1],'k+',linewidth=2,)
    plt.plot(X[y==0][:,0],X[y==0][:,1],'ko',color='y',linewidth=2)
    plt.xlabel('科目一成绩', fontproperties='SimHei')
    plt.ylabel('科目二成绩', fontproperties='SimHei')
    plt.title('分数与录取的关系', fontproperties='SimHei')
    
    
def sigmoid(X, theta):
    return 1 / (1 + exp(-dot(X, theta)))

def get_cost(theta, X, y):
    J = sum((-y*log(sigmoid(X,theta)) - (1-y)*log(1-sigmoid(X,theta))))/len(X)
    return J

def get_grad(theta, X, y):
    return (sigmoid(X,theta) - mat(y))*X*(1/m)

def plotDecisionBoundary(theta, X, y):
    plotData(X[:, 1:3], y)
    if X.shape[1] <= 3:
        plot_x = r_[X[:,2].min()-2,  X[:,2].max()+2]
        plot_y = - (theta[1]*plot_x + theta[0])/theta[2]
        plt.plot(plot_x, plot_y)
        plt.axis([30,100,30,100])
        plt.legend(['Accepted', 'Not Accepted', 'Decision Boundary'])
        plt.show()
    else:
        pass

    
def predict(theta, X):  
    prob = sigmoid([1,45,85] , result[0])
    return prob
    
if __name__=="__main__":
    path = 'C:\\Users\\wing\\Desktop\\machine-learning-ex2\\ex2\\ex2data1.txt'
    X,y,m,n,initial_theta = init(path)
    X = column_stack((ones(m), X))
    cost = get_cost(initial_theta, X, y)
    grad = get_grad(initial_theta, X, y)

    # obtain the optimal theta
    result = optimize.fmin_tnc(func=get_cost, x0=initial_theta, fprime=get_grad, args=(X, y))  
    get_cost(result[0], X, y)  
    # result = (array([-25.16131863,   0.20623159,   0.20147149]), 36, 0)
    # get_cost(result[0], X, y)  = 0.20349770158947464
    plotDecisionBoundary(result[0], X, y)
    print('For a student with scores 45 and 85, we predict an admission ' \
         'probability of %f\n'%predict(result[0], X))

# For a student with scores 45 and 85, we predict an admission probability of 0.776291

运行结果


最后进行了一个测试,如果一个学生两门考试成绩,一门45分,另外一门85分,那么他被录取的概率为77%。幸亏是在外国,在中国这分数,连大专都考不上。

Logistic Regression and Regularization

题目

  • Suppose you are the product manager of the factory and you have the test results for some microchips on two di�erent tests.
  • 对于一批产品,有两个检测环节,通过检测结果判断产品是否合格。比如,宜家会有三十年床垫保证,那么如果确保床垫合格(用30年),我们只能通过一些检测,来推测产品是否合格。

python code

from numpy import *
import matplotlib.pyplot as plt
from scipy import optimize

def init(path):
    X,y = load_dataset(path)
    dataplot(X,y)
    X = map_feature(X[:,0], X[:,1])
    initial_theta = zeros(size(X[1]))
    lam = 1
    return X,y,initial_theta,lam

def load_dataset(path):
    data = loadtxt(path, delimiter=',')
    X = data[:,:2]
    y = data[:, 2]
    return X,y
    
def dataplot(X,y):
    plt.plot(X[y==1][:,0],X[y==1][:,1],'k+',linewidth=2)
    plt.plot(X[y==0][:,0],X[y==0][:,1],'ko',color='y',linewidth=2)
    plt.legend([ 'y = 1','y = 0'])

def sigmoid(X, theta):
    return 1 / (1 + exp(-dot(X, theta)))


def map_feature(x1, x2):
    #X1, X2, X1 ** 2, X2 ** 2, X1*X2, X1*X2 ** 2, etc...

    x1.shape = (x1.size, 1)
    x2.shape = (x2.size, 1)
    degree = 6
    out = ones(shape=(x1[:, 0].size, 1))
    m, n = out.shape
    for i in range(1, degree + 1):
        for j in range(i + 1):
            r = (x1 ** (i - j)) * (x2 ** j)
            out = append(out, r, axis=1)
    return out

def get_cost(theta, X, y,lam):
    hx = sigmoid(X,theta)
    thetaR = theta[1:]
    J = sum((-y*log(hx) - (1-y)*log(1-hx)))/len(X) \
        + (lam / (2.0 * len(X))) * (thetaR.T.dot(thetaR))
    return J

def get_grad(theta, X, y,lam):
    reg = (lam/len(y))*theta
    reg[0] = 0
    grad = X.T.dot(sigmoid(X,theta)-y)/len(y)+reg
    return grad

def plotDecisionBoundary(theta,lam):
    u = linspace(-1, 1.5, 50)
    v = linspace(-1, 1.5, 50)
    z = zeros(shape=(len(u), len(v)))
    for i in range(len(u)):
        for j in range(len(v)):
            z[i, j] = (map_feature(array(u[i]), array(v[j])).dot(array(theta)))
    z = z.T
    plt.contour(u, v, z)
    plt.title('lambda = %f' % lam)
    plt.xlabel('Microchip Test 1')
    plt.ylabel('Microchip Test 2')
    plt.axis([-0.85,1.1,-0.85,1.1])
    plt.legend(['y = 1', 'y = 0', 'Decision boundary'])
    plt.show()
    
if __name__=="__main__":
    path = 'C:\\Users\\wing\\Desktop\\machine-learning-ex2\\ex2\\ex2data2.txt'
    X,y,initial_theta,lam = init(path)
    result = optimize.fmin_tnc(func=get_cost, x0=initial_theta, fprime=get_grad, args=(X, y,lam))  
    plotDecisionBoundary(result[0],lam)

运算结果

  • 过拟合
    lambda=0。不考虑{% raw %} $\frac{\lambda}{2m}\sum_{j=1}^n \theta_j^2$和$\frac{\lambda}{m}\theta_j${% endraw %} ,我们可以看到图像已经被拟合过度。这样的答案没有通用性


  • 欠拟合
    lambda=10,欠拟合会导致数据的很多细节被抛弃。


  • 拟合较好
    lambda=1,准确性到91%左右,这个准确率算低的了吧,还有很大上升空间。


Summary

熊辉上课的时候,说机器学习需要调参数,参数很不好调,需要使用者对数据有极高的敏感度。

参数lambda就是这种感觉,感觉真的是乱调一通,然后就发现,诶哟,好像还不错。

参考链接:
scipy.optimize.minimize
Logistic regression
Machine Learning Exercises In Python, Part 3
machine-learning-with-python-logistic


以上

<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?type=2&id=421091970&auto=0&height=66"></iframe>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容