吴恩达机器学习作业-逻辑回归1

在这部分的练习中,你将建立一个逻辑回归模型来预测一个学生是否能进入大学。假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取。你有以前申请人的历史数据,可以将其用作逻辑回归训练集。对于每一个训练样本,你有申请人两次测评的分数以及录取的结果。为了完成这个预测任务,我们准备构建一个可以基于两次测试评分来评估录取可能性的分类模型。

import scipy.optimize as opt
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

"""
    在本部分的练习中,您将使用Logistic回归模型来预测一个学生是否被大学录取。
    假设你是大学某个院系的管理员,你想通过申请人在两门考试中的表现来决定每个人的录取率,你有来自以前申请人的历史数据,你可以用这些数据作为训练集建立Logistic回归,对每一个训练样本,你有申请人在两门考试中的分数和录取决定。
    你的任务是建立一个分类模型,基于这两门课的分数来估计申请人的录取概率。
"""

# ------------sigmiod函数-------------
def sigmoid(z):
    """
        返回参数z对应sigmod函数值
    """
    return 1 / (1 + np.exp(- z))

# -----------代价函数-----------------
def costfunction(theta,X,y):
    """
        返回当前参数对应的代价
        theta : 参数
        X :特征矩阵
        y :标签
    """
    first=(-y)*np.log(sigmoid(X@theta)) #cost函数第一项
    secend=(1-y)*np.log(1-sigmoid((X@theta))) #cost函数第二项
    return np.mean(first-secend) #求均值就相当于除以m

#------------梯度计算--------------
def gradient(theta, X, y):
    """
        返回当前参数对应的梯度值
        theta : 参数
        X :特征矩阵
        y :标签
    """
    return (X.T @ (sigmoid(X @ theta) - y))/len(X)

#------------模型预测函数--------------
def predict(theta, X):
    """
        以0.5为阈值 大于则为1 小于则为0
        返回传入数据对应的一个列表
        theta : 参数
        X :特征矩阵
    """
    probability = sigmoid(X@theta)
    return [1 if x >= 0.5 else 0 for x in probability]  


# --------------1.读取数据 数据可视化-----------------
data = pd.read_csv('ex2data1.txt', names=['exam1', 'exam2', 'admitted'])
print(data.head(5))
print(data.describe())

#绘制散点图 横纵标为exam1的成绩 纵坐标为exam2的成绩
positive = data[data.admitted.isin(['1'])]  # 挑选出admitted列中值为1(即被录取)的数据
negetive = data[data.admitted.isin(['0'])]  # 挑选出admitted列中值为0(即未被录取)的数据
fig,ax=plt.subplots(1,figsize=(20,8),dpi=80) 
ax.scatter(positive['exam1'], positive['exam2'], c='b', label='Admitted')   #画散点图,x y 点的颜色 标签
ax.scatter(negetive['exam1'], negetive['exam2'], s=50, c='r', marker='x', label='Not Admitted')  #画散点图,x y 点的颜色 点的形状 标签
ax.set_xlabel('Exam 1 Score')  # 设置横坐标名
ax.set_ylabel('Exam 2 Score')  # 设置纵坐标名

# ---------------2.数据预处理-----------------
if 'Ones' not in data.columns:
    data.insert(0, 'Ones', 1)         # 在data中加一列x0

X = data.iloc[:, :-1].values  #
y = data.iloc[:, -1].values  
theta = np.zeros(X.shape[1])    #初始化theta为0
print (X.shape, theta.shape, y.shape)    #检查矩阵维度


# ---------------3.利用优化的梯度下降算法求解(计算速度很快,且不需要人为设定α)-----------------
 #func : 优化的目标函数,  fprime :梯度函数, args:数据, x0 : 参数初值
result = opt.fmin_tnc(func=costfunction, x0=theta, fprime=gradient, args=(X, y))
print (result)

# ---------------4.模型预测-----------------
final_theta = result[0]      # 0里面存的是最终的theta值
predictions = predict(final_theta, X)    #计算预测值
print(predictions)
correct = [1 if a==b else 0 for (a, b) in zip(predictions, y)]   #检查预测值和真实值的偏差,相等为1,不等为0
accuracy = sum(correct) / len(X)
print ('准确率: {}'.format(accuracy))

# ---------------5.绘制决策边界-----------------
x1 = np.arange(130, step=0.1)
x2 = -(final_theta[0] + x1*final_theta[1]) / final_theta[2]
ax.plot(x1, x2,c='black',label='Decision Boundary')
ax.set_xlim(0, 130)
ax.set_ylim(0, 130)
ax.legend(loc='best')
plt.show()

吴恩达机器学习作业-逻辑回归1

 

上一篇:13-Query DSL---查询所有---关键词查询


下一篇:Mysql基本命令