python logistics regression_吴恩达机器学习笔记Python--ex2(logistics regression)

准备数据

data1的数据是学生两个学期的成绩exam1,exam2和是否能被录取admitted

把作业的data1数据导入,画出图形

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

plt.style.use('fivethirtyeight')#一种绘图风格

import matplotlib.pyplot as plt

from sklearn.metrics import classification_report#这个包是评价报告

data=pd.read_csv(r'D:\MachineLearning\ex2\ex2_data1.txt',names=['exam1','exam2','admitted'])

sns.set(context='notebook',style='darkgrid',palette=sns.color_palette('RdBu',2))

sns.lmplot('exam1','exam2',hue='admitted',data=data,size=6,fit_reg=False,scatter_kws={'s':50})

plt.show()

运行结果如下:

365c194e6a4ac00b13feaa6969020afd.png读取数据

#读取特征

def get_X(df):

ones=pd.DataFrame({'ones':np.ones(len(df))})#ones是m行1列的dataframe

data=pd.concat([ones,df],axis=1)#合并数据,axis=1是列合并,=0是行合并。concat对大型数据集来说效率不高

return data.iloc[:,:-1].values

#读取标签

def get_y(df):

return np.array(df.iloc[:,-1])#取所有行和取最后一列

#特征缩放

def normalize_feature(df):

return df.apply(lambda column:(column-column.mean())/column.std())#apply是应用到每个数据,lambda是匿名函数

sigmoid函数

917c3917426b9a5fbc702d3d9d0e7701.png根据定义画出sigmoid函数图形

#sigmoid函数

def sigmoid(z):

return 1/(1+np.exp(-z))

fig,ax=plt.subplots(figsize=(8,6))

ax.plot(np.arange(-10,10,step=0.01),sigmoid(np.arange(-10,10,step=0.01)))

ax.set_ylim((-0.1,1.1))#y轴的刻度范围从-0.1到1.1

ax.set_xlabel('z',fontsize=18)

ax.set_ylabel('g(z)',fontsize=18)

ax.set_title('sigmoid funciton',fontsize=18)

plt.show()

结果如图:

7e342eac8fea9fccbeef4636ddde6137.png计算代价函数

3b94236b671130ff9c3bc4c527a96102.png

theta=np.zeros(3)#因为X(m*n)所以theta是n*1

def cost(theta,X,y):

return np.mean(-y*np.log(sigmoid(X@theta))-(1-y)*np.log(1-sigmoid(X@theta)))#X@theta与X.dot(theta)等价

print(cost(theta,get_X(data),get_y(data)))

输出的结果是0.69314718055994529

梯度下降

公式如下:

c95184361d2e2215c0d70ab67315c53e.png这里不像之前那样,写一个循环和设置一个学习率α,这里用到python里的fmin函数可以直接计算得到最优参数θ,实现如下:

导入scipy包:

import scipy as sp

#梯度下降

def optimizeTheta(theta,X,y):

result=sp.optimize.fmin(cost,x0=theta,args=(X,y),maxiter=400,full_output=True)

return result[0],result[1]

theta,mincost=optimizeTheta(theta,get_X(data),get_y(data))

print(cost(theta,get_X(data),get_y(data)))

运行结果如下:

得到最优参数θ:0.20349

e7f11a78c9024569ca76cd0209b3ce3b.png用训练集预测和验证

#用训练集预测和验证

def predict(x,theta):

prob=sigmoid(x@theta)

return (prob>=0.5).astype(int)

y_pred=predict(get_X(data),final_theta)

print(classification_report(get_y(data),y_pred))

运行结果如下:

2ebfe79503add82bd19d9515e2ad7f72.png其中classification_report函数的详解可以参考这篇文章:https://blog.csdn.net/akadiao/article/details/78788864

预测样本

预测样本的入学概率

#预测样本exam1:45,exam2:85的入学概率

print(sigmoid(np.dot(final_theta,[1,45,85])))#1是x0

运行结果是0.7762915904112411

决策边界

类似 ax+by+c= 0,求出y即可。

#绘制决策边界

sns.set(context='notebook',style='ticks',font_scale=1.5)

sns.lmplot('exam1','exam2',hue='admitted',data=data,size=6,fit_reg=False,scatter_kws={'s':25})

boundary_x=np.array([np.min(get_X(data)[:,1]),np.max(get_X(data)[:,1])])

boundary_y=(-1./final_theta[2]*(final_theta[0]+final_theta[1]*boundary_x))

plt.plot(boundary_x,boundary_y,'grey')

plt.show()

e2f6c9e7033abed232a1c141196ee54f.png正则化逻辑回归

data2是芯片经过两个测试后是否能通过

先是画出数据集的图形

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

plt.style.use('fivethirtyeight')#一种绘图风格

import matplotlib.pyplot as plt

data=pd.read_csv(r'D:\MachineLearning\ex2\ex2_data2.txt',names=['test1','test2','accepted'])

#绘制出图形

sns.set(context='notebook',style='ticks',font_scale=1.5)

sns.lmplot('test1','test2',hue='accepted',data=data,size=6,fit_reg=False,scatter_kws={'s':50})#scatter_kws's'点的大小

plt.title('Regularized Logistic Regression')

plt.show()

20b23f36bb8edc17d0765dec37b282a4.png

特征映射

之所以进行特征映射,是因为特征映射的好处在于从每个特征中能创造出更多的特征。

#特征映射

def feature_mapping(x,y,power,as_ndarray=False):

data={"f{}{}".format(i-p,p):np.power(x,i-p)*np.power(y,p)

for i in np.arange(power+1)

for p in np.arange(i+1)}

if as_ndarray:

return pd.DataFrame(data).as_matrix()

else:

return pd.DataFrame(data)

x1=np.array(data.test1)

x2=np.array(data.test2)

data=feature_mapping(x1,x2,power=6)

正则化代价函数

正则化的原因是因为特征映射的过程中生成了太多高次项,当模型的特征(feature variables)非常多,而训练的样本数目(training set)又比较少,会出现过拟合的问题。如果我们发现了过拟合问题,应该如何处理?

1、丢弃一些不能帮助我们正确预测的特征。

2、正则化。保留所有的特征,但是减少参数θ的大小。

选择正则化,就需要减少高幂次的特征变量的影响,为此我们引入的罚项,假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚。

公式如下:

6f30db314fd137cd02b79ac34d33cd9d.png

#正则化代价函数

def sigmoid(z):

return 1/(1+np.exp(-z))

def cost(theta,X,y):

return np.mean(-y*np.log(sigmoid(X@theta))-(1-y)*np.log(1-sigmoid(X@theta)))

def get_y(df):

return np.array(df.iloc[:,-1])

theta=np.zeros(data.shape[1])

X=feature_mapping(x1,x2,power=6,as_ndarray=True)

#print(X.shape)

y=get_y(data)

#print(y.shape)

def regularized_cost(theta,X,y,l=1):

theta_j1_to_n=theta[1:]

regularized_term=(1/(2*len(X)))*np.power(theta_j1_to_n,2).sum()

return cost(theta,X,y)+regularized_term

print(regularized_cost(theta,X,y,l=1))

输出结果:0.69314718055

本文地址:https://blog.csdn.net/LunaLee38/article/details/110622495

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值