逻辑回归是属于机器学习里面的监督学习,它是以回归的思想来解决分类问题的一种非常经典的二分类分类器。由于其训练后的参数有较强的可解释性,在诸多领域中,逻辑回归通常用作 baseline 模型,以方便后期更好的挖掘业务相关信息或提升模型性能。
本实训项目的主要内容是基于 Python 语言搭建出一个能够识别恶性肿瘤的逻辑回归模型,并使用 sklearn 中的 LogisticRegression 实现手写数字识别。
第1关:逻辑回归核心思想
#encoding=utf8
import numpy as np
def sigmoid(t):
'''
完成sigmoid函数计算
:param t: 负无穷到正无穷的实数
:return: 转换后的概率值
:可以考虑使用np.exp()函数
'''
#********** Begin **********#
#np.exp()函数可以实现 e 的幂运算
p = 1/(1+np.exp(-t))
return p
#********** End **********#
第2关:逻辑回归的损失函数
1.A
2.A C D
3.A B
4.D
第3关:梯度下降
# -*- coding: utf-8 -*-
import numpy as np
import warnings
warnings.filterwarnings("ignore")
def gradient_descent(initial_theta,ln=0.05,n_iters=1000,epslion=1e-8):
'''
梯度下降
:param initial_theta: 参数初始值,类型为float
:param ln: 学习率,类型为float
:param n_iters: 训练轮数,类型为int
:param epslion: 迭代过程中,要学习的参数theta更新停止时应满足的阈值,类型为float,当theta变化在epslion规定的范围内时,停止训练。
:return: 训练后得到的参数
'''
# 请在此添加实现代码 #
#********** Begin *********#
theta = initial_theta
for i in range(0,n_iters):
gradient = 2*(theta - 3) #梯度(对loss函数求导) gradient损失函数对参数的导数
theta = theta - ln*gradient#theta为参数θ
if(abs(theta)<epslion):#abs()为求该数的绝对值
break
return theta
#********** End **********#
第4关:动手实现逻辑回归 - 癌细胞精准识别
任务描述
本关任务:使用逻辑回归算法建立一个模型,并通过梯度下降算法进行训练,得到一个能够准确对癌细胞进行识别的模型。
# -*- coding: utf-8 -*-
#student.py
import numpy as np
import warnings
warnings.filterwarnings("ignore")
def sigmoid(x):
'''
sigmoid函数
:param x: 转换前的输入
:return: 转换后的概率
'''
return 1/(1+np.exp(-x))
def fit(x,y,eta=1e-3,n_iters=10000):
'''
训练逻辑回归模型
:param x: 训练集特征数据,类型为ndarray
:param y: 训练集标签,类型为ndarray
:param eta: 学习率,类型为float
:param n_iters: 训练轮数,类型为int
:return: 模型参数,类型为ndarray
'''
# 请在此添加实现代码 #
#********** Begin *********#
theta = np.zeros(x.shape[1])# θ:初始化参数(同x第一维的长度)
for i in range(0,n_iters):
#(a-y)x:其中a为预测值,y为真实值(这里y为0或1)
gradient = (sigmoid(x.dot(theta))-y).dot(x)#sigmoid(z=x.dot(θ))对应a,即逻辑回归函数sigmoid的值
theta = theta -eta*gradient# θ:= θ - η*(▽loss)
return theta
#********** End **********#
第5关:手写数字识别
任务描述
本关任务:使用sklearn中的LogisticRegression类完成手写数字识别任务。
from sklearn.linear_model import LogisticRegression
def digit_predict(train_image, train_label, test_image):
'''
实现功能:训练模型并输出预测结果
:param train_image: 包含多条训练样本的样本集,类型为ndarray,shape为[-1, 8, 8]
:param train_label: 包含多条训练样本标签的标签集,类型为ndarray
:param test_sample: 包含多条测试样本的测试集,类型为ndarry
:return: test_sample对应的预测标签
'''
#************* Begin ************#
# 训练集变形
flat_train_image = train_image.reshape((-1, 64))
#使用min-max标准化方法进行归一化
#Min-Max标准化是指对原始数据进行线性变换,将值映射到[0,1]之间
# 训练集标准化
train_min = flat_train_image.min()
train_max = flat_train_image.max()
flat_train_image = (flat_train_image-train_min)/(train_max-train_min)
# 测试集变形
flat_test_image = test_image.reshape((-1, 64))
# 测试集标准化
test_min = flat_test_image.min()
test_max = flat_test_image.max()
flat_test_image = (flat_test_image - test_min) / (test_max - test_min)
# 训练--预测
logreg = LogisticRegression(C=4.0)
logreg.fit(flat_train_image, train_label)
result = logreg.predict(flat_test_image)
return result
#************* End **************#