前言:
由于某些原因断了caffe2的学习,又因新任务需要,即日起开始MachineLearning学习。因为有些基础,应快速学完、并理解该课程。
参考:https://github.com/apachecn/vt-cs4624-pyml-zh/blob/master/docs/7.md
交叉验证:
即通过评估模型如何对新数据进行分析来分析模型如何在其自身的训练数据上进行的过程。
- Hold-out:完整数据集直接分两份,一份训练,一份测试
- K折交叉验证:将数据集分K份(即K折),其中有1份是测试数据。
# 实际应用需要做K次试验,取测试结果平均值,更有说服力 - Leave-P-Out 交叉验证(LPOCV):分K份,其中P份测试,K-P份训练,但P的位置由组合得到
# 要做组合次试验,慢 - Leave-One-Out 交叉验证(LOOCV):分K份,其中1份测试,K-1份训练测试点依次往后推
# 可看做K折
代码:见参考网站最下面
- holdout.py 调试成功
- k-fold.py 调试成功
- Leave-p-out.py 调试成功
线性回归
需要的库:
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets, linear_model
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
- 生成随机数据:make_regression(n_samples=500, n_features = 1, noise=25, random_state=0)
- 用seaborn画图,比mat简单:seaborn.regplot(x, y, fit_reg=False),还是用plt.show()显示
- 加载线性模型:regression = linear_model.LinearRegression()
- 训练、预测:regression.fit(), regression.predict()
- 简单非线性、指数数据生成:y = y**2 || y = np.exp((y + abs(y.min())) / 75) || y = np.log(y)
- 成本函数:示例误差函数,平方误差,方差。越小越好
- 线性模型梯度下降:linear_model.SGDRegressor(max_iter=10000, tol=0.001)
过欠拟合
过拟合:当模型从训练数据中学到太多时,就会出现过拟合的情况,结果在实践中表现不佳。 这通常是由于模型过多地暴露于训练数据引起的。
欠拟合:如果模型没有从训练数据中学到足够的知识,则会遭受欠拟合的折磨,结果在实践中表现不佳。 与先前的想法形成直接对比,此问题是由于没有让模型从训练数据中学到足够的知识而引起的。
正则化:
更多地关注前几个特征,并避免过多地关注其他特征。 这是正则化的基本思想。
正则化的目标是通过惩罚更复杂的模型来避免过拟合。 正则化的一般形式涉及在成本函数中增加N个额外项。 因此,如果我们使用成本函数 CF,则正则化可能导致我们将其更改为 CF +λ* R,其中 R 是权重的某些函数(?),而λ是调整参数。 结果是权重较高(更复杂)的模型将受到更多惩罚(即降低模型复杂度)。 λ越高,权重对总成本的影响越小(?)。
常见类型:
- Ridge 回归是一种正则化类型,其中函数 R 涉及求和权重的平方 ,实践代码 特点: 迫使权重接近零,但绝不会为零。 这意味着保留所有特征,但过拟合将被最小化。特征少并且只想避免过拟合时,Ridge 回归 is good。
- LASSO 回归是一种正则化类型,其中函数 R 涉及求和权重的绝对值 ,实践代码 特点:可以强制权重为零。 这意味着我们生成的模型甚至可能不会考虑某些特征!特征太多时好用,而将注意力集中一小部分特征上。
学完后仍存在的问题:代码封装太厉害,文字描述对范数R不够详细。应从底层再了解R的作用原理。解决上面文字的两个“?”
后记:正则化的学习
参考
PolynomialFeatures
PolynomialFeatures是用来生成更多特征的函数。也可以用基础的变换方式生成特征,如x^a,lgx,x1 * x2等
原特征 X,大小是2*5,X = [X1,X2],每列一个特征
X = np.arange(1,11).reshape(-1,2)
经过PolynomiaFeatures(degree=2)处理, 得到
poly = PolynomialFeatures(degree=2)
poly.fit(X)
X2 = poly.transform(X)
使用多特征 X2 训练模型,为了防止过拟合,而使用正则化。为了方便生成数据、正则化、回归,pipline函数将其封装在一起:参数1:生成多项式数据,degree为最高次项。参数2:正则化函数,alpha即 λ*R中的 λ 。
调用的时候sklearn会顺序执行这些步骤,这是sklearn的Pipeline的思想
poly_reg = Pipeline([
('poly',PolynomialFeatures(degree=2)),
('std_scaler',StandardScaler()),
('lin_reg',LinearRegression())
])
or
regModel = Pipeline([
('poly', PolynomialFeatures(degree=10)),
('ridge', Ridge(alpha=5.0))
])
至于
的输入,w是网络的权重,权重衰减的解释引用下面的话:fromhttps://www.jianshu.com/p/569efedf6985
在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为 1−ηλ/n ,因为η、λ、n都是正的,所以 1−ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。