机器学习—有监督学习—逻辑回归(推导及代码实现)

1、逻辑回归简述

逻辑回归算法是目前使用最为广泛的一种学习算法,用于解决分类问题。与线性回归算法一样,也是监督学习算法。不用线性回归的原因是,分类问题,y的取值为0或1,如果使用线性回归,那么线性回归模型的输出值可能远大于1,或者远小于0,会导致代价函数很大。
在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;区别一个肿瘤是恶性的还是良性的。

2、创建模型

逻辑回归算法的思想是:它的输出值永远在0 到1 之间。
由于这个特性引入新模型,逻辑函数(S 形函数)也叫 Sigmoid函数 ,该模型的输出变量范围始终在 0 和 1 之间。
在这里插入图片描述
在这里插入图片描述
而模型通过确定参数计算得出的h(x0)=0.7,表示有70%的几率 y 为正向类,相应地 y 为负向类的几率为 1-0.7=0.3。

3、代价函数

当逻辑回归模型沿用线性回归一样的误差平方和代价函数时,得到的代价函数是一个非凸函数,如下图,这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
在这里插入图片描述
当误差平方和代价函数不适应逻辑回归时,引出了逻辑回归的代价函数(交叉熵代价函数)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样构建的 Cost(hθ(x),y)函数的特点是:当实际的 y=1 且 hθ也为 1 时误差为 0,当 y=1
但 hθ不为 1 时误差随着 hθ 的变小而变大;当实际的 y=0 且 hθ 也为 0 时代价为 0,当 y=0
但 hθ不为 0 时误差随着 hθ 的变大而变大。
合并后的代价函数为:
在这里插入图片描述
该交叉熵代价函数J(θ)是一个凸函数,无论在哪里初始化,最终都能到达这个凸函数的最小值点。

4、梯度下降

使用梯度下降算法对代价函数中的参数θ,求偏导
在这里插入图片描述
最后求得
在这里插入图片描述
由上图看出,逻辑回归的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但由于这里的 hθ(x)=g(θTX)与线性回归中不同,所以实际上是不一样的。下图为参数更新方程:
在这里插入图片描述

5、代码实现(数据集在最下方)

①、数据预处理
#导包
import numpy as np                      
import  matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']     #中文显示
plt.rcParams['axes.unicode_minus']=False   #负号显示

#数据读取  以‘,’隔开  
train_data = np.loadtxt('./LoR_linear.txt',delimiter=',')
#最后一列之前为特征   最后一列为标签
train_x,train_y = train_data[:,:-1],train_data[:,-1]

#数据预处理
def preProcess(x,y):
	#标准化特征缩放
    x -= np.mean(x,axis=0)
    x /= np.std(x,axis=0,ddof=1)
	
	#数据初始化
    x = np.c_[np.ones(len(x)),x]
    y = np.c_[y]
    return x,y
train_x,train_y = preProcess(train_x,train_y)
②、定义模型
#定义Sigmoid函数
def g(z):
    g = 1/(1+np.exp(-z))
    return g
    
#Sigmoid函数图像
x = np.linspace(-10,10,500)
y = g(x)
plt.plot(x,y)
plt.plot(0,g(0),marker='x',c='r')
plt.show()

#定义模型
def model(x,theta):
    z = np.dot(x,theta)
    h = g(z)
    return h
③、定义代价函数
def costFunc(h,y,lamda=0.0):
    m = len(y)
    J = (-1.0/m)*np.sum(y*np.log(h)+(1-y)*np.log(1-h))
    return J
④、梯度下降
#定义学习率α  迭代次数
def gradDesc(x,y,alpha=0.05,iter_num=6000):
    m,n = x.shape
    #初始化
    theta = np.zeros((n,1))
    J_history = np.zeros(iter_num)

    for i in range(iter_num):
        h = model(x,theta)
        J_history[i] = costFunc(h,y)
		#更新θ
        deltaTheta = 1.0/m*np.dot(x.T,h-y)
        theta -= alpha*deltaTheta
    return J_history,theta
⑤、画图
#画代价曲线
plt.plot(J_history)
plt.show()

#画样本分布图,决策边界
def show(x,y,theta,title):
    plt.title(title)
    plt.scatter(x[ y[:,0]==0 ,1],x[ y[:,0]==0 ,2],label='负样本')
    plt.scatter(x[ y[:,0]==1 ,1],x[ y[:,0]==1 ,2],label='正样本')
	
	#最大值、最小值画图
    min_x1,max_x1 = np.min(x[:,1]),np.max(x[:,1])
    min_x1_x2,max_x1_x2 = -(theta[0]+theta[1]*min_x1)/theta[2],-(theta[0]+theta[1]*max_x1)/theta[2]

    plt.plot([min_x1,max_x1],[min_x1_x2,max_x1_x2],label='分界线')
    plt.legend()
    plt.show()

show(train_x,train_y,theta,'训练集')
⑥、可视化展示

Sigmoid函数图像
在这里插入图片描述
代价曲线图
在这里插入图片描述
在这里插入图片描述

5、调sklearn库实现

#调sklearn下的逻辑回归库
from sklearn.linear_model import LogisticRegression
#混淆矩阵  分类报告
from sklearn.metrics import confusion_matrix,classification_report

