学习地址:​​点进去​

一、分类与回归

分类和回归的区别在于输出变量的类型。

  • 定量输出称为回归,或者说是连续变量预测;
  • 定性输出称为分类,或者说是离散变量预测。

二、线性回归

1.损失函数是什么?

​损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。​

简单来说:机器学习模型关于单个样本的预测值与真实值的差(绝对值误差损失)称为损失。损失越小,模型越好,如果预测值与真实值相等,就是没有损失。用于计算损失的函数称为损失函数。模型每一次预测的好坏用损失函数来度量。

严格来说(​​维基百科的定义​​):损失函数 在 最优化 , 统计学 , 计量经济学 , 决策论 , 机器学习 和 计算神经科学 的领域中, 损失函数 或 成本函数 是指一种将一个事件(在一个样本空间中的一个元素)映射到一个表达与其事件相关的经济成本或机会成本的 实数 上的一种函数,借此直观表示的一些"成本"与事件的关联。 一个 最佳化问题 的目标是将损失函数最小化。 一个 目标函数 通常为一个损失函数的本身或者为其负值。 当一个目标函数为损失函数的负值时,目标函数的值寻求最大化。

例如本节中:

机器学习经典算法原理-学习总结(1)_代价函数


常见的损失函数还有:(1)mean squared error(均方误差)

均方误差(mse),代表计算每一对真实值和预测值之间的误差的平方和。

机器学习经典算法原理-学习总结(1)_代价函数_02


其中, 和 分别表示第 i 个样本的真实值和预测值,m 为样本个数。

优点:

  • Mse随着误差的减小,梯度也在减小,有利于函数的收敛,能较快取得最小值。

缺点:

  • 当 与 的差值大于 1 时,会增大其误差;当与 的差值小于 1 时,会减小其误差。这是由平方的特性决定的。也就是说, MSE
    会对误差较大(>1)的情况给予更大的惩罚,对误差较小(<1)的情况给予更小的惩罚。从训练的角度来看,优化算法为了降低损失,模型会更加偏向于惩罚较大的点,赋予其更大的权重。即会给离群点赋予更高的权重,受离群点的影响较大,拟合线会往离群点除偏,但却是以牺牲非离群点的预测效果为代价,会降低模型的整体性能;

(2)mean absolute error(平均绝对误差)

平均绝对误差(mae),指的是模型预测值 与样本真实值 之间距离的平均值。

机器学习经典算法原理-学习总结(1)_代价函数_03

优点:

  • MAE 相比 MSE 有个优点就是 MAE 对离群点不那么敏感,更有包容性。

缺点:

  • MAE 的曲线呈 V 字型,连续但在 -=0 处不可导,计算机求解导数比较困难。

(3)Huber Loss

平滑平均绝对误差,综合了mae和mse的优点。其缺点是需要额外运算去确定本身的超参数。

机器学习经典算法原理-学习总结(1)_损失函数_04


Huber Loss,包含了一个超参数 。 值的大小决定了 Huber Loss 对 MSE 和 MAE 的侧重性,当 |y−f(x)| ≤ σ 时,变为类似于 MSE;当 |y−(x)| > σ 时,则变成类似于 MAE,因此 Huber Loss 同时具备了 MSE 和 MAE 的优点,减小了对离群点的敏感度问题,实现了处处可导的功能。

Huber Loss 在 |y−(x)| > δ 时,梯度一直近似为 ,能够保证模型以一个较快的速度更新参数。当 |y−(x)| ≤ σ 时,梯度逐渐减小,能够保证模型更精确地得到全局最优值。

2. 最小二乘法/梯度下降

(1)最小二乘

  • 损失函数:
  • 求导可得:

    使导数右侧为0可得:

    如果X点乘X的转置可逆则有唯一解,否则无法如此求解。

(2)梯度下降

机器学习经典算法原理-学习总结(1)_损失函数_05

3.岭回归

加上l2的线性回归:

机器学习经典算法原理-学习总结(1)_机器学习_06

在用最小二乘推导的过程和上面一样,最后在结果上进行了平滑,保证有解:

机器学习经典算法原理-学习总结(1)_算法_07

4.使用场景

(1)样本数少,或者样本重复程度高,使用岭回归(L2正则);
(2)特征过多,稀疏线性关系,目的为了在一堆特征里面找出主要的特征,用Lasso回归(L1正则)。

二、逻辑回归

逻辑回归是非线性回归的一种,在实际应用过程中主要用于解决二分类问题,主要是将线性函数的结果映射到sigmoid函数中,找到分类超平面。

1.基本原理

定义逻辑回归的预测函数为:

机器学习经典算法原理-学习总结(1)_机器学习_08


其中g(x)函数是sigmoid函数,表示为

