Ng-机器学习(Day 2)

Classification:

逻辑回归(Logistic Regression):

  • 作用
    在这里插入图片描述
  • hypothesis函数在这里与线性回归是不同的:
  • 当h(x)>0.5,就会被归为正向类;当h(x)<0.5时就会被归为负向类
    在这里插入图片描述

在这里插入图片描述

  • 在参数与特征值已知的情况下,y=0或1的概率

在这里插入图片描述

  • 下面这个图像描述了g(z)与z之间的关系:
    1、当z<0,即theta的转置特征值<0:g(z)就会被归到0类
    2、当z>0,即theta的转置
    特征值>0:g(z)就会被归到1类

在这里插入图片描述

现在假设我们有一个模型:
在这里插入图片描述

并且参数θ 是向量[-3 1 1],则当-3+x_1+x_2≥0,即x_1+x_2≥3时,模型将预测 y=1。 我们可以绘制直线x_1+x_2=3,这条线便是我们模型的分界线,将预测为1的区域和预测为 0的区域分隔开。
在这里插入图片描述
同样的,如果有个更复杂的模型,会用一条更拟合的线来分割
在这里插入图片描述

  • 代价函数:
    若我们继续使用计算线性回归代价函数的公式去计算Logistic回归的图,那么我们就会得到下面的左图这样的结果,就不能够获取全局最优解。
    在这里插入图片描述
    在这里插入图片描述
    所以我们将代价函数重新定义:
    在这里插入图片描述
    其中:
    在这里插入图片描述
    代价函数与x函数的关系如下:
    在这里插入图片描述
    当我们的y=1时,当h函数趋于0时,Cost趋于无穷大。也就是说,本来一个人是患有肿瘤的机率很大,那么预测一个人不患有肿瘤,我们会付出很大的代价。
    在这里插入图片描述
    当y=0时
    在这里插入图片描述
    代价函数化简组合:
    在这里插入图片描述在这里插入图片描述
  • 梯度下降函数计算最优代价函数:
    在这里插入图片描述

实例练习:

  • 首先定义一个函数用来分割特征值和标签值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import classification_report#这个包是评价报告

def getXY(Data):
	"""获取特征值列和标签列
	Params:
		Data:原始数据
	return:
		特征值列;标签列"""
    m = Data.shape[0]
    x0 = pd.DataFrame(np.ones(m)) #增加一列x0初始化为1
    data = pd.concat([x0,Data],axis=1) #组合数据
    return np.array(data.iloc[:,:-1])#返回0到倒数第二列,np.array(data.iloc[:,-1])#返回最后一列,即标签列

def normalize(data):
    """缩放数据"""
    return data.apply(lambda x : (x-x.mean())/x.std())

if __name__ == '__mian__':
	Data = pd.Data=pd.read_csv('ex2data1.txt',names=['eaxm1','exam2','admitted'])
	Data.head()

运行结果如下:
在这里插入图片描述

  • 写代价函数:
def sigmoid(theta,X):
	"""计算hypothesis函数
	Params:
		theta:初始化的参数
		X:特征值数据
	return h函数值"""
    return 1/(1+np.exp(-(X @ theta)))

在这里插入图片描述

  • 更具上边的公式计算代价函数
def cost(theta,X,Y):
	"""根据公式计算代价函数
		"""
    return np.mean(-Y*np.log(sigmoid(theta,X))- (1-Y)*np.log(1-sigmoid(theta,X)))

在这里插入图片描述

  • 根据上面公式计算代价函数的导数
def gradDscent(theta,X,Y):
    theta_ = theta.copy()
    h = sigmoid(theta_,X)
    error = h-Y
    g = (1/len(X))*(X.T@error)
    return g
  • 利用scipy.optimize库来计算最优拟合theta
import scipy.optimize as opt
def getXY(Data):
	"""获取特征值列和标签列
	Params:
		Data:原始数据
	return:
		特征值列;标签列"""
    m = Data.shape[0]
    x0 = pd.DataFrame(np.ones(m)) #增加一列x0初始化为1
    data = pd.concat([x0,Data],axis=1) #组合数据
    return np.array(data.iloc[:,:-1])#返回0到倒数第二列,np.array(data.iloc[:,-1])#返回最后一列,即标签列

def cost(theta,X,Y):
	"""根据公式计算代价函数
		Params:
			theta:初始化的theta
			X:特征值
			Y:分类变量
		return: 
			cost函数的值"""
    return np.mean(-Y*np.log(sigmoid(theta,X))- (1-Y)*np.log(1-sigmoid(theta,X)))

def gradDscent(theta,X,Y):
	"""根据公式计算cost函数的导数
		Params:
			theta:初始化的theta
			X:特征值
			Y:分类变量
		return: 
			g: cost函数的导数"""    
    theta_ = theta.copy()
    h = sigmoid(theta_,X)
    error = h-Y
    g = (1/len(X))*(X.T@error)
    return g
if __name__=='__main__':
	Data = pd.Data=pd.read_csv('ex2data1.txt',names=['eaxm1','exam2','admitted'])
	X,Y=getXY(Data)
	n = X.shape[1]
	theta = np.zeros(n)
	res = opt.minimize(fun=cost,x0=theta,args=(X,Y),method = 'Newton-CG',jac=gradDsecent) 
	print(res)
	print(res.x)#最优拟合参数

在这里插入图片描述
在这里插入图片描述

  • 写一个测试函数:
def predict(X,final_theta):
	"""计算预测的结果
		Params:
			X:特征值
			final_theta:最优拟合值
		return:
			预测的分类结果"""
    prob = sigmoid(theta,X)
    return (prob>=0.5).astype(int) #用0,1代替bool值

if __name__=='__main__':
	final_theta = res.x
	y_pred = predict(X,final_theta)
	print(y_pred)
	print(classification_report(Y,y_pred))#预测报告

结果如下:
在这里插入图片描述

  • 计算决策边界线,并画图:
    在这里插入图片描述
    (注:如果特征值有两个,那么通常把最后一个当做y,然后根据上面的公式即可计算。)
y = (-res.x[0]-res.x[1]*X[:,1])/res.x[2] 
sns.set(context="notebook", style="ticks", font_scale=1.5) #图片的风格
sns.lmplot('eaxm1','exam2',hue='admitted',data=Data,size=6,fit_reg=False,scatter_kws={"s":50})
# 列名;hue:分类变量;data:要检索的数据集;size:图片大小;scatter_kws:散点大小
plt.plot(X[:,1],y)
plt.xlim(0,130)#显示x的边界
plt.ylim(0,130)
plt.show()

结果如下:
在这里插入图片描述
参考资料:

  1. Ng机器学习
  2. 黄博笔记
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章