# -创建模型及设置参数:最大迭代次数为1500 (2分)
LR = LogisticRegression(max_iter=1500)
LR.fit(train_X,train_y)

# -对训练集进行训练,计算并输出测试集的准确率(4分)
print(LR.score(test_X,test_y))

# -分别计算并输出训练集和测试集的混淆矩阵和分类报告(6分)
print(confusion_matrix(train_y,LR.predict(train_X)))
print(classification_report(train_y,LR.predict(train_X)))

print(confusion_matrix(test_y,LR.predict(test_X)))
print(classification_report(test_y,LR.predict(test_X)))

6、数据集

34.62365962451697,78.0246928153624,0
30.28671076822607,43.89499752400101,0
35.84740876993872,72.90219802708364,0
60.18259938620976,86.30855209546826,1
79.0327360507101,75.3443764369103,1
45.08327747668339,56.3163717815305,0
61.10666453684766,96.51142588489624,1
75.02474556738889,46.55401354116538,1
76.09878670226257,87.42056971926803,1
84.43281996120035,43.53339331072109,1
95.86155507093572,38.22527805795094,0
75.01365838958247,30.60326323428011,0
82.30705337399482,76.48196330235604,1
69.36458875970939,97.71869196188608,1
39.53833914367223,76.03681085115882,0
53.9710521485623,89.20735013750205,1
69.07014406283025,52.74046973016765,1
67.94685547711617,46.67857410673128,0
70.66150955499435,92.92713789364831,1
76.97878372747498,47.57596364975532,1
67.37202754570876,42.83843832029179,0
89.67677575072079,65.79936592745237,1
50.534788289883,48.85581152764205,0
34.21206097786789,44.20952859866288,0
77.9240914545704,68.9723599933059,1
62.27101367004632,69.95445795447587,1
80.1901807509566,44.82162893218353,1
93.114388797442,38.80067033713209,0
61.83020602312595,50.25610789244621,0
38.78580379679423,64.99568095539578,0
61.379289447425,72.80788731317097,1
85.40451939411645,57.05198397627122,1
52.10797973193984,63.12762376881715,0
52.04540476831827,69.43286012045222,1
40.23689373545111,71.16774802184875,0
54.63510555424817,52.21388588061123,0
33.91550010906887,98.86943574220611,0
64.17698887494485,80.90806058670817,1
74.78925295941542,41.57341522824434,0
34.1836400264419,75.2377203360134,0
83.90239366249155,56.30804621605327,1
51.54772026906181,46.85629026349976,0
94.44336776917852,65.56892160559052,1
82.36875375713919,40.61825515970618,0
51.04775177128865,45.82270145776001,0
62.22267576120188,52.06099194836679,0
77.19303492601364,70.45820000180959,1
97.77159928000232,86.7278223300282,1
62.07306379667647,96.76882412413983,1
91.56497449807442,88.69629254546599,1
79.94481794066932,74.16311935043758,1
99.2725269292572,60.99903099844988,1
90.54671411399852,43.39060180650027,1
34.52451385320009,60.39634245837173,0
50.2864961189907,49.80453881323059,0
49.58667721632031,59.80895099453265,0
97.64563396007767,68.86157272420604,1
32.57720016809309,95.59854761387875,0
74.24869136721598,69.82457122657193,1
71.79646205863379,78.45356224515052,1
75.3956114656803,85.75993667331619,1
35.28611281526193,47.02051394723416,0
56.25381749711624,39.26147251058019,0
30.05882244669796,49.59297386723685,0
44.66826172480893,66.45008614558913,0
66.56089447242954,41.09209807936973,0
40.45755098375164,97.53518548909936,1
49.07256321908844,51.88321182073966,0
80.27957401466998,92.11606081344084,1
66.74671856944039,60.99139402740988,1
32.72283304060323,43.30717306430063,0
64.0393204150601,78.03168802018232,1
72.34649422579923,96.22759296761404,1
60.45788573918959,73.09499809758037,1
58.84095621726802,75.85844831279042,1
99.82785779692128,72.36925193383885,1
47.26426910848174,88.47586499559782,1
50.45815980285988,75.80985952982456,1
60.45555629271532,42.50840943572217,0
82.22666157785568,42.71987853716458,0
88.9138964166533,69.80378889835472,1
94.83450672430196,45.69430680250754,1
67.31925746917527,66.58935317747915,1
57.23870631569862,59.51428198012956,1
80.36675600171273,90.96014789746954,1
68.46852178591112,85.59430710452014,1
42.0754545384731,78.84478600148043,0
75.47770200533905,90.42453899753964,1
78.63542434898018,96.64742716885644,1
52.34800398794107,60.76950525602592,0
94.09433112516793,77.15910509073893,1
90.44855097096364,87.50879176484702,1
55.48216114069585,35.57070347228866,0
74.49269241843041,84.84513684930135,1
89.84580670720979,45.35828361091658,1
83.48916274498238,48.38028579728175,1
42.2617008099817,87.10385094025457,1
99.31500880510394,68.77540947206617,1
55.34001756003703,64.9319380069486,1
74.77589300092767,89.52981289513276,1
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值