机器学习经典算法原理-学习总结(1)_损失函数_09


sigmoid函数有个很漂亮的“s”形,如下图所示:

机器学习经典算法原理-学习总结(1)_算法_10


则逻辑回归的预测函数可表示为:

机器学习经典算法原理-学习总结(1)_代价函数_11

2.决策边界

可以认为x = 0是一个决策边界,当它大于0或小于0时,逻辑回归模型分别预测不同的分类结果。

机器学习经典算法原理-学习总结(1)_损失函数_12


假设逻辑回归方程为:

机器学习经典算法原理-学习总结(1)_损失函数_13


则当 -3+x1+x2>=0 时,y=1;则 x1+x2=3 是一个决策边界,如下图所示:

机器学习经典算法原理-学习总结(1)_算法_14


上述只是一个线性的决策边界,当逻辑回归方程更复杂时我们可以得到非线性的决策边界。例如:

机器学习经典算法原理-学习总结(1)_人工智能_15


决策边界是一个圆形,如下图所示:

机器学习经典算法原理-学习总结(1)_代价函数_16

3.代价函数

逻辑回归的代价函数如下所示:

机器学习经典算法原理-学习总结(1)_人工智能_17


其中:

机器学习经典算法原理-学习总结(1)_机器学习_18


机器学习经典算法原理-学习总结(1)_算法_19


机器学习经典算法原理-学习总结(1)_算法_20


简化逻辑回归的代价函数:

机器学习经典算法原理-学习总结(1)_算法_21

4.梯度下降法

通过梯度下降法最小化逻辑回归的代价函数:

机器学习经典算法原理-学习总结(1)_机器学习_22


机器学习经典算法原理-学习总结(1)_损失函数_23

5.逻辑回归实例

需求:
读取LR-testSet.csv文档,其中第一列是自变量x,第二列是对应于自变量x的因变量y,第三列是点(x,y)对应的类别。要求根据类别画出决策边界,以及loss值随迭代次数的变化图。

import matplotlib.pyplot as plt
import numpy as np
# 载入数据
data = np.genfromtxt("./LR-testSet.csv", delimiter=",")
x_data = data[:,:-1]
y_data = data[:,-1]
def plot():
x0 = []
x1 = []
y0 = []
y1 = []
# 切分不同类别的数据
for i in range(len(x_data)):
if y_data[i]==0:
x0.append(x_data[i,0])
y0.append(x_data[i,1])
else:
x1.append(x_data[i,0])
y1.append(x_data[i,1])
# 画图
scatter0 = plt.scatter(x0, y0, c='b', marker='o')
scatter1 = plt.scatter(x1, y1, c='r', marker='x')
#画图例
plt.legend(handles=[scatter0,scatter1],labels=['label0','label1'],loc='best')
plot()
plt.show()
#数据处理,添加偏置项
x_data = data[:,:-1]
y_data = data[:,-1,np.newaxis] # 增加维度
# 给样本添加偏置项
X_data = np.concatenate((np.ones((100,1)),x_data),axis=1)

#定义sigmoid函数
def sigmoid(x):
return 1.0/(1+np.exp(-x))

#定义代价函数
def cost(xMat, yMat, ws):
left = np.multiply(yMat, np.log(sigmoid(xMat*ws)))
right = np.multiply(1 - yMat, np.log(1 - sigmoid(xMat*ws)))
return np.sum(left + right) / -(len(xMat))
#定义梯度下降函数
def gradAscent(xArr, yArr):
# 根据自变量与因变量分别生成矩阵
xMat = np.mat(xArr)
yMat = np.mat(yArr)
lr = 0.001 # 学习率
epochs = 10000 #最大迭代次数
costList = []
# 计算数据行列数
# 行代表数据个数,列代表权值个数
m,n = np.shape(xMat)
# 初始化权值
ws = np.mat(np.ones((n,1)))

for i in range(epochs+1):
# xMat和weights矩阵相乘
h = sigmoid(xMat*ws)
# 计算误差
ws_grad = xMat.T*(h - yMat)/m
ws = ws - lr*ws_grad

if i % 50 == 0:
costList.append(cost(xMat,yMat,ws))
return ws,costList

#训练模型,得到权值和cost值的变化
ws,costList = gradAscent(X_data, y_data)
# 画决策边界
plot()
x_test = [[-4],[3]]
y_test = -(ws[0] + x_test*ws[1])/ws[2]
plt.plot(x_test, y_test, 'k')
plt.show()

#画图loss值随迭代次数的变化
x = np.linspace(0,10000,201)
plt.plot(x, costList, c='r')
plt.title('Train')
plt.xlabel('Epochs')
plt.ylabel('Cost')
plt.show()