(四) 回归 预测与对象关联的连续值属性。
应用:药物反应,股票价格。 算法: SVR,岭回归,套索,......
<知识回顾>
机器学习基础
学习问题 通过分析多个数据样本,尝试预测未知数据的属性及特征。
机器学习问题类型
监督学习(supervised learing)
监督学习的经验数据包含有我们想要预测的属性,输入向量与目标值对应,即从已知正确答案的一系列数据中学习经验。
监督学习的分类:
分类(classifcation):样本数据分为多个类。从已标记的数据集里学习如何标记未分类的数据的类别。如手写数字的识别过程。(离散形式监督学习(discrete))
回归(regression):所需输出有一个或多个连续变量组成,即进行回归分析,预测与对象相关联的连续值属性,如分析鱼类年龄和体重的函数。
无监督学习(unsupervised learning)
训练数据由一组输入向量组成,但没有对应的目标值。机器在训练数据中发现规律。
无监督学习的分类:
聚类(clustering):发现数据中类似的示例,将相似对象自动分组
密度估计(denisty estimation):确定输入空间内的数据分布信息
降维(dimensionality reduction):将高维数据降低维度以便数据的可视化,即将原来的数据数遍归类,筛选不必要的信息,减少要考虑的随机变量的数量。
半监督学习(补充)(semi-supervised learning)
介于监督学习与非监督学习之间的学习,增强学习的一种,问题可以通过决策来获得反馈,但反馈于某一决策没有直接关系。
'''
学习和预测
sklearn中,对数据的学习主要是通过.fit(X,y)和predict(T)两个函数实现的
使用手写数字识别作为学习预测的例子:
sklearn中,对分类器的估计是一个python类,通过fit和predict方法实现
估计器的一个示例是sklearn.svm.SVC实现向量分类的类。估算器的构造函数将模型的参数作为参数。
将估算器视为黑盒子,进行黑盒测试:
'''
from sklearn import datasets
from sklearn import svm
iris = datasets.load_iris()
digits = datasets.load_digits()
#clf = svm.SVC(gamma=0.001, C=100.)
#clf.fit(digits.data[:-1],digits.target[:-1])
'''
clf为评估器,它是一个分类器,他必须从模型中学习,通过fit方法完成
其中gamma参数为手动设置.
注意:对于训练集,我们将使用来自数据集的所有图像,除了最后一张图像,我们将保留用于预测。
我们使用[:-1]Python语法选择训练集,该语法生成一个新数组,其中包含除以下项之外的所有项.digits和.data
SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma=0.001, kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
通过训练集得到的数据预测最后一张图片,通过predict方法实现预测。
数据要以集合的形式传入
'''
#clf.predict(digits.data[-1:])
#得到输出
#array([8])
#通过matpoltlib库的imshow方法得到最后一个测试数据的图片
import matplotlib.pyplot as plt
plt.imshow(digits.images[-1], cmap=plt.cm.gray_r) # 变灰色
plt.show()
#最后一个数据的形式
预测还是有一定准确率的
回归(可以理解为拟合)
2.1 普通线性回归
构造回归数据集:
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_regression
# X为样本特征,y为样本输出, coef为回归系数,共1000个样本,每个样本1个特征
x, y, coef = make_regression(n_samples=100, n_features=1, noise=10, coef=True)
print(coef)
# 画图
plt.scatter(x, y)
plt.plot(x, x * coef, color='blue', linewidth=3)
plt.show()
然而,对于普通最小二乘问题,其系数估计依赖模型各项相互独立。当各项是相关的,设计矩阵(Design Matrix) x 的各列近似线性相关, 那么,设计矩阵会趋向于奇异矩阵,这会导致最小二乘估计对于随机误差非常敏感,会产生很大的方差。
2.2 回归评估指标
MAE反映预测值误差的实际情况。
MSE衡量的是样本整体与模型预测值偏离程度。
解释方差指标衡量的是所有预测值和样本之间的差的分散程度与样本本身的分散程度的相近程度。本身是分散程度的对比。最后用1-这个值,最终值越大表示预测和样本值的分散分布程度越相近。
R²分数:
指标解读:因变量的方差能被自变量解释的程度
指标越接近1,则代表自变量对于因变量的解释度越高
2.3 过拟合的问题
w过大,模型不稳定
2.4 岭回归
加了一个正则项,对w进行惩罚,α是超参数表示对w惩罚的力度。当w太小,有可能会使损失无法下降
2.4.1 岭系数对回归系数的影响
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
# X 是10x10的希尔伯特矩阵
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)
print(X)
# 计算不同岭系数时的回归系数
n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)
coefs = []
for a in alphas:
ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
ridge.fit(X, y)
coefs.append(ridge.coef_)
#绘图
ax = plt.gca()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
ax.plot(alphas, coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1])
plt.xlabel('岭系数alpha')
plt.ylabel('回归系数coef_')
plt.title('岭系数对回归系数的影响',)
plt.axis('tight')
plt.show()
2.5 LASSO回归
2.6 弹性网络
L1、L2正则化混用
2.7 逻辑斯蒂回归(原始感知机)
输入数据压缩+L1、L2正则化
本质:加了非线性函数(激活函数)
2.8 贝叶斯岭回归
从贝叶斯的角度看:P(W|x,y)=P(Y|x,w)*P(w)/P(x|y,w)
2.8.1 L1、L2正则化的由来与结论
(1)对参数引入 拉普拉斯先验 等价于 L1正则化。
(2)对参数引入 高斯先验 等价于 L2正则化。
(3)正则化参数等价于对参数引入先验分布,使得模型复杂度变小(缩小解空间),对于噪声以及 outliers 的鲁棒性增强(泛化能力)。整个最优化问题从贝叶斯观点来看是一种贝叶斯最大后验估计,其中正则化项对应后验估计中的先验信息,损失函数对应后验估计中的似然函数,两者的乘积即对应贝叶斯最大后验估计的形式。
2.8.2 代码
# LinearRegression.py
# 普通线性回归
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=100, 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()# 返回w和b
# reg = linear_model.Ridge(0.5)
# 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()
2.9 核岭回归
不激活、多项式、rbf(高斯核、径向基)、Sigmoid
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()
2.10 SVR(支持向量回归)
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 = SVR(kernel='rbf', C=10, gamma=0.1)
svr.fit(X, y)
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()
一、常用的评价指标
1、SSE(误差平方和)
2、R-square(决定系数)
3、Adjusted R-Square (校正决定系数)
二、python中的sklearn. metrics
(1) explained_variance_score(解释方差分)
(2) Mean absolute error(平均绝对误差)
(3)Mean squared error(均方误差)
(4) Mean squared logarithmic error
(5)Median absolute error(中位数绝对误差)
(6) R² score(决定系数、R方)
三、交叉验证在python上的实现