Machine_Learning_homework2

1. 逻辑回归基本原理 Logistic Regression

$ odds(x)=\frac{p}{1-p} $ (1)

$ logit§=ln(odd(x))=ln\frac{p}{1-p} $ (2)

$ p=\frac{1}{1-e^{-z}} $ (3)

  • 逻辑回归假设函数

$ h(x_i)=p=\frac{1}{1-e{-(\sum_{i=1}{n}{c_iX_i+b)}}} $ (4)

  • 损失函数

$ l(w,b)=\sum_{i=1}^{m}{[y_iln(f(x_i)+(1-y_i)ln(1-f(x_i))]} $ (5)

  • 通过取对数操作,将 − ∞ -\infty + ∞ +\infty +的z映射为了(0,1)的概率函数。即sigmoid函数

  • 区别逻辑回归是分类问题,因变量是离散值;线性回归是回归问题,因变量是连续值

  • 逻辑回归假设函数和损失函数都有了,即可使用梯度下降算法进行求解。

2. 数据集

作业数据集依然使用的是美国加州大学机器学习数据集中的一个关于汽车油耗数据集来进行分类,从UIC网站获取。

根据逻辑回归要求,我将MPG(每加仑汽油行驶英里数)大于23的定义为省油车型,小于23定义为耗油车型,利用disp(排量)为x(自变量),economy(省油、经济)为y(因变量、预测量)进行逻辑回归分析

3. 实现代码

from mimetypes import init
import tensorflow as tf2
tf = tf2.compat.v1
tf.disable_v2_behavior()
import numpy as np
import pandas  as pd
import matplotlib.pyplot as plt
from numpy import nan

data=pd.read_csv('auto-mpg.data',sep='\s+',header=None)
print(data.shape)
data.columns=['mpg','cyl','disp','hp','wt','acc','year','orig','name']
df=data[data['hp']!='?']

data['economy']=data.mpg.map(lambda x: 1 if x>23 else 0)

#归一化
x_data=data['disp'].values/1000
y_data=data['economy'].values
data_count=len(x_data)

#构建计算图
X=tf.placeholder(tf.float32,  [data_count])
Y=tf.placeholder(tf.float32,  [data_count])
#设定c和b的值
c=tf.Variable(tf.random_uniform([1],-1.0,1.0)) #[-1,1]随机数
b=tf.Variable(tf.zeros([1]))    #b=0
#假设函数
Y_pred=1/(1+tf.exp(-(c*X+b)))
#损失函数
loss=tf.reduce_mean(-Y*tf.log(Y_pred)-(1-Y)*tf.log(1-Y_pred))
#学习率
learning_rate=tf.constant(0.5)

train=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
init=tf.global_variables_initializer()
#计算图构建完成

train_cycles=1000
print_cycles=50

sess=tf.Session()
sess.run(init)
save_data=[]

print('cycle    c   b   loss')
print('============================')
for step in range(1,train_cycles+1):
    sess.run(train,feed_dict={X:x_data,Y:y_data})
    if step%print_cycles==0:
        l=sess.run(loss,feed_dict={X:x_data,Y:y_data})
        c_value=sess.run(c)
        b_value=sess.run(b)
        save_data.append([step,l,c_value[0],b_value[0]])
        print('{:5d},{:8.4f},{:8.4f},{:8.4f}'.format(step,c_value[0],b_value[0],l))
predict=sess.run(Y_pred,feed_dict={X:x_data,Y:y_data})
sess.close

data['predict']=list(map(lambda x:1 if x>0.5 else 0 ,predict))
correct=len(data[data.predict==data.economy])/len(data)
print('correct rate is : {:.2%}'.format(correct))


data.columns=['mpg','cyl','disp','hp','wt','acc','year','orig','name','economy','predict']
df=data[data['hp']!='?']
print(df.sample(10).sort_index())

exportDF=df[['mpg','cyl','disp','hp','wt','acc','year','orig','name','economy','predict']]
exportDF.to_excel('lo5gstic.xlsx',index=False)

4. 逻辑回归结果

4.1. 训练结果

经过1000轮训练,预测正确率达到88.44%,对于一元逻辑回归结果还算不错。
在这里插入图片描述

4.2. 随机取样检查

随机取十个样本值进行比较仅有一个样本audi 5000预测错误,采样观察结果与正确率值大致一致。
在这里插入图片描述

4.3. 可视化

图一为正确标签的结果,图二为逻辑回归的结果,可以看出绝大部分数据经过机器学习都能够判断正确,也证明了逻辑回归的可行性。
在这里插入图片描述

声明:学习记录仅供参考

资源链接: 单变量线性回归

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