机器学习——回归模型

☆樱花仙子☆ 提交于 2020-03-03 12:02:35

一、线性回归


回归的目的是预测数值型的目标值。最直接的办法是依据输入写出一个目标值的计算公式,该公式就是所谓的回归方程(regression equation)。求回归方程中的回归系数的过程就是回归。

线性回归的几个特点: 1. 建模速度快,不需要很复杂的计算,在数据量大的情况下依然运行速度很快。 2. 可以根据系数给出每个变量的理解和解释 3. 对异常值很敏感。

在这里插入图片描述

# 代码表示:linear_model.LinearRegression()

二、岭回归

岭回归实质上就是在线性回归的基础上加了L2正则化项。
在这里插入图片描述

领回归的特点:

  1. 领回归的假设和最小平方回归相同,但是在最小平方回归的时候我们假设数据服从高斯分布使用的是极大似然估计(MLE),在领回归的时候由于添加了偏差因子,即w的先验信息,使用的是极大后验估计(MAP)来得到最终的参数
  2. 没有特征选择功能
# 代码表示:linear_model.Ridge(0.5) 

三、LASSO回归

LASSO回归在线性回归的基础上加了L1正则化项。
在这里插入图片描述

L1正则化和L2正则化的区别: L1正则化会使得一些权重直接变为0,L2正则化只是将一些权重的值变的更小。L1跟拉普拉斯有关,L2跟高斯分布有关。

# 代码表示:linear_model.Lasso(0.1)
  1. 岭回归和Lasso回归之间的差异可以归结为L1正则和L2正则之间的差异: 内置的特征选择(Built-in feature selection):这是L1范数很有用的一个属性,L2范数不具有这种特性。因为L1范数倾向于产生系数。例如,模型中有100个系数,但其中只有10个系数是非零系数,也就是说只有这10个变量是有用的,其他90个都是没有用的。而L2范数产生非稀疏系数,所以没有这种属性。因此可以说Lasso回归做了一种参数选择形式,未被选中的特征变量对整体的权重为0。
  2. 稀疏性:指矩阵或向量中只有极少个非零系数。L1范数产生具有零值或具有很少大系数或者非常小的系数的属性。

四、弹性回归网络

弹性网络是将L1和L2正则化组合在一起使用。
在这里插入图片描述

# 代码表示:linear_model.ElasticNet(0.5,0.5)

在Lasso和岭回归之间进行权衡的一个实际是运行弹性网络在循环的情况下继承岭回归的一些稳定性。 弹性回归网络的优点:

  1. 鼓励在高度相关变量的情况下的群体效应,而不像Lasso那样将其中一些置为0。当多个特征和另一个特征相关的时候弹性网络非常有用。Lasso倾向于随机选择其中一个,而弹性网络倾向于选择两个。
  2. 对所选变量的数量没有限制。

五、逻辑斯蒂回归

逻辑回归是加了激活函数sigmoid = 1 / 1+exp(-x),也就是将线性回归的结果映射到0到1上。它的本质就是加上了非线性函数,拟合能力更强。
在这里插入图片描述

# 代码表示:linear_model.LogisticRegression()

六、贝叶斯岭回归

在这里插入图片描述

# 代码表示:linear_model.BayesianRidge()

七、核岭回归

在这里插入图片描述

import numpy as np
from sklearn.kernel_ridge import KernelRidge
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV

rng = np.random.RandomState(0)

X = 5 * rng.rand(100, 1)
y = np.sin(X).ravel()

# Add noise to targets
y[::5] += 3 * (0.5 - rng.rand(X.shape[0] // 5))
# kr = KernelRidge(kernel='rbf', gamma=0.4)
kr = KernelRidge(kernel='sigmoid', gamma=0.4)
kr.fit(X, y)
print(kr.best_score_, kr.best_params_)

X_plot = np.linspace(0, 5, 100)
y_kr = kr.predict(X_plot[:, None])

plt.scatter(X, y)
plt.plot(X_plot, y_kr, color="red")
plt.show()

八、超级调参工具(表格搜索法)

利用模块GridSearchCV,可以找出到模型最优时候的超参数

import numpy as np
from sklearn.kernel_ridge import KernelRidge
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV

rng = np.random.RandomState(0)

X = 5 * rng.rand(100, 1)
y = np.sin(X).ravel()

# Add noise to targets
y[::5] += 3 * (0.5 - rng.rand(X.shape[0] // 5))

# kr = KernelRidge(kernel='rbf', gamma=0.4)
kr = GridSearchCV(KernelRidge(),
                  param_grid={"kernel": ["rbf", "laplacian", "polynomial", "sigmoid"],
                              "alpha": [1e0, 0.1, 1e-2, 1e-3],
                              "gamma": np.logspace(-2, 2, 5)})
kr.fit(X, y)
# print(kr.best_score_, kr.best_params_)

X_plot = np.linspace(0, 5, 100)
y_kr = kr.predict(X_plot[:, None])

plt.scatter(X, y)
plt.plot(X_plot, y_kr, color="red")
plt.show()

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR

rng = np.random.RandomState(0)

X = 5 * rng.rand(100, 1)
y = np.sin(X).ravel()

y[::5] += 3 * (0.5 - rng.rand(X.shape[0] // 5))

svr = GridSearchCV(SVR(kernel='rbf'),
                   param_grid={"C": [1e0, 1e1, 1e2, 1e3],
                               "gamma": np.logspace(-2, 2, 5)})
svr.fit(X, y)
print(svr.best_score_, svr.best_params_)

X_plot = np.linspace(0, 5, 100)
y_svr = svr.predict(X_plot[:, None])

plt.scatter(X, y)
plt.plot(X_plot, y_svr, color="red")
plt.show()

九、回归的评价方法

在这里插入图片描述在这里插入图片描述

十、代码实现

# 普通线性回归
from sklearn import linear_model
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, explained_variance_score

np.random.RandomState(0)

x, y = datasets.make_regression(n_samples=500, n_features=1, n_targets=1, noise=10)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

# 普通线性回归
reg = linear_model.LinearRegression()
# 岭回归
# reg = linear_model.Ridge(0.5)
# LASSO回归
# reg = linear_model.Lasso(0.1)
# 弹性网络
# reg = linear_model.ElasticNet(0.5,0.5)
# 逻辑斯蒂回归
# reg = linear_model.LogisticRegression()
# 贝叶斯回归
# reg = linear_model.BayesianRidge()

reg.fit(x_train, y_train)
# print(reg.coef_, reg.intercept_)

y_pred = reg.predict(x_test)

# 平均绝对误差
print(mean_absolute_error(y_test, y_pred))
# 均方误差
print(mean_squared_error(y_test, y_pred))
# R2 评分
print(r2_score(y_test, y_pred))
# explained_variance
print(explained_variance_score(y_test, y_pred))

_x = np.array([-2.5, 2.5])
_y = reg.predict(_x[:,None])

plt.scatter(x_test, y_test)
plt.plot(_x, _y, linewidth=3, color="orange")
plt.show()

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!