第五章逻辑回归算法
逻辑回归算法实在线性回归算法的基础上,构建因变量y的转换函数,将y的数之划分到0-1两类,或者多类,实现对事物的分类拟合与预测。
5.1从线性回归到分类问题
- 回归方法是一种对连续型随机变量进行预测和建模的算法。
预测房价、股票走势、商品销量等。 - 分类方法是一中对离散型随机变量进行建模或预测的算法
过滤垃圾邮件、金融欺诈、预测评价是正面还是负面等。 - 回归任务的特点是标注的数据集为连续型随机变量
- 分类算法同城适用于预测一个离散型类别(类别的概率)
5.2基于Sigmoid函数的分类
逻辑回归是基于Sigmoid函数进行分类的,函数形式:
- 图
5.3使用梯度下降法求最优解
同线性回归类似,逻辑回归的参数求解也是基于成本函数的最优化原则,但是由于逻辑回归输出值具有不连续的特点,在这里通常使用对数似然成本函数或者对数似然损失函数来建立对参数求解的方程。
5.3.1对数似然函数
概率:
是在特定环境下某件事情发生的可能性,描述了参数已知时,随机变量的输出结果。
似然:
是在确定结果下去推测产生这个结果的可能参数,用来描述已知随机变量输出结果时,位置参数的可能取值。
- 概率函数通常用p(x|θ)表示(确切的说是条件概率)
θ代表事件发生对应的参数
x表示发生结果 - 似然函数通常用L(θ|x)表示
极大似然/最大似然:
由于似然描述的是结果已知的情况下,该事件在不同条件下发生的可能性似然函数的值越大说明该事件在对应条件下发生的可能性越大。
在机器学习领域,之所以要关注极大似然,是因为需要根据已知事件(已有样本/训练集)来找出产生这种结果最有可能的条件,从而能够根据这个条件去推测未知事件(预测样本/预测集)的概率。
5.3.2梯度下降法的参数求解
逻辑回归的成本函数:
- 图
- 增加负号是因为最大似然估计求lnL(θ)的最大解,而梯度下降法一般用来求最小值,所以增加负号,才能应用梯度下降法找到一个最小的参数θ。
5.4逻辑回归的python实现
5.4.1梯度下降法求解的python实例:预测学生是否被录取(一)
- 导入数据
df = pd.read_csv('D:/PythonProject/machine/data/5_logisitic_admit.csv')
# 在df插入全为1的一列
df.insert(1,'Ones',1)
# 把admit为1的数据筛选出来形成单独的数据集
positive = df[df['admit'] == 1]
# 把admit为0的数据筛选出来形成单独的数据集
negative = df[df['admit'] == 0]
# 创建子图
fig,ax = plt.subplots(figsize=(8,5))
# 构建positive散点图
ax.scatter(positive['gre'],positive['gpa'],s=30,c='b',marker='o',label='admit')
# 构建negative散点图
ax.scatter(negative['gre'],negative['gpa'],s=30,c='r',marker='x',label='not admit')
# 设置图例
ax.legend()
# 设置x,y轴标签
ax.set_xlabel('gre')
ax.set_ylabel('gpa')
plt.show()
- 构建sigmoid()函数与predict()函数
# 构建sigmoid()函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 构建predict()函数
def predict(theta,X):
# 根据sigmoid()函数预测admit的概率
prob = sigmoid(X * theta.T)
# 根据admit的概率设定阈值,大于0.5记为1,否则为0
return [1 if a >= 0.5 else 0 for a in prob]
- 构建梯度下降gradientDescent()函数
"""
X,y:输入变量
theta:参数
alpha:学习率
m:样本数
numIter:梯度下降迭代次数
"""
def gradientDescent(X, y, theta, alpha, m, numIter):
# 矩阵转置
XTrans = X.transpose()
# 在1-numIter之间循环
for i in range(0, numIter):
# 将theta转换为矩阵
theta = np.matrix(theta)
# 将预测值转换为数组
pred = np.array(predict(theta, X))
# 预测值见去实际值
loss = pred - y
# 计算梯度
gradient = np.dot(XTrans, loss)
# 参数theta的计算,更新法则
theta = theta - alpha * gradient
return theta
- 梯度下降法求解参数
# 取df的后3列为X变量
X = df.iloc[:,1:4]
# 设置y变量
y = df['admit']
# 把X,y转换为数组形式,便于计算
X = np.array(X.values)
y = np.array(y.values)
# 设置训练样本值m,变量个数n
m,n = np.shape(X)
# 初始化
theta = np.ones(n)
# 检查X与y的行列数,是否一致
print(X.shape,theta.shape,y.shape)
# 迭代次数
numIter = 1000
# 学习率
alpha = 0.00001
# 采用构造的gradientDescent()函数求解theta
theta = gradientDescent(X,y,theta,alpha,m,numIter)
print('θ={}'.format(theta))
θ=[[ 0.82635 -1.3196 0.7192773]]
- 预测并计算准确率
# 用predict()函数来预测y
pred = predict(theta,X)
# 将预测为1实际值也为1,预测为0实际值也为0的均记为1
correct = [1 if((a == 1 and b == 1) or (a ==0 and b == 0))
else 0 for (a,b) in zip(pred,y)]
# 采用加总correct值来计算预测对的个数
accuracy = (sum(map(int,correct)) % len(correct))
# 打印预测准确率
print('accurary={:.2f}%'.format(100*accuracy/m))
accurary=67.25%
数据文件:
链接:https://pan.baidu.com/s/1TVPNcRKgrDttDOFV8Q2iDA
提取码:h4ex