Logistic Regression(吴恩达机器学习:逻辑回归)

Logistic Regression

题目:入学准许决策

(吴恩达机器学习课后题链接放在最后)
question
输入:两次测试的成绩
输出:是否准许入学

Training set
在这里插入图片描述

第一列为第一次测试分数,第二列为第二次测试分数,一二列为输入
第三列为准许入学决定,即理想输出

处理Training set

file = pd.read_csv('E:/吴恩达机器学习/machine-learning-ex2/ex2/ex2data1.txt', header=None, names=['score1', 'score2', 'admission'])
m = len(file['admission'])
file.insert(0, 'ones', 1)
print(file.head())

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

数据可视化

方式一:

func_shape = lambda x: 'o' if x == 1 else 'x'
func_color = lambda x: 'y' if x == 1 else 'k'
for i in range(m):
    plt.scatter(file['score1'][i], file['score2'][i], marker = func_shape(file['admioosion'][i]),color = func_color(file['admioosion'][i]))
plt.show()

定义了两个lambda表达式,以绘制散点图时指定颜色和形状。
在这里插入图片描述
方式二:

is_admit = file[file.admission.values == 1]
not_admmit = file[file.admission.values == 0]
l1 = plt.scatter(is_admit.score1, is_admit.score2, c='green',marker='o')
l2 = plt.scatter(not_admmit.score1, not_admmit.score2, c='black', marker='x')
plt.legend((l1, l2), ('admitted', 'not admitted'),loc='best')
plt.show()

在file中提取出admission为0和1两种情况下的DataFrame,然后分别调用各自的score1、score2和admission,指定颜色和形状等。
在这里插入图片描述
方式三:

import seaborn as sns
sns.scatterplot(x='score1',y='score2',hue='admission',data=file)

用seaborn库方式比较方便,x和y为绘图的横纵坐标,均来自data中,hue指定类别。
seaborn
在梯度下降中,为了把theta_0加入到权重中进行矩阵运算,我们通常会在输入X的第一列插入全1列,可用以下代码实现:insert

file.insert(0, 'ones', 1)  

loc为位置索引,这里是第0列;
column为列名,这里是’ones‘;
value是插入值,这里是1。

输入输出的数据提取并转换成ndarray形式

X = file.iloc[:, 0:3]
y = file.iloc[:,3]
X = np.array(X, dtype='float64')
y = np.array(y, dtype='int32')

为了之后处理数据的方便,这里把X和y转换成ndarray形式。其中X为(100, 3)维,y为(100, )的一维向量。

sigmod函数

在这里插入图片描述

# sigmod func
def sigmod(z):
    g_z = 1/(1+np.exp(-z))
    return g_z

损失函数求解

首先定义权重theta、学习率alpha、迭代次数iterations

theta = np.array([0, 0, 0])
num_iters= 50
alpha = 0.001

theta定义为 (3, )的一维向量,类型和X和y保持一致。这里把theta的取值会影响最后收敛结果,会在梯度下降中介绍。
以下是损失函数CostFunction求解代码:
cost

def costFunction(theta, X, y):
    first = - y @ np.log(sigmod(X @ theta))
    second = - (1 - y) @ np.log(1 - sigmod(X @ theta))
    J_theta = (1/m) * (first + second)
    return J_theta

@ : 矩阵相乘
其中要特别说明:y为一维向量,在矩阵相乘@中,当y在@左侧,y作为行向量;当y在@右侧,y作为列向量。

J_theta = costFunction(theta, X, y)  # 计算代价函数

运行结果:
cost

梯度下降算法

梯度下降
注意,梯度下降是不断更新权重theta,并不是更新X或y,之后权重会影响模型的预测效果,而与输入输出无关。
对每一个权重theta,更新时刻为累加完所有的m个代数值后,所得累加值在与学习率alpha和样本数据m进行运算后才进行theta更新。

def grad(theta, X, y):
    grad = (1/m) * (X.transpose() @ (sigmod(X @ theta) - y))
    return grad
grad = grad(theta, X, y)
print(grad)

在这里插入图片描述
下面进行梯度下降,更新theta
方式一:

alpha = 0.001
num_iters = 50
def gradient(theta, X, y, num_iters=num_iters):
    J_history = np.zeros((num_iters, 1))
    for i in range(num_iters):
        J_theta = costFunction(theta, X, y)
        grad = grad(theta, X, y)
        theta = theta - alpha * grad
        J_history[i] = J_theta
    return J_history, theta

下面比较不同theta初始值时,代价函数的收敛情况

case 1

theta = np.array([-20,0.1,0.2])

在这里插入图片描述
case 2

theta = np.array([0, 0, 0])

在这里插入图片描述
case 3

theta = np.array([20, 0.1, 0.2])

在这里插入图片描述
不同的初始值theta对结果影响很大,初始值选择不当会造成代价函数收敛至局部最优而非全局最优。
要解决这个问题,可以使用scipy库里的optimize模块。

方式二:
使用scipy.optimize模块

import scipy.optimize as opt
result = opt.minimize(fun=costFunction,x0=theta,args=(X, y),method='Newton-CG',jac=grad)
result
fin_theta = result.x

参数fun:代价函数;x0为初始theta;args为fun中除了theta外还需额外传入的参数;method为所用算法,jac为梯度函数,需要return 权重更新的部分。
opt
fun即为最后代价函数的收敛值;x为最后的权重theta。

可视化

绘制决策边界

sns.scatterplot(x='score1',y='score2',hue='admission',data=file)
plot_x = np.linspace(X[:, 1].min(), X[:, 1].max(), 50)
plot_y = (-fin_theta[0]-fin_theta[1]*plot_x)/fin_theta[2]
plt.plot(plot_x,plot_y)

结果如下:

在这里插入图片描述

预测

def predict(score1, score2):
    predict = sigmod(fin_theta[0]+fin_theta[1]*score1+fin_theta[2]*score2)
    if predict >0.5:
        return "允许入学"
    else:
        return "不允许入学"

prediction = predict(70, 60)
print(prediction)

传入参数:两次测试成绩。
输出:入学决策。
在这里插入图片描述


篇幅限制,正则化部分放在另一个文章里,点击这里跳转

欢迎评论区留言讨论。


NG Machine Learning Courses
链接:https://pan.baidu.com/s/1FoAQNRdevsqYzW4a5QDsBw
提取码:0wdr


猜你喜欢

转载自blog.csdn.net/qq_48691686/article/details/121628177