其实前一阵一直在看《机器学习系统设计》,但是发现书上代码不全,不好复现,而且书针对的主要是文字的处理,正好是我最不关心的方向,所以看到一半忍痛弃坑。那么我们开始scikit-learn文档学习的旅程吧。
1. 线性模型
我对于线性模型的理解就是,将一系列的已知点回归到一个线性方程上去,类似于:。之后就可以用这个方程来预测未知点的解了。
sklearn 规定 w0是 intercept_. w1--wp是coef_.
1.1普通最小二乘法
那么如何将已知的点拟合到一个线性方程上去呢?sklearn提供的LinearRegression的思路就是让
点的已知值和预测值的平方和最小,即
.
下面我们直接上例子:
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
diabetes = datasets.load_diabetes()
diabetes_X = diabetes.data[:,np.newaxis,2]
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
regr = linear_model.LinearRegression()
regr.fit(diabetes_X_train, diabetes_y_train) #这里就是在训练模型了
print('Coefficients: \n', regr.coef_) #这就是w0,常数项
print("Residual sum of squares: %.2f" % np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2)) #这个是预测与真实的差
print('Variance score: %.2f' % regr.score(diabetes_X_test, diabetes_y_test)) #这里就是得分,1为拟合最好,0最差
plt.scatter(diabetes_X_test, diabetes_y_test, color = 'black')
plt.plot(diabetes_X_test,regr.predict(diabetes_X_test), color='blue',linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
上图:
这个得分是0.47,果然拟合的不太好呢。
1.2 Ridge regression 岭回归
作为最小二乘法的一个改进,岭回归使用:
其中a>=0,w是一个动态调整的惩罚参数。
我们先上例子:
print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
#构造一个hilbert矩阵10*10
X = 1. / (np.arange(1,11) + np.arange(0,10)[:,np.newaxis])
y = np.ones(10) #10个1
n_alphas = 200
alphas = np.logspace(-10,-2,n_alphas) #等比数列,200个,作为岭回归的系数
clf = linear_model.Ridge(fit_intercept=False)
coefs = []
for a in alphas:
clf.set_params(alpha=a)
clf.fit(X,y)
coefs.append(clf.coef_) #得到200个不同系数所训练出常数参数值
ax = plt.gca()
ax.set_color_cycle(['b', 'r', 'g', 'c', 'k', 'y', 'm'])
ax.plot(alphas,coefs)
ax.set_xscale('log') #转为极坐标系
ax.set_xlim(ax.get_xlim()[::-1]) #反转x轴
plt.xlabel('alpha')
plt.ylabel('weight')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
上图片:
发现了什么?没错,传入岭回归的系数越小,常数项参数的值就越大,惩罚越重。
而且我们发现,在alpha小于10-5时,系数的变化明显变大,所以我们应该选取的值就在10-5附近。
那么这个值怎么自动计算出来呢?
上代码:
clf = linear_model.RidgeCV(alphas = alphas)
clf.fit(X,y)
clf.alpha_
这些代码的作用是输入一系列的alphas,然后sklearn会自动的内部cross验证最终得到最适合的alpha。
1.3 lasso(套索)
她的应用是基于稀疏模型的情况,进行线性拟合,这时的效果较好。那么什么是稀疏模型呢?比如我们采集许多的温度数据,肯定会存在大量的冗余数据,因为温度的变化是缓慢的,稀疏模型就会关注变化的点,而去除同质化的点,从而减少运算量。这个方法其实是压缩感知的基础。不知道压缩感知,
这里有一个好的普及贴。
她要最小化的是:
为了便于理解,我们直接上例子:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
#我们先手动生成一些稀疏数据
print np.random.seed(42)
n_samples, n_features = 50, 200
X = np.random.randn(n_